所以我试图按降序将节点插入到链表中,但是当我得到重复的数字并且无法找到问题的良好解决方案时,我很难过。我要么遇到丢失的数字/程序崩溃,要么只有1个无限次的程序列表。
这是我认为适用于"其他"的代码。声明,它是我无法弄清楚的部分,我只是离开我的上一个版本,显然不起作用
void Link::insert(int number) {
Node *news = new Node;
news->number = number;
if(first == NULL) {
first = news;
}
if(news->number > first->number) {
Node *temp = first;
first = news;
news->next = temp;
} else {
Node *temp = first;
while (temp->next || news->number < temp->number) {
temp=temp->next;
}
temp->next = news;
news->next = temp->next;
}
}
如果需要其他功能或我的main.cpp,请告诉我。
答案 0 :(得分:0)
当您第一次插入时,它会进入您的第一个if
条件然后设置first=news
,但之后再次检查news->number > first->number
这将是假的,所以进入其他不必要的条件。因此,要么在第一个return;
块中添加if
,要么将其他块添加到else
块中。
跟踪上一个元素
else{
Node *temp=first,*prev=null;
while (temp && (temp->next || news->number < temp->number)){
prev=temp;
temp=temp->next;
}
if(prev==null){
news->next=first;first=news;
}
else{
prev->next=news;news->next=temp;
}
}
答案 1 :(得分:0)
也许
void Link::insert(int number){
Node *news = new Node;
news->number = number;
if(first == NULL){
first = news;
return;
}
for(Node *i=first, *pred=NULL;!i;i=i->next){
if(i->number<number){
if(i==first) {
news->next=first;
first=news;
} else {
pred->next=news;
news->next=i;
}
break;
}
pred=i;
}
}
答案 2 :(得分:0)
你应该交换最后两行,否则你有news->next = news
,创建一个循环。
无论如何,我建议将函数拆分为2个(私有)部分:一个找到Node*
后插入的位置(或nullptr
作为第一个位置),以及插入方法(并且它更容易调试。
Node* Link::upper_bound(int value) const
{
if (first == nullptr || first->number <= value) {
return nullptr;
}
Node* node = first;
Node* next = first->next;
while (next && value < next->number) {
node = next;
next = node->next;
}
return node; // we have: node->number < value && (next == nullptr || value <= next->number)
}
void Link::insert_after(Node* node, int value)
{
Node* new_node = new Node(value);
if (node == nullptr) {
new_node->next = first;
first = new_node;
} else {
new_node->next = node->next;
node->next = new_node;
}
}
最后:
void Link::insert(int number) {
insert_after(upper_bound(number), number);
}