在插入期间对链表进行排序

时间:2017-05-14 13:01:42

标签: c++ sorting pointers linked-list insert

所以我试图按降序将节点插入到链表中,但是当我得到重复的数字并且无法找到问题的良好解决方案时,我很难过。我要么遇到丢失的数字/程序崩溃,要么只有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,请告诉我。

3 个答案:

答案 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);
}