如何将值插入单链表

Posted

技术标签:

【中文标题】如何将值插入单链表【英文标题】:How to insert values into single linked list 【发布时间】:2019-06-29 13:33:42 【问题描述】:

我正在尝试学习一些关于单链表的基础知识,所以我想到了创建一些代码。可悲的是,我已经让构造函数跟随。

到目前为止,我已经创建了我想要的所有方法。不幸的是,似乎我的插入不起作用,所以我什至无法检查其他方法是否有效。插入方法的ofc作用是将数字添加到排序列表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 << " ";
    

我期待什么?我的期望是看到我列表中的元素。这一刻什么都没有。没有错误,没有结果。

【问题讨论】:

你确定代码可以编译吗? @ArdaAytekin 它没有 这段代码还能编译成功吗? L 在主函数中声明在哪里,以便在 while(L) 中使用它? 如果您的代码无法编译,应该会出现错误消息。当你试图编译或运行你的程序时,一定会发生一些事情,无论它是挂起、崩溃还是立即退出而没有任何输出。如果绝对没有任何反应,您需要修复您的 IDE。 确实如此。这很奇怪。至少使用代码::块。哦,是的,将 L 与 t 交换并编译,但我正在谈论输出。什么都没有。 【参考方案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 ** 跟踪插入位置的好处:

在头部插入没有特殊情况 上一个和下一个没有单独的变量

【讨论】:

它可以工作,但就像我说过的,我想学习一些“基础知识”(如果你可以称链表为基础的话),所以指针指针是我无法生存的东西。不知道怎么回事。或者你知道吗?我要学习它是如何工作的。如果不是现在,那就永远不会。谢谢:D 我认为这里不需要指向指针的指针。是什么阻止您按值获取 L 然后分配给它? while (L &amp;&amp; L-&gt;key &lt;= x) L = L-&gt;next; 。如果需要,请跟踪前一个节点。甚至只是while (L-&gt;nest &amp;&amp; L-&gt;nest-&gt;key &lt;= x) L = L-&gt;next 。当循环中断时,您只需在L 之后插入。这比双指针容易得多。 出错后出错。我只是无法想象如何像你说的那样写它。 @AlexanderZhang 因为L 是一个引用L = L-&gt;next 实际上删除了列表头部的节点。 @AndrewMean 我为你添加了一个更简单的版本【参考方案2】:

这段代码应该可以工作。修复了在 Matt 的代码上打印时的编译错误和遍历逻辑。

#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)

    lnode **pos = &L;
    while (*pos && (*pos)->key <= x) 
        pos = &((*pos)->next);
    
    *pos = new lnode(x, *pos);


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 (t) 
        std::cout << t->key << " ";
        t = t->next;
    

【讨论】:

以上是关于如何将值插入单链表的主要内容,如果未能解决你的问题,请参考以下文章

单链表

如何使用C将值插入双向链表

数据结构--单链表简单代码实现(总结)

数据结构第三章:不带头结点的单链表操作

数据结构之单链表的增删查改等操作画图详解

链表(一)