Организовать создание односвязного списка с последующим созданием новых элементов данной структуры - 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, то вызывается ошибка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д