Problem z dodaniem wartosci do listy jednokierunkowej

Prozak
2012-02-05 13:54
Prozak
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");

*/
}
edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

Prozak
2012-02-05 16:49
Prozak
0

??

Pozostało 580 znaków

2012-02-05 17:05
Moderator

Rejestracja: 16 lat temu

Ostatnio: 10 godzin temu

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.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2012-02-05 17:06

Pozostało 580 znaków

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