C wczytywanie danych z pliku na liste.

0

Witam.
Jak w temacie mam problem z lista. Program ladnie przypisuje dane z listy [nie wyskakuje zaden blad], ale juz potem nie radzi sobie z wypisaniem wszystkich elementow. Podejrzewam, ze po prostu niepoprawnie ustawiam wskazniki (nie mam pojecia jak powrocic na poczatek listy).
Oto kod:

   
   #include <stdio.h>

    struct towar
    {
    int id_t;
    char *nazwa;
    float cena;
    int vat;
    int status;
    struct towar*nastt;
    };



typedef struct towar EL_LISTYT;
typedef EL_LISTYT *WSKAZ_TOWAR;


main()
{
    char c;
    int i=0, j;
       WSKAZ_TOWAR wt, w=wt;

    FILE*t;
    t=fopen("towary.txt", "r");

    while((c=fgetc(t))!=EOF)
    {
        if(c=='\n') ++i;
    }

    fclose(t);

    t=fopen("towary.txt", "r");


   for(j=0; j<i; j++)
   {

        wt=(WSKAZ_TOWAR)malloc(sizeof(EL_LISTYT));
        (wt->nazwa)=malloc(20*sizeof(char));
        fscanf(t, "%d", &wt->id_t);
        fscanf(t, "%s", wt->nazwa);
        fscanf(t, "%f", &wt->cena);
        fscanf(t, "%d ", &wt->vat);
        wt->nastt=NULL;
        wt=wt->nastt;

   }
   fclose(t);
   
   

    printf("\nOto lista towarow: ");
    for(j=0; j<i; j++)
     {
        printf("\n%d ", w->id_t);
        printf("%s ", w->nazwa);
        printf("%.2f ", w->cena);
        printf("%d\n", w->vat);
        w->nastt=NULL;
        w=w->nastt;
     }

return 0;
}

 
0
        wt->nastt=NULL;
        wt=wt->nastt;

czyli wt=NULL;

nadpisujesz wt, gubisz struktury, czyli nie tworzysz listy

0

Hmm... Wiec w jaki sposob przejsc na nastepny element listy tak, aby umiescic na niej dane z nastepnej linii tekstu w pliku? Dla jasnosci:

 
	fscanf(t, "%d", &wt->id_t);
        fscanf(t, "%s", wt->nazwa);
        fscanf(t, "%f", &wt->cena);
        fscanf(t, "%d ", &wt->vat);

To czytanie dokladnie jednej linii pliku. Sadzilam, ze

 wt=wt->nastt;

to wlasnie przejscie na nastepny element, a musi sie rownac NULL, aby mozna bylo z niego korzystac. Czyli wystarczy wykasowac linijke z NULLem? I stworzyc wt->nastt=NULL

 po zakonczeniu petli?
0

A w jaki sposob wskazac na nastepny element?

0

ja bym proponował tradycyjnie rozrysować sobie na kwadracikach i strzałkach co dokładnie chcesz zrobić

a podpowiedź brzmi:

a=malloc();
b->n=a;
b=a;
b ... //uzupełniasz
0

Tylko, ze przypisanie dziala poprawnie. Sprawdzilam to w ten sposob:

    
for(j=0; j<i; j++)
   {

        wt=(WSKAZ_TOWAR)malloc(sizeof(EL_LISTYT));
        (wt->nazwa)=malloc(20*sizeof(char));
        fscanf(t, "%d", &wt->id_t);
        fscanf(t, "%s", wt->nazwa);
        fscanf(t, "%f", &wt->cena);
        fscanf(t, "%d ", &wt->vat);
        printf("\n%d ", wt->id_t);
        printf("%s ", wt->nazwa);
        printf("%.2f ", wt->cena);
        printf("%d\n", wt->vat);

        wt=wt->nastt;

   }

Wiec podejrzewam, ze blad jest wylacznie w:

     
for(j=0; j<i; j++)
     {
        printf("\n%d ", w->id_t);
        printf("%s ", w->nazwa);
        printf("%.2f ", w->cena);
        printf("%d\n", w->vat);
        w=w->nastt;
     }

Jak juz pisalam nie umiem powrocic na poczatek listy. Chyba, ze jestescie pewni na 100% powiazania wskaznika wt ze wskaznikiem w, ktore zrobilam czysto intuicyjnie.

0

przypisania nie kwestionuję :) kwestionuję to, że tworzysz listę :p spróbuj przerobić w/g tego schematu co napisałem

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