【问题标题】:Cannot insert at the beginning of c++ linked list [closed]无法在c ++链表的开头插入[关闭]
【发布时间】:2017-10-25 13:21:01
【问题描述】:

我正在尝试创建一个用于在链表开头插入的函数。我已经将我的代码与网络上的一些代码进行了比较,结果或多或少是相同的。但是,当我尝试使用 CodeBlocks 编译它时,打印的输出只有数字 0。谁能解释为什么 insertFirst 函数不起作用或显示错误(如果有)?

struct node{
    int data;
    struct node *next;
};

node insertFirst(node *head, int newData){
        node *temp = new node;
        temp -> data = newData;
        temp -> next = head;
        head = temp;

        return *head;
}

int main(){
 int i;

 node *first, *cur;

 first = new node;

 first -> data = 0;
 first -> next = 0;

 for(i = 1; i <= 10; i++){
    insertFirst(first, i);
 }

 cur = first;

 while(cur){
    cout << cur -> data << endl;
    cur = cur -> next;
 }
}

【问题讨论】:

  • 您是否尝试使用调试器单步执行您的代码,以找出它在哪里做了您没想到的事情?更新:我建议阅读good C++ book。 insertFirst 中的 head 是一个本地副本,一旦函数返回,对它所做的任何分配 (head = temp;) 都会丢失。您的意思是通过引用传递吗?

标签: c++ linked-list


【解决方案1】:

您的第一个仍然是第一位,因为您没有在通话中更新它。像这样定义你的函数:

node insertFirst(node *&head, int newData)

因此,您将在“头”指针上获得一个引用,并将其传递回调用函数。

【讨论】:

  • node insertLast(node *head, int newData){ node *temp = new node; node *cur,*prev; temp -&gt; data = newData; temp -&gt; next = 0; cur = head; prev = 0; while(cur){ prev = cur; cur = cur -&gt; next; } if(!prev){ head = temp; }else{ prev -&gt; next = temp; } return *head; } 我也有上述功能,并尝试在循环中以相同的方式实现它,它可以工作。是什么让它与众不同?
  • 在您的方法中定义参数**node *head**。因此,您可以更改 head 指向的数据,但 not 调用者中的指针本身。对指针**node *&amp;head** 的引用也可以让您访问指针。就像其他引用定义一样:**node &amp;x** 提供对调用者变量的访问权限,**node x** 不提供。
  • 当您将节点的内容传回时,您可以轻松地进行以下实验:在您的 for 循环中获取结果:node other = insertFirst(first, i);,然后将其与内部附加行中的参数进行比较for 循环:cout &lt;&lt; i &lt;&lt; ": value: " &lt;&lt; first-&gt;data &lt;&lt; " expected: " &lt;&lt; other.data &lt;&lt; endl;。使用定义为node *head 的参数,您将获得不同的值。 ;-)
  • 现在问你的问题:在你的 insertLast 函数中,prev 永远不会为空,所以head 永远不会改变。
【解决方案2】:

我认为 SHR 想要提及的是您更改代码,例如

node* insertFirst(node *head, int newData){
    node *temp = new node;
    temp -> data = newData;
    temp -> next = head;
    return temp;
}

以后你可以通过调用它

for(i = 1; i <= 10; i++){
    first = insertFirst(first, i);
}

所以函数总是返回一个指向列表中第一个对象的指针。

【讨论】:

    【解决方案3】:

    in node insertFirst(node *head, int newData) head 在参数中,而不是在 out 中。

    因此在main 它没有被改变。

    以更新first 值的方式使用first = insertFirst(first, i);

    【讨论】:

    • for(i = 1; i
    • 更改原型返回node*
    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多