Problem z dodaniem wartosci do listy jednokierunkowej

0

Witam mam problem taki :
stworzyłem wskaźnik do struktury listeczka i nadałem mu adres początkowy NULL. Potem wyołuje funkcje 2 razy z poniższymi parametrami :
dodaj(lista, 123);
dodaj(lista, 22);

początek funkcji
parametr current = 000000 ; // zgadza się

konczac funkcje current posiada 004E48E8 wiec mnie wiecej wszystko sie zgadza

potem drugie wywołanie
i znowu current ma adres = 000000000

a konczac fnkcje 004E48F8
ma ktoś pomysł czemu nie działa ??

 
#include <stdio.h>
#include <stdlib.h>

struct listeczka
{
 	   int                wartosc;
 	   struct listeczka   *next;
};

void wypiszmiejsce(struct listeczka *head)
{
 	 struct listeczka * current;
 	 current=head;

 	 if(current == NULL)
 	 {

 		while (current != NULL)
 	    {
 	 	 	  printf ("element %d  \n", current->wartosc);
 	 		  current = current->next;
	    }

	 }

	  	 printf("\n twoja lista jest pusta pi");
}

  int sprawdzac(struct listeczka *headd, int a)

  {   struct listeczka *current;
  	   current=headd;
   	   while (current != NULL)
   	  {
	   		 if (a == current->wartosc)
			 {
	   		 return 1;
			 }
		current = current->next;
	  }
	  return 0;
  }

void dodaj(struct listeczka *headik, int x )
{
struct listeczka *current;
struct listeczka *nowy;
current = headik;
nowy = malloc(sizeof(struct listeczka));
printf("adres current przed nadaniem mu nowego adresu%p\n", current);

	 if(current == NULL)
	 {
	  	printf("\nJSTEM TUTAJ1");
	  	nowy->wartosc=x;
	  	current=nowy;
	  	nowy->next=NULL;
  		printf("\nJSTEM TUTAJ1,5");
     }
     else
     {
      printf("\nJSTEM TUTAJ2");
   	  	 while (current->next != NULL)
   		 {
   		  	   current=current->next;
	     }
     	 nowy->wartosc = x;
     	 current->next = nowy;
     	 nowy->next=NULL;

	 }

printf("current po nadaniu adresu %p\n", current);
}




int main()
{

struct listeczka *lista = NULL;
//lista = malloc(sizeof(struct listeczka));
//lista = NULL;

struct listeczka *head1;
head1 = malloc(sizeof(struct listeczka));

struct listeczka *head2;
head2 = malloc(sizeof(struct listeczka));

struct listeczka *head3;
head3 = malloc(sizeof(struct listeczka));

struct listeczka *head4;
head4 = malloc(sizeof(struct listeczka));

head1->wartosc=666;
/*printf("wyswietalmy wartoscv listy z wagonika 1    %d\n", head1->wartosc ); */
head1->next=head2;
head2->wartosc=3;
head2->next = head3;
/*printf("wyswietalmy wartoscv listy z wagonika 1    %d\n", (head1->next)->wartosc ); */
head3->wartosc=9999;
head3->next=head4;
/* printf("wyswietalmy wartoscv listy z wagonika 1    %d\n", (head2->next)->wartosc ); */
head4->wartosc=69;
head4->next=NULL;


wypiszmiejsce(lista);
dodaj(lista, 123);
dodaj(lista, 22);
wypiszmiejsce(lista);

/*
dodaj(lista, 3322);
dodaj(lista, 322);
dodaj(lista, 622);*/
/*wypiszmiejsce(head1);*/

/*
if (sprawdzac(head1, 69) == 0)
  {
	printf("nie znaleziono \n");
  }
  else
  printf(" znaleziono \n");

*/
}

0

??

0

Ech bo chcesz zmienić głowę listy, a żeby to zrobić musisz do funkcji przekazać struct listeczka ** head
Czemu wskaźnik na wskaźnik? Bo pamiętaj że wewnąrz funkcji pracujesz na lokalnej kopii. Dużo ludzi się w tym gubi. Patrzmy więc na przykład:

void funkcja (int argument){
  argument = argument +1;
}

int main(){
  int x = 10;
  funkcja(x);
}

Jaką wartość ma wg ciebie zmienna x po takiej operacji? Otóż nadal ma wartość 10, bo do funkcji przekazywana jest jedynie wartość tej zmiennej i wewnątrz funkcji pracujemy na lokalnej kopii. A teraz drugi przykład:

void funkcja (int* argument){
  *argument = *argument +1;
}

int main(){
  int x = 10;
  funkcja(x);
}

Ile teraz wynosi x? Otóż wynosi 11, bo do funkcji przekazaliśmy informację o adresie pod którym jest zmienna X i potem zmieniliśmy wartość pod tym adresem, w efekcie zmieniliśmy oryginał!

Ty w swoim przypadku też chciałbyś zmienić oryginał zmiennej, a mimo to przekazujesz tam jedynie kopię i stąd też zmiana nie zachodzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1