Организовать создание односвязного списка с последующим созданием новых элементов данной структуры - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго вам здравия. Мне необходимо написать базу данных на Си с помощью односвязного списка. И вот у меня вопрос. Есть структура:
Листинг программы
  1. struct CAR
  2. {
  3. char owner[21];
  4. int model;
  5. char num[9];
  6. int power;
  7. };
Как мне организовать создание односвязного списка с последующим созданием новых элементов данной структуры?

Решение задачи: «Организовать создание односвязного списка с последующим созданием новых элементов данной структуры»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct ListNode
  5. {
  6.     int data;
  7.     ListNode *next;
  8. } ListNode;
  9.  
  10. typedef struct List
  11. {
  12.     ListNode *head;
  13.     ListNode *tail;
  14. } List;
  15.  
  16. List *construct_list(void);
  17. void destruct_list(List *);
  18.  
  19. void push_back(List *, int);
  20. int pop_back(List *, int *);
  21.  
  22. List *construct_list(void)
  23. {
  24.     List *list = (List *)malloc(sizeof(List));
  25.  
  26.     list->head = NULL;
  27.     list->tail = NULL;
  28.  
  29.     return list;
  30. }
  31.  
  32. void destruct_list(List *list)
  33. {
  34.     ListNode *i = list->head;
  35.     ListNode *del_elem;
  36.  
  37.     while (i != NULL)
  38.     {
  39.         del_elem = i;
  40.         i = i->next;
  41.  
  42.         free(del_elem);
  43.     }
  44. }
  45.  
  46. void push_back(List *list, int data)
  47. {
  48.     ListNode *new_elem = (ListNode *)malloc(sizeof(ListNode));
  49.  
  50.     new_elem->data = data;
  51.  
  52.     if (list->head == NULL)
  53.     {
  54.         list->head = new_elem;
  55.         list->tail = new_elem;
  56.     }
  57.     else
  58.     {
  59.         list->tail->next = new_elem;
  60.         list->tail = new_elem;
  61.     }
  62. }
  63.  
  64. int pop_back(List *list, int *data)
  65. {
  66.     ListNode *i;
  67.  
  68.     if (list->head == NULL)
  69.     {
  70.         data = NULL;
  71.  
  72.         return -1;
  73.     }
  74.  
  75.     *data = list->tail->data;
  76.  
  77.     if (list->head == list->tail)
  78.     {
  79.         free(list->head);
  80.  
  81.         list->head = NULL;
  82.         list->tail = NULL;
  83.  
  84.         return 0;
  85.     }
  86.  
  87.     i = list->head;
  88.  
  89.     while (i->next != list->tail)
  90.         i = i->next;
  91.  
  92.     free(list->tail);
  93.  
  94.     list->tail = i;
  95.  
  96.     return 0;
  97. }
  98.  
  99. int main(void)
  100. {
  101.     List *list = construct_list();
  102.     int data;
  103.  
  104.     data = 1;
  105.     push_back(list, data);
  106.  
  107.     data = 2;
  108.     push_back(list, data);
  109.  
  110.     data = 3;
  111.     push_back(list, data);
  112.  
  113.     printf("%d\t", pop_back(list, &data));
  114.     printf("%d\n", data);
  115.  
  116.     printf("%d\t", pop_back(list, &data));
  117.     printf("%d\n", data);
  118.  
  119.     printf("%d\t", pop_back(list, &data));
  120.     printf("%d\n", data);
  121.  
  122.     printf("%d\t", pop_back(list, &data));
  123.     printf("%d\n", data);
  124.  
  125.     destruct_list(list);
  126.  
  127.     return 0;
  128. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы