【问题标题】:Why does temp->next!=NULL work while temp!=NULL doesn't in Linked List in C++为什么 temp->next!=NULL 起作用,而 temp!=NULL 在 C++ 的链表中不起作用
【发布时间】:2016-08-20 07:26:28
【问题描述】:

为什么下面的代码不起作用?据我所知,当 temp 达到 NULL 时,(new)ing 它应该创建一个 temp 指向它的新节点。奇怪的是,将 while 条件更改为 temp->next!=NULL 效果很好。对此有何解释?

    #include<iostream>

using namespace std;


class node{
    int data;
    node *next;
public:
    node(){}
    node(int value):data(value),next(NULL){}
    void addNode(node *head,int value){
        node *temp=head;
        while(temp!=NULL){
            temp=temp->next;
        }
        temp=new node(value);
        temp->next=NULL;
    }
    void display(node *head){
        node *temp=head;
        while(temp!=NULL){
            cout << temp->data << endl;
            temp=temp->next;
        }
    }
};


int main(int argc,char** argv){
    node *head=new node(15);
    head->addNode(head,50);
    head->addNode(head,22);
    head->display(head);
    cin.ignore();
    return 0;
}

【问题讨论】:

  • 定义“不起作用”并添加mcve
  • 另外,node *temp=new node; 正在泄漏内存。
  • 你有一个内存泄漏node *temp=new node;然后你用temp=head;扔掉了指针
  • 什么是头?它是在哪里定义的?
  • @Drop 数据没有被添加到列表中

标签: c++ linked-list


【解决方案1】:

粘贴的代码有很多错误。 如果您想在这里添加一些东西到链表末尾,您首先需要找到列表末尾(就像您尝试在您的代码中做的那样),但是您在开头有极端情况,其中 head 为 NULL。假设 head 不为 NULL。

首先我们找到列表中的最后一个节点

node * tmp = head;
while(tmp->next != NULL){
tmp = tmp->next
}

现在我们有了列表中的最后一个节点。我们分配新的并填充它

tmp->next = new node;
tmp = tmp->next;
tmp->x = data;
tmp->next = NULL;

为什么你的循环不会停止。可能是那个 head 没有初始化并且你在列表中有一个循环(只是你旅行的记忆中的一个地方)

用头加可以为空。

if(tmp != null){
    while(tmp->next != NULL){
    tmp = tmp->next
    }
    tmp->next = new node;
    tmp = tmp->next;
} else {
    head = tmp = new node;
}

【讨论】:

  • 很抱歉,如果不添加完整的代码会使所有人感到困惑,但我确实做到了。我唯一的问题是在添加新节点时,为什么 tmp->next!=NULL 在 while 循环条件中有效,而 tmp!=NULL 无效?您可以在添加新节点的函数中尝试这样做吗?感谢您的回复!
  • 现在我已经对其进行了编辑并将 temp!=NULL 而不是 temp->next!=NULL 条件放在 addNode() 函数的 while 循环中。现在不行了。
【解决方案2】:

Stackoverflow 不允许我发布图片..因为我是新用户.XD

First See this Image

因此,当您完成循环时: while(temp!=NULL)你最终如图所示。

现在当你输入代码时:

temp=新节点(值); temp->next=NULL;

它在堆上为 temp 分配一些内存,并且与您的链表无关。因此,每当您使用链表时,建议您只分配由您的类变量组成的指针(在本例中为next)。

毕竟temp 只是一个临时变量,只是指向链表的节点并为其分配内存无论如何都不会改变链表。 所以,总是像使用temp-&gt;next 一样分配。不仅用于分配连接,还用于转移连接。

这就是您的代码无法按预期方式运行的原因。

【讨论】:

  • 通过设置temp=head,temp指向head,temp->next指向head->next对不对?那么,为什么分配临时的 temp->next 与分配 temp 不同呢?应该在内存中创建一个节点,当它到达与 temp->next 相同的点(也是 NULL)时,temp 指向(NULL)。感谢您的回复!
  • temp->next 绝不是临时的(在某种意义上它会影响链表)。设置 temp=head 并更改 temp->next 将更改链接,但将堆中的新节点分配给 temp 不会更改链接列表。需要注意的是 next 是连接链表的唯一变量,没有别的。
  • 哦,当然!我在考虑变量而不是指针。设置 temp=head 使 temp 指向任何 head 指向的点,这绝不是临时的,并且连接到链接列表。感谢您的澄清!
  • 顺便说一句,Java 中的引用与 C++ 中的指针的工作方式相同吗?我问这个是因为我在 Java 中创建链接列表时也是如此。
  • 虽然我不太懂java。
【解决方案3】:

您正在使用pointersQueue 实现为linked list。当您在 Queue/linked list 的末尾插入一个新节点时,您需要找到列表的最后一个节点,以便您的 temp 指针(用于遍历列表)指向列表和temp-&gt;next 指向NULL。然后你可以使用temp-&gt;next = new node(value);插入新节点,之后不需要temp-&gt;next = NULL;这一行,因为在创建新节点时已经在构造函数中完成了。

如果您使用条件temp!=NULL,那么temp 将遍历整个列表并最终指向最后一个节点的next,而不是指向列表的最后一个节点/元素(这就是您需要)。 temp 不会与您的队列/链接列表有任何联系。这就是为什么你需要条件

while(temp->next!=NULL){
     temp = temp->next;
}

在您的 addNode 函数中。我在下面修改了你的函数:

void addNode(node *head,int value){
     node *temp=head;
     while(temp->next!=NULL){
          temp=temp->next;
     }
     temp->next=new node(value);
}

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 2013-02-17
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多