我试图创建排序的链接列表=在创建它时对其进行排序。想法很简单,插入一个节点 - 并检查前一个是否较小,如果是,检查前一个等等,直到找到它的位置。我已经创建了这段代码。插入节点时排序链接列表
struct Node{
Node *prev;
Node *next;
int value;
};
struct List{
Node *head = nullptr;
Node *tail = nullptr;
};
这里我创建了一个节点,并为列表的第一个和最后一个项目引用了list =“holder”。
void insertNode(Node *&head,Node *&tail, int value){
Node *tmp = new Node;
tmp -> prev = nullptr;
tmp -> next = nullptr;
tmp -> value = value;
head = tmp;
tail = tmp;
}
此函数检查列表为空,如果是,则它插入节点到头部和尾部(例如头=尾=有在列表中只有一个节点);
什么烦恼我是函数插入一个节点
void insertIt(Node *&head , Node *&tail , int value){
if(head == nullptr){
insertNode(head,tail,value);
}
else{
Node *tmp = new Node;
tmp -> value = value;
if(value < tail -> value){
while(value < tail -> prev -> value){
tail = tail -> prev;
if(tail -> prev == nullptr){
tmp -> next = head;
tmp -> prev = nullptr;
head -> prev = tmp;
head = tmp;
return;
}
}
tail -> prev -> next = tmp;
tmp -> prev = tail -> prev;
tmp -> next = tail;
tail -> prev = tmp;
}else{
tmp -> next = nullptr;
tmp ->prev = tail;
tail -> next = tmp;
tail = tmp;
}
}
}
如果列表是空的,它会调用insertNode()
,如果节点的值比前一节点的值越小,所抓取的列表中找到它的现货。
只有当插入的第一个节点也是最小的节点时,此代码才有效。例如
insertIt(list.head , list.tail , -1);
insertIt(list.head , list.tail , 0);
insertIt(list.head , list.tail , 7);
insertIt(list.head , list.tail , 1);
insertIt(list.head , list.tail , 2);
insertIt(list head , list.tail , 2);
工作,如果我打印列表它很好排序。但是
insertIt(list.head , list.tail , -2);
insertIt(list.head , list.tail , -1);
insertIt(list.head , list.tail , 7);
insertIt(list.head , list.tail , 1);
insertIt(list.head , list.tail , 2);
insertIt(list.head , list.tail , 2);
第一个节点不是最小的节点,它崩溃了程序。我认为这是我是比较值,以nullptr所以我加了一段代码,你可以在insertIt()
功能看,这是
if(tail -> prev == nullptr){
tmp -> next = head;
tmp -> prev = nullptr;
head -> prev = tmp;
head = tmp;
return;
}
此检查的节点是头,交换头新节点,使新节点焕然一新。
它为什么会崩溃代码?我未能找到合理的答案。另外,如何改进我的“算法”以使其更有效?
首先赶上飞机坠毁在行动,看看它是什么,所有涉及的变量的值。如果它没有帮助,那么使用调试器逐行浏览代码,查看它的作用以及所有变量如何变化。 –
“如果列表为空,则调用insertNode(),如果节点的值小于前一个节点的值。但是列表是空的。 –
我使用的代码块和调试器指出,在我添加的代码行(我写的最后一个代码),我有点新到c/C++世界,没有使用过多的调试器,我想代码块调试器不是最好的。你能推荐一些好的吗? – Darlyn