我想在链表中排序,在不改变地址的情况下更改节点之间的值,当我放置交换条件时,我无法在其中放置任何代码。我尝试插入printf并更改值(在swap旁边),并导致错误。
我想知道我的代码中哪一部分是错误的,以及如何在不对结构进行太多更改的情况下解决此问题,该代码是根据我学到的东西进行实验的,谢谢高级人员
#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;
}
答案 0 :(得分:0)
if(curr->value > next->value && next != NULL)
// ^^^^^^^^^^^^ too late!
a && b
首先检查a,并且仅在a为true时才对b求值–因此,只有在已经拥有next是nullptr
的值进行评估访问了*next
(如果可能的话,如果next
是 nullptr
,程序可能已经崩溃了)。因此,反过来检查:
if(next && curr->value > next->value)
然后您的排序算法不完整,看起来很像冒泡排序,但是只有一个“冒泡”出现...