Advertisement
LessVegetables

Untitled

Jun 16th, 2024
622
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.83 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // Определяем размер массива в каждом узле
  5. #define ARRAY_SIZE 4
  6.  
  7. // Структура для элемента двусвязного списка
  8. typedef struct Node {
  9.     int array[ARRAY_SIZE];  // Массив фиксированной размерности для хранения элементов
  10.     int filled;             // Количество заполненных элементов в массиве
  11.     struct Node *prev;      // Указатель на предыдущий элемент списка
  12.     struct Node *next;      // Указатель на следующий элемент списка
  13. } Node;
  14.  
  15. // Функция для создания нового узла
  16. Node* createNode() {
  17.     Node *newNode = (Node*)malloc(sizeof(Node)); // Выделяем память для нового узла
  18.     newNode->filled = 0;
  19.     newNode->prev = NULL;
  20.     newNode->next = NULL;
  21.     return newNode; // Возвращаем указатель на новый узел
  22. }
  23.  
  24. // Функция для создания списка из входного массива
  25. Node* createList(int *inputArray, int size) {
  26.     Node *head = NULL, *tail = NULL; // Указатели на начало и конец списка
  27.     int i = 0; // Индекс для входного массива
  28.  
  29.     // Пока не пройден весь входной массив
  30.     while (i < size) {
  31.         Node *newNode = createNode(); // Создаём новый узел
  32.        
  33.         // Заполняем новый узел элементами из входного массива
  34.         while (i < size && newNode->filled < ARRAY_SIZE) {
  35.             newNode->array[newNode->filled++] = inputArray[i++];
  36.         }
  37.        
  38.         // Если список пустой, устанавливаем голову и хвост
  39.         if (!head) {
  40.             head = newNode;
  41.             tail = newNode;
  42.         }
  43.         else { // Иначе добавляем узел в конец списка
  44.             newNode->filled += tail->filled; // Суммируем заполненные элементы
  45.             tail->next = newNode; // Соединяем хвост с новым элементом
  46.             newNode->prev = tail;
  47.             tail = newNode; // Обновляем хвост
  48.         }
  49.     }
  50.  
  51.     return head; // Возвращаем указатель на начало списка
  52. }
  53.  
  54. // Функция для вывода списка
  55. void displayList(Node *head) {
  56.     Node *current = head; // Указатель на текущий узел
  57.     int nodeIndex = 0, filledCount;
  58.  
  59.     // Пока не дошли до конца списка
  60.     while (current) {
  61.         printf("Node %d: ", nodeIndex++); // Выводим индекс узла
  62.  
  63.         // Определяем количество заполненных элементов текущего узла
  64.         if (current != head) filledCount = current->filled - (current->prev->filled);
  65.         else filledCount = current->filled;
  66.  
  67.         // Выводим все элементы массива текущего узла
  68.         for (int i = 0; i < filledCount; i++) {
  69.             printf("%d ", current->array[i]);
  70.         }
  71.         printf("(filled: %d)\n", current->filled); // Выводим количество заполненных элементов (до текущего узла)
  72.         current = current->next; // Переходим к следующему узлу
  73.     }
  74. }
  75.  
  76. // Функция для освобождения памяти списка
  77. void freeList(Node *head) {
  78.     Node *current = head; // Указатель на текущий узел
  79.     Node *nextNode;
  80.  
  81.     // Пока не дошли до конца списка
  82.     while (current) {
  83.         nextNode = current->next;   // Сохраняем указатель на следующий узел
  84.         free(current);              // Освобождаем память текущего узла
  85.         current = nextNode;          // Переходим к следующему узлу
  86.     }
  87. }
  88.  
  89. int main() {
  90.     // Создаём два входных массива
  91.     int array1[] = {1, 2, 3, 4, 5, 6, 7, 8};
  92.     int array2[] = {10, 20, 30, 40, 50, 60};
  93.  
  94.     // Создаём два списка на основе входных массивов
  95.     Node *list1 = createList(array1, sizeof(array1) / sizeof(array1[0]));
  96.     Node *list2 = createList(array2, sizeof(array2) / sizeof(array2[0]));
  97.  
  98.     // Выводим оба списка
  99.     printf("List 1:\n");
  100.     displayList(list1);
  101.     printf("\nList 2:\n");
  102.     displayList(list2);
  103.  
  104.     // Освобождаем память обоих списков
  105.     freeList(list1);
  106.     freeList(list2);
  107.  
  108.     return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement