Lista łączona nie wypisuje poprawnie

0

Mam strukturę:

  typedef struct elem {
   struct elem *next;
   void* dane;
   } elem_t; 

Zacząłem piasć program w Code::Blocks (kompilator GNU GCC), który tworzy listę pojedynczo łączoną i wykonuje na niej podstawowe operacje.

Nie działa poprawnie funkcja wypisz, tzn. wypisuje stałą dużą liczbę.

 void wypisz_liste(elem_t* e){

if(!e) printf("Lista jest pusta.\n");
elem_t *this=NULL;
this=e;
while (this)
{
    //this->dane = (int*) this->dane;
    printf ("%d\t", *((int*)(this->dane)));


    this = this->next;
}
}

W funkcji tworzącej węzeł wypisuję wpisane dane i to działa poprawnie, wypisuje kolejne liczby naturalne:

 void  dodaj_element( elem_t** e, void* dane)
  {
    elem_t *this=NULL;

    if (*e)
  {

    this=*e;
    while(this->next)
    {
      this=this->next;
    }

    this->next = (elem_t*)malloc(sizeof(elem_t));

    this->next->dane=dane;

    this->next->next=NULL;
    printf("%d\t", *((int*)(this->next->dane)));


  }
    else
    {

	(*e)=(elem_t*)malloc(sizeof(elem_t));
	(*e)->dane=dane;
	(*e)->next= NULL;
	printf("%d\n", *((int*)((*e)->dane)));
	printf("Utworzylem pierwszy wezel\n");
    }

  } 

Efekt można zaobserwować kompilując i uruchamiając kod źródłowy z załączników.

0

Dodaję paczkę z plikami w .c i .h . Program jest już bardziej rozwinięty i może bardziej czytelny, także w czasie wykonania. Można spróbować wybrać buduj listę,
a zaraz potem wypisz elementy i będzie widać na czym polega mój problem.

0

Masz problem z projektem. Dodajesz do listy zawsze adres jednej konkretnej zmiennej ze stosu. Więc nie ma co się dziwić.

0

Też myślę, że tak jest. Tylko jak to zmienić?

1
  typedef struct elem {
   struct elem *next;
   int dane;
   } elem_t;
dodaj_element(e, dane);

lub:

int *dane;
dane=(int*)malloc(sizeof(int));
*dane=i;
dodaj_element(e,dane);

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