【问题标题】:Sorting the linked list during insert在插入期间对链表进行排序
【发布时间】:2017-05-14 13:01:42
【问题描述】:

所以我试图按降序将节点插入到链表中,但是当我得到重复的数字并且找不到解决问题的好方法时我很挣扎。我要么遇到数字丢失/程序崩溃,要么程序无​​限次仅列出 1 个数字。

这是我认为符合“else”语句的代码,这是我无法弄清楚的部分,我只是离开了我的上一个版本,这显然不起作用

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 请告诉我。

【问题讨论】:

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


    【解决方案1】:

    也许

        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;
    }
    }
    

    【讨论】:

    • 对不起,我是链表和 c++ 的初学者,所以我几乎不知道你的解决方案中发生了什么,因为这个 if 语句。
    【解决方案2】:

    当你第一次插入时,它进入你的第一个if 条件,然后设置first=news,但之后它再次检查news-&gt;number &gt; first-&gt;number,这将是错误的,所以不必要地进入 else 条件。因此,要么在第一个 if 块中添加 return;,要么将其他人放在 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 3 2 5 它 jusr 无限打印 2。
    【解决方案3】:

    你应该交换你的最后两行,否则你有news-&gt;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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 2019-08-26
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多