Niepoprawne wyświetlanie zawartości listy jednokierunkowej

0

Cześć Wam!

Problem polega na tym, że wyświetlana jest tylko ostatnio dodana zawartość, a reszta, to jakieś krzaki...
Wskazówki będą bardzo mile widziane :-)

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

struct Element
{
	char *Text;
	struct Element *next;
};
void dodaj (struct Element *lista)
 {
   struct Element *wsk, *nowy;
   wsk = lista;
   char buf[BUFSIZ];
   printf("No dawaj: ");
   fgets(buf, (int)sizeof(buf), stdin);
   while (wsk->next != NULL) {
   		wsk = wsk->next;
   }
   nowy = malloc (sizeof(struct Element));
   nowy->Text = buf;
   nowy->next = NULL;
   wsk->next = nowy;
 }
 
 void wypisz(struct Element *lista)
 {
   struct Element *wsk=lista;
   while( wsk != NULL ){
	   printf ("%s\n", wsk->Text);
	   wsk = wsk->next;
   }
 }
int main(void)
{
	struct Element *lista;
	lista = malloc (sizeof(struct Element));
	lista->next=NULL;
	dodaj(lista);
	dodaj(lista);
	wypisz(lista);	
return 0;
}
 
0
  1. nowy->Text=strdup(buf);
  2. Nie powinieneś przydzielać pamięć pod nie istniejący element.
  3. Nie powinieneś przynajmniej jego wyświetlać.
  4. Jeżeli chcesz dodawać na koniec to stwórz dodatkowy wskaźnik na ostatni element.
  5. Najprościej dodać dodatkową strukturę: typedef struct List { struct Element *head,*tail; } List; i tą strukturę przekazywać do funkcji.
0

Teraz to już mi nic nie wychodzi. Wyrzuca mi jakieś ostrzeżenia dot. "strdup()". Jeżeli usunę którykolwiek malloc, to program się sypie. Dodawać chcę na początek, ale tak czy siak szlag niech to trafi, bo nic kompletnie nie wychodzi...
Teraz mam coś takiego (prawie nic się nie zmieniło oczywiście):

 
#include <stdio.h>
#include <stdlib.h> 
 
struct Element
{
    char *Text;
    struct Element *next;
};

void dodaj (struct Element *lista)
 {
   struct Element *nowy;
   char buf[BUFSIZ];
   printf("No dawaj: ");
   fgets(buf, (int)sizeof(buf), stdin);
   nowy = malloc (sizeof(struct Element));
   nowy->Text = buf;
   nowy->next = lista;
 }
 
 void wypisz(struct Element *lista)
 {
   while(lista){
       printf ("%s\n", lista->Text);
       lista = lista->next;
   }
 }
 
int main(void)
{
    struct Element *lista;
    lista = malloc (sizeof(struct Element));
    lista->next = NULL;
    dodaj(lista);
    dodaj(lista);
    wypisz(lista);    
return 0;
}
0

Dla mądrych inaczej powtarzam:

  1. nowy->Text=strdup(buf); - jak podaje ostrzeżenie to szukasz w google
  2. Nie powinieneś przydzielać pamięć pod nie istniejący element.
  3. Nie powinieneś przynajmniej jego wyświetlać.
  4. Jeżeli chcesz dodawać na koniec to stwórz dodatkowy wskaźnik na ostatni element.
  5. Najprościej dodać dodatkową strukturę: typedef struct List { struct Element *head,*tail; } List; i tą strukturę przekazywać do funkcji.
0
#include <stdio.h>
#include <stdlib.h> 
 
struct Element
{
    char *Text;
    struct Element *next;
};
 
void dodaj (struct Element *lista)
 {
   struct Element *nowy;
   char buf[BUFSIZ];
   printf("No dawaj: ");
   while(lista->next != NULL) {
    lista = lista->next; 
   }
   fgets(buf, (int)sizeof(buf), stdin);
   nowy = malloc (sizeof(struct Element));
   nowy->Text=strdup(buf);
   lista->next = nowy;
 }
 
 void wypisz(struct Element *lista)
 {
   while(lista -> next){
       printf ("%s", lista->next->Text);
       lista = lista->next;
   }
 }
 
int main(void)
{
    struct Element *lista;
    lista = malloc (sizeof(struct Element));
    lista->next = NULL;
    dodaj(lista);
    dodaj(lista);
    wypisz(lista);    
return 0;
}

Na podstawie drugiej wersji którą wrzuciłeś. O coś takiego Ci chodziło? Tak miało wypisywać?

0

To wyliczanie to nie jedno z, to wszystko naraz trzeba dokonać.

  1. Nie powinieneś przydzielać pamięć pod nie istniejący element.
  2. Nie powinieneś przynajmniej jego wyświetlać.
  3. Jeżeli chcesz dodawać na koniec to stwórz dodatkowy wskaźnik na ostatni element.
  4. Najprościej dodać dodatkową strukturę: typedef struct List { struct Element *head,*tail; } List; i tą strukturę przekazywać do funkcji.

No chyba że potrzebujesz jedynie gotowca, wtedy wystarczy powiedzieć i @madmike tym się zajmie z cała pewnością.

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