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

Zadanie Struktury Język C

Cloud VPS
0 głosów
269 wizyt
pytanie zadane 30 sierpnia 2022 w C i C++ przez benny13 Obywatel (1,150 p.)

Cześć, mam problem z zadaniem ze struktur w języku C, wiem jak się za nie zabrać, lecz nie mam pojęcia, co dzieje się w wyniku działania programu.

Podać wartości, które zostaną wyświetlone na ekranie po wykonaniu poniższego programu. Zachować kolejność.

#include <stdio.h>

#include <stdlib.h>

struct wezel {
  int dane;
  struct wezel * nastepny;
};
int main(void) {
  int k;
  struct wezel * p, * q;
  p = NULL;
  for (k = 1; k < 5; ++k) {
    q = malloc(sizeof(struct wezel));
    q -> dane = 2 * k;
    q -> nastepny = p;
    p = q;
  }
  while (q != NULL) {
    printf("%d ", q -> dane);
    q = q -> nastepny;
  }
  return 0;
}

Prosiłbym o wytłumaczenie, skąd co się bierze. Dziękuję :)

1 odpowiedź

+1 głos
odpowiedź 30 sierpnia 2022 przez Whiskey_Taster Pasjonat (15,610 p.)
wybrane 30 sierpnia 2022 przez benny13
 
Najlepsza

Ogółem masz tu coś w rodzaju listy jednokierunkowej. W Twojej strukturze masz dwa pola: jeden na dane, drugi na referencję do obiektu będącego Twoją strukturą. O tych referencjach pomyśl jak o wagonikach - możesz doczepić wagonik (ustawić referencję na inny obiekt typu wezel*, albo możesz odczepić wagonik (wtedy referencja jest na NULL, czyli wskaźnik pusty). 

W tym przypadku jednak doczepianie wagoników nie odbywa się od początku, a tak jakby od końca, bo pierwszy wagonik, który tworzysz (czyli pierwsze wykonanie pętli) będzie miał referencję do następnego obiektu na NULL (innymi słowy następny wagonik będzie pustym wagonikiem - czyli tak, jakby go nie było). 

W kolejnych krokach można by to opisać tak (L:X <- L - linia, X - numer linii w Twoim programie):
L:14 -> przydzielasz pamięć na wszystkie pola (tworzysz wagonik)
L:15 -> pole dane ustawiasz na konkretną wartość poprzez operator dostępu (->) (innymi słowy do wagonika coś wrzucasz)
L:16 -> do pola nastepny dodajesz referencję na inny obiekt (czyli de facto podczepiasz inny wagonik)
L:17 -> tutaj istotna część: Twoim następnym obiektem (wagonikiem) jest obiekt (wagonik), który już utworzyłeś. Logiczne, prawda? Mamy już jeden wagonik i chcemy, by był on następnym wagonikiem dla innego wagonika. Stąd to przypisanie wskaźnika. Innymi słowy, na koniec pętli wskaźnik p wskazuje na wagonik, który utworzyliśmy. 

I teraz powtarzamy to, co zrobiliśmy. Na koniec wypisywanie informacji. Zauważ, że kolejka była tworzona od tyłu, czyli jakbyśmy mieli to zobrazować poprzez numerację wagoników, to byśmy mieli 
(pierwsze wykonanie pętli) 1 -> NULL
(drugie wykonanie pętli) 2 -> 1 -> NULL
(czwarte wykonanie pętli) 4 -> 3 -> 2 -> 1 -> NULL, 
gdzie q na koniec pierwszej pętli wskazuje na wagonik nr 4. I teraz odczytujemy kolejne wagoniki. 

W razie pytań - pytaj śmiało. 

komentarz 30 sierpnia 2022 przez benny13 Obywatel (1,150 p.)
Dzięki za tak szczegółową odpowiedź ! ;)

Podobne pytania

0 głosów
2 odpowiedzi 549 wizyt
pytanie zadane 8 czerwca 2023 w C i C++ przez whiteman808 Gaduła (4,800 p.)
0 głosów
2 odpowiedzi 685 wizyt
pytanie zadane 11 września 2020 w C i C++ przez Kytrap Początkujący (390 p.)
0 głosów
1 odpowiedź 202 wizyt
pytanie zadane 19 kwietnia 2021 w C i C++ przez MrChick888 Obywatel (1,020 p.)

93,454 zapytań

142,449 odpowiedzi

322,718 komentarzy

62,833 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

Kursy INF.02 i INF.03
...