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