我想在链表中排序,在不打乱地址的情况下更改节点之间的值,当我设置交换条件时,我不能在那里放置任何代码。我尝试插入printf并更改值(除了交换(,结果出现了错误。
我想知道我的代码中哪一部分是错误的,我如何在不改变太多结构的情况下解决这个问题,这个代码是根据我学到的东西进行实验的,谢谢Advance的伙计们
#include <stdio.h>
#include <stdlib.h>
typedef struct Nodes
{
int value;
Nodes* next,*prev;
Nodes(int val)
{
value = val;
next = prev = NULL;
}
}Nodes;
Nodes *head,*tail,*curr;
void display()
{
curr = head;
while(curr)
{
printf("%d ",curr->value);
curr=curr->next;
}
}
void swap(Nodes *a,Nodes *b)
{
int temp = a->value;
a->value = b->value;
b->value = temp;
}
void sort()
{
curr = head;
while(curr)
{
Nodes *next = curr->next;
if(curr->value > next->value && next != NULL)
{
// this space cant code anything or it will break
// swap(curr,next);
}
curr = next;
}
}
void insert(int val)
{
if(!head)
{
head = tail = new Nodes(val);
}
else
{
curr = new Nodes(val);
tail->next = curr;
curr->prev = tail;
tail = curr;
}
}
int main()
{
insert(8);
insert(3);
insert(20);
display();
puts("");
sort();
display();
return 0;
}
if(curr->value > next->value && next != NULL)
// ^^^^^^^^^^^^ too late!
a && b
首先检查a,只有当a为真时,才评估b–因此对于next
是nullptr
的检查仅在已经访问了*next
之后评估(如果有的话,如果next
是nullptr
,则程序可能之前已经崩溃(。所以反过来检查一下:
if(next && curr->value > next->value)
然后你的排序算法是不完整的,看起来很像气泡排序,但只有一个"气泡"上升。。。