Правильно ли реализован двусвязный список - C (СИ)

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

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

Здравствуйте! Пытаюсь на С двусвязный список сделать, вот код:
struct Node {
    int count;
    struct Node *next;
};
 
typedef struct Node Item;
Item *head = NULL;
add_head (head, "One");    // 1. Здесь в функцию передаю указатель на хеад
printf("HEAD IN MAIN: %d\n", head->count);  //  5. Но сюда не передается
Item* create_node (char new_word []) {
    Item *new_node = (Item *) malloc(sizeof(Item));
    new_node->count = 2;
    new_node->next = NULL;
 
    return new_node;
}
 
void add_head (Item *head, char new_word []) {
    Item *temp = create_node(new_word);     // 2. Создаю новый узел
    temp->next = head;
    head = temp;       // 3. Присваиваю к хеад указатель на новый узел 
    printf("HEAD IN FUNC: %d\n", head->count);  // 4. Здесь все нормально выводится
}
В чем ошибка? Вообще, правильно ли я делаю список или есть более удобный способ создания, обновления, удаления и т.д.

Решение задачи: «Правильно ли реализован двусвязный список»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct Node
{
    char* text;
    struct Node *prev, *next;
};
 
struct DoubleLinkedList
{
    int nodesCount;
    struct Node *topSentinel, *bottomSentinel;
};
 
void CreateList(struct DoubleLinkedList *list)
{
    list->topSentinel = (struct Node*)calloc(2, sizeof(struct Node));
    list->bottomSentinel = list->topSentinel + 1;
    list->topSentinel->next = list->bottomSentinel;
    list->bottomSentinel->prev = list->topSentinel;
    list->nodesCount = 0;
}
 
void AddNodeToTop(struct DoubleLinkedList *list, const char* nodeText)
{
    size_t bufferLength = strlen(nodeText) + 1;
    struct Node *newNode = (struct Node*)calloc(1, sizeof(struct Node));
    newNode->next = list->topSentinel->next;
    newNode->prev = list->topSentinel;
    newNode->next->prev = newNode;
    list->topSentinel->next = newNode;
    newNode->text = (char*)calloc(bufferLength, sizeof(char));
    strncpy(newNode->text, nodeText, bufferLength);
    ++list->nodesCount;
}
 
int main()
{
    struct DoubleLinkedList list;
    CreateList(&list);
    AddNodeToTop(&list, "One");
    AddNodeToTop(&list, "Two");
    AddNodeToTop(&list, "Three");
    for (const struct Node *currentNode = list.topSentinel->next; currentNode != list.bottomSentinel; currentNode = currentNode->next)
        printf("Node text: %s\n", currentNode->text);
    getchar();
    return 0;
}

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

  1. Включаем необходимые заголовочные файлы: , ,
  2. Объявляем структуру узла списка: struct Node { char text; struct Node prev, *next; }
  3. Объявляем структуру двусвязного списка: struct DoubleLinkedList { int nodesCount; struct Node topSentinel, bottomSentinel; }
  4. Создаем функцию для создания пустого списка: void CreateList(struct DoubleLinkedList *list)
  5. Создаем функцию для добавления нового элемента в начало списка: void AddNodeToTop(struct DoubleLinkedList list, const char nodeText)
  6. В функции main создаем экземпляр двусвязного списка и инициализируем его: struct DoubleLinkedList list; CreateList(&list);
  7. Добавляем три элемента в список: AddNodeToTop(&list, One); AddNodeToTop(&list, Two); AddNodeToTop(&list, Three);
  8. Выводим текст всех элементов списка в консоль: for (const struct Node *currentNode = list.topSentinel->next; currentNode != list.bottomSentinel; currentNode = currentNode->next) printf(Node text: %s\n, currentNode->text);
  9. Ждем нажатия клавиши для завершения программы: getchar();
  10. Возвращаем 0, чтобы указать, что программа успешно завершилась: return 0;

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


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

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

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