Problem z implementacją listy

0

Witam.
Próbuje zaimplementować prostą listę jednokierunkową. Zrobiłem to w taki sposób:

<code = c>
struct list
{
int val;
list* prev;
};

void add(list *L, int n);
void show(list L);
int _tmain(int argc, _TCHAR
argv[])
{
list *lista = new list;
int ch = 0;
while(ch != -1)
{
scanf("%d", &ch);
add(lista, ch);
};
show(lista);
return 0;
}

void add(list L, int n)
{
list
next = new list;
next->prev = L;
next->val = n;
L = next;
}

void show(list *L)
{
while(L->val != NULL)
{
printf("%d\n",L->val);
L = L->prev;
}
}


Niestety nie działa to jak powinno i nie za bardzo jestem to w stanie zrozumieć. Wewnątrz funkcji add() wszystko jest ok. Pod sam koniec działania wskaźnik L wskazuje na jakąś strukture a w tej strukturze wskaźnik prev wskazuje na tą poprzednią.
Jednak zaraz po wyjściu z metody wskaźnik lista->prev wskazuje na losowe, niepoprawne miejsce w pamięci i wysypuje się w przypadku gdy spróbuje zajrzeć do środka.

Czy byłby ktoś tak miły i wyjaśnił mi czemu?
0

na pewno pokazywanie listy jest źle, powinno być tak:

void show(list *L)
{
        while(L!= NULL)
        {
                printf("%d\n",L->val);
                L = L->prev;
        }
}

reszty nie patrzę :P

0

Dziękuje za odpowiedź. Masz oczywiście rację, że tam był błąd - już go poprawiłem.
Problem jednak o który pytam jest dużo wcześniej. Przykładowy przebieg programu:
user image
-1 to ostatnia wpisana wartość. Te śmieci to pierwsza wypisana wartość...

0

Podpowiedź: ile obiektów klasy list zostanie utworzonych w funkcji _tmain ?

0

Dziękuję za pomoc.
Problemem okazało się to, że błędnie przekazywałem parametry do funkcji. Poprawne rozwiązanie (może się komuś przyda):

struct list
{
	int val;
	list* prev;
};
void add(list **L, int n)
{
	list *temp = new list;
	temp->val = n;
	temp->prev = *L;
	*L = temp;
}
void show(list *L)
{
	printf("Printing....\n");
		while(L->prev != NULL)
        {
                printf("%d\n",L->val);
                L = L->prev;
        }
}
int _tmain(int argc, _TCHAR* argv[])
{
	list *L = new list;
	L->prev = NULL; // This is tail
	int ch = 0;
	while(ch != -1)
	{
		scanf("%d", &ch);
		add(&L, ch);
	}
	show(L);
        return 0;
}

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