Lista łączona

0

Witam,
Będę wdzięczny jeśli ktoś zerknie na mój kod. Próbuję napisać program, który dodaje elementy do listy łączonej w funkcji. Większość błędów udało mi się usunąć samemu, jednak nie mam pomysłu jak usunąć coś takiego:
lista.c14: error: request for member ‘nast’ in something not a structure or union
błąd odnosi się do warunku pętli while w funkcji dodaj.

Chętnie posłucham też innych uwag na temat mojego programu. Nie jestem do końca pewny czy nie zawiera innych błędów, których nie zauważył kompilator.

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

struct lista{
	int identyfikator;
	struct lista * nast;
};

void inicjuj(struct lista ** wsk);
void dodaj(struct lista ** wsk, int id);

int main(void){
	struct lista * glowny;
	inicjuj(&glowny);
	dodaj(&glowny, 5);
	dodaj(&glowny, 10);
	return 0;
}

void inicjuj(struct lista ** wsk){
	*wsk = NULL;
}

void dodaj(struct lista ** wsk, int id){
	struct lista * nowy;
	nowy = (struct lista*)malloc(sizeof(struct lista));
	nowy -> nast = NULL;
	nowy -> identyfikator = id;
	if(*wsk == NULL)
		*wsk = nowy;
	else{
		while(*wsk -> nast != NULL)
			*wsk = (*wsk) -> nast;
		(*wsk) -> nast = nowy;
	}
}
0
  1. Nie łaska podać w której linii jest błąd?
  2. Raz wiesz jaki masz priorytet operatorów a raz nie? o_O
while(*wsk -> nast != NULL)
  *wsk = (*wsk) -> nast;
(*wsk) -> nast = nowy

Widzisz różnicę? Dwa razy masz

(*wsk)->

a raz masz

*wsk->

Operator -> ma priorytet wyższy niż * w efekcie skoro najpierw chcesz wykonać dereferencje to musisz to objąć w nawias.

0

Błąd był w 43. linijce, widać to w komunikacie kompilatora. Faktycznie, chyba przez nieuwagę nie wstawiłem tam nawiasu. Teraz działa bez problemu. Mam tylko jeszcze jedno pytanie. Napisałem taka funkcję do wyświetlania elementów listy:

void wyswietl(struct lista ** wsk){
	struct lista * temp;
	temp = *wsk;
	while(temp != NULL){
		printf("%d\n", temp -> identyfikator);
		temp = temp -> nast;
	}
}

Okazało się jednak, że wyświetla ona tylko dwa ostatnie elementy z listy. Problem pewnie jest w tym, że funkcja dodaj zmienia wartość wskaźnika głównego, przez co tracę dostęp do wcześniejszych elementów. Postanowiłem więc w funkcji dodaj umieścić kolejny wskaźnik:

 void dodaj(struct lista ** wsk, int id){
	struct lista * biezacy;
	struct lista * nowy;
	biezacy = *wsk;
	nowy = (struct lista*)malloc(sizeof(struct lista));
	nowy -> nast = NULL;
	nowy -> identyfikator = id;
	if(biezacy == NULL)
		biezacy = nowy;
	else{
		while(biezacy -> nast != NULL)
			biezacy = biezacy -> nast;
		biezacy -> nast = nowy;
	}
}

Program kompiluje się bez żadnych komunikatów. Po uruchomieniu pojawia się jednak "Naruszenie ochrony pamięci". Nie mam pojęcia gdzie może leżeć błąd.

0

Nikt nie jest mi w stanie pomóc? W internecie niestety nie mogę znaleźć nigdzie rozwiązania tego problemu...

0

Hej,

blad masz w funkcji dodaj(...). Twoj wskaznik

struct lista * biezacy

jest zmienna lokalna na stosie i zostanie usuniety po wyjsciu z dodaj(). Najprosciej bedzie tak:

void dodaj(struct lista ** wsk, int id){
    struct lista * biezacy;
    struct lista * nowy;
    biezacy = *wsk;
    nowy = (struct lista*)malloc(sizeof(struct lista));
    nowy -> nast = NULL;
    nowy -> identyfikator = id;
    if(biezacy == NULL)
        *wsk = nowy;
    else{
        while(biezacy -> nast != NULL)
            biezacy = biezacy -> nast;
        biezacy -> nast = nowy;
    }
}

Pozdrawiam,

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