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

Lista jednokierunkowa C

VPS Starter Arubacloud
0 głosów
1,885 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,000 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,000 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 723 wizyt
pytanie zadane 13 października 2018 w C i C++ przez Kurczak Użytkownik (940 p.)
0 głosów
1 odpowiedź 439 wizyt
0 głosów
1 odpowiedź 359 wizyt
pytanie zadane 5 grudnia 2019 w C i C++ przez disi22 Początkujący (300 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...