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

Lista jednokierunkowa C

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
2,264 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,020 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,020 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,169 wizyt
pytanie zadane 13 października 2018 w C i C++ przez Kurczak Użytkownik (940 p.)
0 głosów
1 odpowiedź 596 wizyt
0 głosów
1 odpowiedź 516 wizyt
pytanie zadane 5 grudnia 2019 w C i C++ przez disi22 Początkujący (300 p.)

93,176 zapytań

142,185 odpowiedzi

321,979 komentarzy

62,506 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1401p. - dia-Chann
  2. 1380p. - Łukasz Piwowar
  3. 1372p. - CC PL
  4. 1370p. - Łukasz Eckert
  5. 1351p. - Tomasz Bielak
  6. 1328p. - Michal Drewniak
  7. 1312p. - Łukasz Siedlecki
  8. 1302p. - rucin93
  9. 1273p. - Adrian Wieprzkowicz
  10. 1232p. - Mikbac
  11. 1181p. - rafalszastok
  12. 1169p. - Grzegorz Aleksander Klementowski
  13. 1155p. - Piotr Aleksandrowicz
  14. 1149p. - Michał Telesz
  15. 1127p. - Mariusz Fornal
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...