如何在不更改数据的情况下更改以前创建的双向循环链表中 node 的位置?
(First of all, I'm sorry for my bad English, English is not my native language.)
我们在大学参加了"数据 struct "课程的考试.最后一个问题是这样给出的.
查看下面给出的代码.补齐缺失的功能.
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int data;
struct Node* next;
struct Node* pre;
};
struct Node* node_create(int data)
{
struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
new_node->data = data;
new_node->next = NULL;
new_node->pre = NULL;
return new_node;
}
void node_add(struct Node** head, struct Node* new_node)
{
struct Node* list = *head;
if(*head == NULL)
{
new_node->next = new_node;
new_node->pre = new_node;
*head = new_node;
}
else
{
while(list->next != *head)
{
list = list->next;
}
list->next = new_node;
(*head)->pre = new_node;
new_node->next = *head;
new_node->pre = list;
}
}
void node_list(struct Node** head)
{
struct Node* list = *head;
if(*head == NULL)
{
printf("\nEmpty Linked List!\n");
return;
}
do{
//printf("(%p) %p - %d-> (%p)", list->pre,list,list->data,list->next);
printf("%d-> ", list->data);
list = list->next;
}while(list != *head);
}
void node_delete(struct Node** head, int data)
{
if(*head == NULL)
{
printf("\nEmpty Linked List!\n");
return;
}
struct Node* list = *head;
struct Node* end = *head;
if( list->data == data )
{
if(list->next == list)
{
free(list);
*head = NULL;
}
else
{
while(end->next != *head)
{
end = end->next;
}
*head = list->next;
end->next = *head;
(*head)->pre = end;
free(list);
}
}
else
{
while(list->data != data && list->next != *head)
{
list = list->next;
}
if(list->data != data && list->next == *head)
{
printf("No value for delete!\n");
return;
}
(list->pre)->next = list->next;
(list->next)->pre = list->pre;
free(list);
}
printf("\nDelete of complited!\n");
}
void node_sorting(struct Node** head)
{
}
int main()
{
struct Node* head = NULL;
struct Node* new_node = NULL;
int select = 0, data = 0, one = 1;
while(one == 1)
{
printf("\n\nNode Add (1)\n");
printf("Node List (2)\n");
printf("Node Delete (3)\n");
printf("Node Sorting (4)\n");
printf("\nSelect: ");
scanf("%d", &select);
if(select == 1)
{
printf("\nData: ");
scanf("%d", &data);
new_node = node_create(data);
node_add(&head, new_node);
}
else if(select == 2)
{
node_list(&head);
}
else if(select == 3)
{
printf("\nData to delete: ");
scanf("%d", &data);
node_delete(&head, data);
}
else if(select == 4)
{
node_sorting(&head);
}
}
return 0;
}
考虑到问题很简单,可以用气泡算法解决,我编写了以下代码作为答案.
void node_sorting(struct Node** head)
{
struct Node* list = *head;
struct Node* tolist = *head;
if(*head == NULL)
{
printf("\nEmpty Linked List!\n");
return;
}
if((*head)->next == *head)
{
printf("A single-element linked list cannot be sorted.");
return;
}
do{
tolist = list->next;
list = list->next;
while(tolist != *head)
{
if(list->data > tolist->data)
{
int temp = 0;
temp = tolist->data;
tolist->data = list->data;
list->data = temp;
}
tolist = tolist->next;
}
}while(list != *head);
}
然而,当结果公布时,我得知我考试不及格,上面的问题得了0分.
当我与教授这门课的教授交谈时,我得到了以下答案.你写的答案只是一个骗局.如果我在现实生活中使用这个,可能会造成严重的 destruct .永远不要改变数据.改变 node 的位置.
我不明白这是怎么回事.我花了一周的时间研究这个问题,发现了以下资源.
Inserting data in a sorted Circular Linked List个
Inserting a element in a singly circular linked list in sorted manner
Insert element into a sorted Circular Double Linked List个
这些都不适合对现有的双循环链表进行排序.任何文件或文本,你可以与我分享,适合我的要求将对我很有帮助.非常感谢提前.