• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista jednokierunkowa C

0 głosów
2,836 wizyt
pytanie zadane 20 października 2019 w C i C++ przez kalczur Gaduła (4,320 p.)

Witam,
chcę napisać proste operacje na listach w C i posiadam program ale mam problem ze zrozumieniem jego działania.
Posiadam strukturę zdefiniowaną w ten sposób 
 

typedef struct N{
    int data;
    struct N* next;
}N;

typedef N* node;

następnie tworzę listę i wywołuję funkcje do dodania na początek i na koniec listy.
 

    node lista = NULL;

    dodajP(&lista, 10);
    dodajP(&lista, 16);
    dodajK(&lista, 20);

    show(lista);

I tutaj mam te dwie funkcje 

void dodajP(node *head, int y)
{
    node temp = malloc(sizeof(N));
    temp->data = y;
    temp->next = *head;
    *head = temp;
}


void dodajK(node *head, int y)
{
    node temp = malloc(sizeof(N));
    temp->data = y;
    temp->next = NULL;
    while(*head != NULL)  head = &((*head)->next);
    *head = temp;
}

Prosiłbym o wyjaśnienie czym jest: 

head
*head
&((*head)->next)

w środku tych funkcji.

1 odpowiedź

0 głosów
odpowiedź 20 października 2019 przez Munvik Dyskutant (9,350 p.)
head to wskaźnik na początek listy
*head to obiekt node

&((*head)->next) to adres pamięci wskaźnika na następnego node'a, przy czym tutaj to jest bez sensu bo to tak jakbyś zainicjował wskaźnik i próbował dostać adres tego wskaźnika. Nie mylić z adresem z pod wskaźnika.
komentarz 20 października 2019 przez tkz Nałogowiec (42,040 p.)
&(*head)->next przypisuje do head siebie, modyfikuje wskaźnik, a nie rzecz, na którą wskazuje. Oznacza to przeskakiwanie do przodu na liście, bez jej modyfikowania.
komentarz 20 października 2019 przez kalczur Gaduła (4,320 p.)
Więc dopóki wartość obiektu node będzie różna od zera to wskaźnik na początek listy będzie przyjmował adres pamięci wskaźnika na następnego nodea. Po wyjściu z pętli obiekt node( który jest pusty ) zostanie zastąpiony tym stworzonym wyżej.
Nie jestem w stanie zrozumieć jak to działa...
W jaki sposób poprzedni element listy widzi ten dodany na końcu?

Przykład przepisałem od wykładowcy ( skompilowałem i działa ) i niby tak to mamy to robić.
komentarz 20 października 2019 przez Munvik Dyskutant (9,350 p.)

@tkz,

Więc wytłumacz różnice miedzy 

&((head)->next)

a

&((*head)->next)

komentarz 20 października 2019 przez tkz Nałogowiec (42,040 p.)
Jak już to (*head)->next;, zamiast &((head)->next). To &((head)->next) nie ma sensu. (*head)->next przypisuje do jakiegokolwiek head wskazuje, która jest albo oryginalnym wskaźnikiem head, wskaźnikiem, do którego przekazywana jest funkcja, albo kolejnym z wcześniejszego node. Zmieniamy to, na co wskazuje, a wskaźnik pozostaje taki sam. Sprowadza się to do usunięcia z listy (i powstania wycieku pamięci w procesie).
komentarz 21 października 2019 przez niezalogowany
edycja 21 października 2019
typedef struct N{ }N;?(znaczy się działa, ale trochę to nie czytelne) tu trochę jaśniej: https://www.learn-c.org/en/Linked_lists

edit:: tylko N** zamiast typedef N* node;

edit:: w sumie łatwiej jest  napisać dodajP(&lista, 16); dodajK(&lista, 20); zamiast dodajP(&lista, 16); dodajK(lista, 20); Można się dodatkowo pobawić w wyłuskane adresu &((*head)->next);

Podobne pytania

0 głosów
4 odpowiedzi 1,649 wizyt
pytanie zadane 13 października 2018 w C i C++ przez Kurczak Użytkownik (940 p.)
0 głosów
1 odpowiedź 790 wizyt
0 głosów
1 odpowiedź 756 wizyt
pytanie zadane 5 grudnia 2019 w C i C++ przez disi22 Początkujący (300 p.)

93,740 zapytań

142,675 odpowiedzi

323,294 komentarzy

63,319 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...