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

Объяснение кода листинга программы

  1. Создание списка:
    • Структура списка состоит из двух указателей: head и tail, которые указывают на начало и конец списка соответственно.
    • Функция construct_list() создает новый список, инициализируя head и tail списка NULL.
    • Функция destruct_list() освобождает память, выделенную для каждого элемента списка, начиная с head и до конца списка.
  2. Добавление элемента в список:
    • Функция push_back() добавляет новый элемент в конец списка.
    • Если список пуст, то новый элемент становится и head, и tail списка.
    • В противном случае новый элемент добавляется после tail списка.
  3. Удаление последнего элемента из списка:
    • Функция pop_back() удаляет последний элемент из списка.
    • Если список пуст, то возвращается -1 и data не изменяется.
    • В противном случае data получает значение элемента, который был удален из списка, и возвращается 0.
    • Если list == NULL, то вызывается ошибка.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы