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.c:43:14: 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, botów: 0