我试图学习一些有关单链表的基础知识,所以我想到了创建一些代码的想法。可悲的是,我给了构造函数一个跟随。
直到现在,我已经创建了所需的所有方法。不幸的是,似乎我的插入内容不起作用,所以我什至无法检查其他方法是否起作用。插入方法的作用是将数字添加到已排序的列表L中。如果该数字较大,则应将其放在第一个数字之前;如果没有该数字,则应将其放在列表的末尾。
#include <iostream>
#include <cassert>
using namespace std;
struct lnode
{
int key;
lnode* next;
lnode(int k, lnode* n=nullptr):key(k),next(n){}
};
void insert( lnode* &L, int x)
{
while(L)
{
if(x >= L->key)
{
L = L->next;
}
else
{
lnode* temp = L;
L = new lnode(x, nullptr);
L->next = temp;
break;
}
}
}
int main()
{
lnode* t = nullptr;
insert(t,3);
insert(t,4);
insert(t,1);
insert(t,7);
insert(t,-4);
insert(t,9);
insert(t,2);
while(L) {
std::cout << L->key << " ";
}
}
我期望什么?我的期望是看到清单中的元素。此时此刻什么都没有。没有错误,没有结果。
答案 0 :(得分:1)
编写简单的单链列表修改代码的技巧是使用指向当前节点的指针来指示您的位置:
void insert( lnode* &L, int x)
{
lnode **pos = &L;
while (*pos && (*pos)->key <= x) {
pos = &((*pos)->next);
}
*pos = new lnode(x,*pos);
}
既然您是初学者,也许您应该从初学者版本开始:
void insert( lnode* &L, int x)
{
if (!L || L->key > x) {
//insert at head
L = new lnode(x, L);
return;
}
lnode *previous=L;
lnode *current=L->next;
while(current && current->key <= x) {
previous = current;
current = current->next;
}
//insert between previous and current
previous->next = new lnode(x, current);
}
与上一个相比,显示了在搜索时使用lnode **
跟踪插入位置的好处:
答案 1 :(得分:0)
此代码应该起作用。修复了在Matt代码之上打印时的编译错误以及遍历逻辑。
example.com/foo