циклический двусвязный список в C

#c #doubly-linked-list #circular-list

#c #двусвязный список #циклический список

Вопрос:

На данный момент целью этого кода является создание кругового двусвязного списка, который отображает номера заключенных, к которым я позже применю проблему Джозефуса в функции удаления

 #include <stdio.h>
#include <stdlib.h>

struct Node{
    int data;
    struct Node* prev;
    struct Node* next;
};

struct Node* first, *last; // global variables first and last

struct Node* GetNewNode(int x)
{
    struct Node* newNode = malloc(sizeof(struct Node));
    newNode->data = x;
    newNode->next = newNode->prev = newNode;
    first = newNode;
    return newNode;
};
  

Я считаю, что что-то неправильно в моей функции печати или вставки

 void insertEnd(int x)
{
    struct Node* newNode = GetNewNode(x);
    struct Node* temp = GetNewNode(x);

    if (first == NULL)
    {
        first = newNode;
        return;
    }


    last = first->prev;
    temp->data = x;
    temp->next = first;
    first->prev = temp;
    temp->prev = last;
    last->next = temp;

}
  

Эта функция не печатает пять узлов, которые я ожидаю, что она напечатает в цикле for в main

 void printList()
{
    struct Node* temp = first;

    while(temp->next != first)
    {
  

Строка ниже никогда не печатается.

         printf("prisoner %d| ", temp->data);
        temp = temp->next;
    }
    printf("%d", temp->data);
}



int main()
{
    int n,k;

    printf("How many prisoners are there: ");
    scanf("%d", amp;n);
  

этот цикл for пытается присвоить номера заключенных каждому узлу, добавленному в список

     for(int i = 1; i <= n; i  )
    {
        insertEnd(i);
    }

    printList();

    return 0;
}
  

Комментарии:

1. вам следует взять ручку и бумагу и подумать о назначениях в insertEnd — почему вы это делаете last = first , а затем сбрасывать все указатели на first для каждой вставки?

2. не должно last быть first->prev ?

3. да, последний — это первый-> предыдущий.

4. Вы getNewNode всегда устанавливаете first так, чтобы он указывал на вновь созданный узел.

5. Я вижу, я переключил first на last в getnewnode, и теперь я верю, что он отображает его правильно для меня.