Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- // Определяем размер массива в каждом узле
- #define ARRAY_SIZE 4
- // Структура для элемента двусвязного списка
- typedef struct Node {
- int array[ARRAY_SIZE]; // Массив фиксированной размерности для хранения элементов
- int filled; // Количество заполненных элементов в массиве
- struct Node *prev; // Указатель на предыдущий элемент списка
- struct Node *next; // Указатель на следующий элемент списка
- } Node;
- // Функция для создания нового узла
- Node* createNode() {
- Node *newNode = (Node*)malloc(sizeof(Node)); // Выделяем память для нового узла
- newNode->filled = 0;
- newNode->prev = NULL;
- newNode->next = NULL;
- return newNode; // Возвращаем указатель на новый узел
- }
- // Функция для создания списка из входного массива
- Node* createList(int *inputArray, int size) {
- Node *head = NULL, *tail = NULL; // Указатели на начало и конец списка
- int i = 0; // Индекс для входного массива
- // Пока не пройден весь входной массив
- while (i < size) {
- Node *newNode = createNode(); // Создаём новый узел
- // Заполняем новый узел элементами из входного массива
- while (i < size && newNode->filled < ARRAY_SIZE) {
- newNode->array[newNode->filled++] = inputArray[i++];
- }
- // Если список пустой, устанавливаем голову и хвост
- if (!head) {
- head = newNode;
- tail = newNode;
- }
- else { // Иначе добавляем узел в конец списка
- newNode->filled += tail->filled; // Суммируем заполненные элементы
- tail->next = newNode; // Соединяем хвост с новым элементом
- newNode->prev = tail;
- tail = newNode; // Обновляем хвост
- }
- }
- return head; // Возвращаем указатель на начало списка
- }
- // Функция для вывода списка
- void displayList(Node *head) {
- Node *current = head; // Указатель на текущий узел
- int nodeIndex = 0, filledCount;
- // Пока не дошли до конца списка
- while (current) {
- printf("Node %d: ", nodeIndex++); // Выводим индекс узла
- // Определяем количество заполненных элементов текущего узла
- if (current != head) filledCount = current->filled - (current->prev->filled);
- else filledCount = current->filled;
- // Выводим все элементы массива текущего узла
- for (int i = 0; i < filledCount; i++) {
- printf("%d ", current->array[i]);
- }
- printf("(filled: %d)\n", current->filled); // Выводим количество заполненных элементов (до текущего узла)
- current = current->next; // Переходим к следующему узлу
- }
- }
- // Функция для освобождения памяти списка
- void freeList(Node *head) {
- Node *current = head; // Указатель на текущий узел
- Node *nextNode;
- // Пока не дошли до конца списка
- while (current) {
- nextNode = current->next; // Сохраняем указатель на следующий узел
- free(current); // Освобождаем память текущего узла
- current = nextNode; // Переходим к следующему узлу
- }
- }
- int main() {
- // Создаём два входных массива
- int array1[] = {1, 2, 3, 4, 5, 6, 7, 8};
- int array2[] = {10, 20, 30, 40, 50, 60};
- // Создаём два списка на основе входных массивов
- Node *list1 = createList(array1, sizeof(array1) / sizeof(array1[0]));
- Node *list2 = createList(array2, sizeof(array2) / sizeof(array2[0]));
- // Выводим оба списка
- printf("List 1:\n");
- displayList(list1);
- printf("\nList 2:\n");
- displayList(list2);
- // Освобождаем память обоих списков
- freeList(list1);
- freeList(list2);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement