我正在尝试按整数值对双向链表进行排序。
这是一个示例节点:
struct Node
{
struct Node* previous;
struct Node* next;
int* a;
}Node;
我原本打算使用插入排序,但我正在努力想出正确的代码。
我的头尾只是struct Node* listHead
和struct Node* listTail
。它们都是全局变量。
编辑:我查看了有关此主题的其他几篇帖子,但我无法让代码正常运行。我为自己的无能而道歉。
到目前为止尝试:
struct Node* key = listHead;
struct Node* i;
struct Node* temp;
while(key!=NULL)
{
temp=key;
iterator=key->previous;
while(i != NULL && temp->a>i->a)
{
if(i->next->next!=NULL&& i->next!=NULL)
{
i=i->next->next;
i=i->previous;
}
}
if(i->next->next!=NULL && key->next!=NULL)
{
i->next->next = temp;
key = key->next;
}
}
编辑:第二次尝试代码:
struct Node* newHead = NULL;
struct Node* newTail = NULL;
struct Node* i;
struct Node* move = listHead;
struct Node* temp;
while(move->next!=NULL && move!=NULL)
{
if(newHead==NULL)
{
temp=move;
newHead=temp;
}else if(newTail==NULL)
{
temp=move;
newTail=temp;
}else if(newHead->next->next==NULL)
{
temp=move;
insert_node(newHead, newTail, temp);
}
else
{
i=newHead->next;
while(inserter->previous!=NULL)
{
if(i->previous->a < i->a)
{
temp=move;
insert_node(i->previous,i,temp);
break;
}
i=i->previous;
}
}
move=move->next;
}
listHead=newHead;
listTail=newTail;
第二个代码块似乎只对最后一个元素进行排序。
我的插入功能:
void insert_node(struct Node* first, struct Node* last, struct Node* insert)
{
first->next=insert;
insert->previous=first;
last->previous=insert;
insert->next=last;
}
答案 0 :(得分:2)
创建一个新的双向链表。从原始双向链表中一次删除一个元素,并根据插入排序插入到正确位置的新双向链表中(正如您所提到的那样使用插入排序)。
我想这是你遇到问题的地方(实施时)。试着打破这个问题。学习创建双向链表,在开头插入元素,在结尾插入元素,从头开始删除元素,从结尾删除元素,在某个特定位置插入元素,在某个特定位置删除元素,交换两个列表中的元素。
一旦你学会了这一切,你的代码就会分解为:
1)创建一个新的空双链表
2)从原始双向链表中删除最后一个元素并将其插入新的双向链表
3)从原始双向链表中删除最后一个元素并将其插入新链表中的正确位置(使得一侧的元素较小而另一侧的元素较大)
4)重复第3组,直到原始链表中有元素
您只需在此处调用相应操作的方法即可。如果您仍然遇到问题,请尝试在此处粘贴代码。
编辑: 您随时都不会拥有不必要的节点。但是,如果你的老师坚持只使用一个清单:
1)创建一个新的指针A来标记节点,在该节点之前你对双向链表进行排序(最初这将是原始双向链表的第一个元素)
2)现在考虑指针A处元素的值,迭代排序列表(即指针A处元素之前的列表),找到指针A处元素适合的位置(即元素之前较小,元素之后更大)。现在将指针A指向的节点插入该位置。并使A指向下一个节点元素。
3)重复这个直到你到达终点。