Организовать создание односвязного списка с последующим созданием новых элементов данной структуры - C (СИ)
Формулировка задачи:
Доброго вам здравия.
Мне необходимо написать базу данных на Си с помощью односвязного списка.
И вот у меня вопрос.
Есть структура:
Как мне организовать создание односвязного списка с последующим созданием новых элементов данной структуры?
struct CAR { char owner[21]; int model; char num[9]; int power; };
Решение задачи: «Организовать создание односвязного списка с последующим созданием новых элементов данной структуры»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> typedef struct ListNode { int data; ListNode *next; } ListNode; typedef struct List { ListNode *head; ListNode *tail; } List; List *construct_list(void); void destruct_list(List *); void push_back(List *, int); int pop_back(List *, int *); List *construct_list(void) { List *list = (List *)malloc(sizeof(List)); list->head = NULL; list->tail = NULL; return list; } void destruct_list(List *list) { ListNode *i = list->head; ListNode *del_elem; while (i != NULL) { del_elem = i; i = i->next; free(del_elem); } } void push_back(List *list, int data) { ListNode *new_elem = (ListNode *)malloc(sizeof(ListNode)); new_elem->data = data; if (list->head == NULL) { list->head = new_elem; list->tail = new_elem; } else { list->tail->next = new_elem; list->tail = new_elem; } } int pop_back(List *list, int *data) { ListNode *i; if (list->head == NULL) { data = NULL; return -1; } *data = list->tail->data; if (list->head == list->tail) { free(list->head); list->head = NULL; list->tail = NULL; return 0; } i = list->head; while (i->next != list->tail) i = i->next; free(list->tail); list->tail = i; return 0; } int main(void) { List *list = construct_list(); int data; data = 1; push_back(list, data); data = 2; push_back(list, data); data = 3; push_back(list, data); printf("%d\t", pop_back(list, &data)); printf("%d\n", data); printf("%d\t", pop_back(list, &data)); printf("%d\n", data); printf("%d\t", pop_back(list, &data)); printf("%d\n", data); printf("%d\t", pop_back(list, &data)); printf("%d\n", data); destruct_list(list); return 0; }
Объяснение кода листинга программы
- Создание списка:
- Структура списка состоит из двух указателей: head и tail, которые указывают на начало и конец списка соответственно.
- Функция construct_list() создает новый список, инициализируя head и tail списка NULL.
- Функция destruct_list() освобождает память, выделенную для каждого элемента списка, начиная с head и до конца списка.
- Добавление элемента в список:
- Функция push_back() добавляет новый элемент в конец списка.
- Если список пуст, то новый элемент становится и head, и tail списка.
- В противном случае новый элемент добавляется после tail списка.
- Удаление последнего элемента из списка:
- Функция pop_back() удаляет последний элемент из списка.
- Если список пуст, то возвращается -1 и data не изменяется.
- В противном случае data получает значение элемента, который был удален из списка, и возвращается 0.
- Если list == NULL, то вызывается ошибка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д