⛓️💥 Úloha 8.5
Napíšte program, zdrojový kód, v jazyku C použitím štandardu C17, ktorý implementuje jednoduchý zreťazený zoznam pomocou štruktúr.
Každý prvok zoznamu by mal obsahovať celé kladné číslo a pointer na ďalší prvok. Program umožní používateľovi cez štandardný vstup zadať číslo prvku zoznamu. Po zadaní vstupu je nový prvok pridaný na koniec zoznamu a následne vypíše celý aktuálny zoznam a znova ponúkne používateľovi zadať ďalší prvok. Program končí ak používateľ na vstupe zadá hodnotu -1.
Important
Nezabudnite uvoľniť pamäť alokovanú pre jednotlivé prvky zoznamu na konci programu!
Príklady vstupov / výstupov programu
Priebeh programu môže vyzerať nasledovne:
---
Zadajte hodnotu prvku: 1
Aktuálny zoznam: 1
---
Zadajte hodnotu prvku: 85
Aktuálny zoznam: 1, 85
---
Zadajte hodnotu prvku: 423
Aktuálny zoznam: 1, 85, 423
---
Zadajte hodnotu prvku: -1Rozbaľ pre ukážku riešenia
#include <stdio.h>
#include <stdlib.h>
// Štruktúra pre uzol zreťazeného zoznamu
typedef struct Node {
int value;
struct Node *next;
} Node;
// Funkcia na vytvorenie nového uzla
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Nepodarilo sa alokovať pamäť pre nový uzol.\n");
exit(1);
}
newNode->value = value;
newNode->next = NULL;
return newNode;
}
// Funkcia na pripojenie uzla na koniec zoznamu
void appendNode(Node** head, int value) {
Node* newNode = createNode(value);
if (*head == NULL) {
// Ak je zoznam prázdny, nový uzol sa stane hlavou
*head = newNode;
} else {
// Inak nájdeme posledný uzol a pripojíme nový uzol
Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
// Funkcia na výpis zoznamu
void printList(Node* head) {
Node* current = head;
if (current == NULL) {
printf("Zoznam je prázdny.\n");
return;
}
while (current != NULL) {
printf("%d", current->value);
if (current->next != NULL) {
printf(", ");
}
current = current->next;
}
printf("\n");
}
// Funkcia na uvoľnenie pamäte zoznamu
void freeList(Node* head) {
Node* current = head;
while (current != NULL) {
Node* temp = current;
current = current->next;
free(temp);
}
}
int main() {
Node* head = NULL; // Hlava zoznamu
int input;
while (1) {
printf("\nZadajte hodnotu prvku (-1 pre ukončenie): ");
scanf("%d", &input);
if (input == -1) {
break;
}
if (input < 0) {
printf("Zadajte iba kladné čísla alebo -1 pre ukončenie.\n");
continue;
}
// Pridanie nového prvku do zoznamu
appendNode(&head, input);
// Výpis aktuálneho zoznamu
printf("Aktuálny zoznam: ");
printList(head);
}
// Uvoľnenie pamäte
freeList(head);
printf("Pamäť bola uvoľnená. Program ukončený.\n");
return 0;
}Vysvetlenie
Štruktúra Node:
- Reprezentuje uzol zoznamu, obsahuje hodnotu (value) a pointer na ďalší uzol (next).
Vytvorenie uzla:
- Funkcia createNode alokuje pamäť pre nový uzol a inicializuje ho hodnotou.
Pripojenie uzla na koniec zoznamu:
- Funkcia appendNode pridá nový uzol na koniec zoznamu.
- Ak je zoznam prázdny, nový uzol sa stane hlavou.
Výpis zoznamu:
- Funkcia printList prechádza zoznam a vypisuje hodnoty jednotlivých uzlov.
Uvoľnenie pamäte:
- Funkcia freeList prejde všetky uzly zoznamu a uvoľní ich pamäť.
Hlavný program:
- Používateľ opakovane zadáva hodnoty, ktoré sa pridávajú do zoznamu.
- Po každom pridaní sa vypíše aktuálny stav zoznamu.
- Program končí, keď používateľ zadá -1.