Błąd dodawania do listy jednokierunkowej

0

Fragment main:

for(int i=0; i<3; i++)
    {
    	
        dodaj(poczatek, i*i);
    }
    wyswietlliste(poczatek);
 
void dodaj(element *poczatek, int i)
{
        if(poczatek == NULL)
        {
            poczatek = (element *)malloc(sizeof(element));
            poczatek->nastepny = NULL;
            poczatek->id = i;
        }
        else
        {
            element *tmp, *nowy;
            tmp = poczatek;
            while(tmp->nastepny!=NULL)
            {
                tmp = tmp->nastepny;
            }
            nowy = (element *)malloc(sizeof(element));
            nowy->id = i;
            nowy->nastepny = NULL;
            tmp->nastepny = nowy;
        }
}
void wyswietlliste(element *poczatek)
{
	if(poczatek == NULL)
		printf("Lista jest pusta");
	else
	{
		printf("Wyswietlanie listy\n");
		element *tmp;
		tmp = poczatek;
		int x=1;
		while(tmp!=NULL)
		{
			printf("%d. element listy\n");
			printf("id=%d nazwa=%s", tmp->id);
		}
	}
} 
typedef struct lista
{
    int id;
    struct lista * nastepny;
} element; 

Dlaczego wyświetla się "Lista jest pusta"?

0

Dzieje się tak z tego samego powodu z jakiego poniższy kod wyświetla 0.

#include <stdio.h>

void foo(int i) { i=666; }
int main()
  {
   int x=0;
   foo(x);
   printf("%d\n",x);
   return 0;
  }
1

Najprostszy fix:

element* dodaj(element* poczatek, int i)
{
    ...
    return poczatek;
}

int main()
{
   ...
   poczatek = dodaj(poczatek, i*i);
}

Ale Twój kod i tak ma inne bugi (w ogóle się dziwię, że się kompiluje):

while(tmp!=NULL)
{
    printf("%d. element listy\n");
    printf("id=%d nazwa=%s", tmp->id);
}

Gdzie tmp przechodzi do następnego elementu? Do tego brakujące argumenty printf.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.