#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, и теперь я верю, что он отображает его правильно для меня.