【问题标题】:Inserting node at rear end in a singly linked list在单链表的后端插入节点
【发布时间】:2019-08-14 07:36:39
【问题描述】:

我正在编码在单个 LinkedList 的末尾插入一个节点。程序正在执行而没有任何错误,但在输入第一个数字后会运行无限循环。我在代码中找不到我犯的逻辑错误。任何帮助都将是可观的:)。

这是代码和我尝试过的:

#include<bits/stdc++.h>
using namespace std;
struct node{
    int data;
    node* next;
};
node* head = NULL; // empty list
node* temp;
void insert(int x){
    temp = (node*)malloc(sizeof(node));
    temp -> data = x;
    temp -> next = NULL;
    if (head == NULL) head = temp; 
    node* temp1 = head;
    // traversing the list
    while(temp1 -> next != NULL){
    temp1 = temp1 -> next;
    }   
    temp1 -> next = temp;
}
void print(){
    node* iterator = head;
    while(iterator != NULL){
        cout << iterator -> data;
        iterator = iterator -> next;
    }
}
int main(){
    int n, x;
    cout << "how many numbers\n";
    cin >> n;
    for(int i = 0; i < n; i++){
        cout << "enter the value";
        cin >> x;
        insert(x);
        print();
    }
    return 0;
}

我希望输出是一个链表,但 o/p 是无限数量的第一个输入的数字/数据(在本例中为“x”)

【问题讨论】:

  • 使用new分配新节点,并使用构造函数正确初始化成员变量。特别是next 必须用NULL 进行初始化(或者使用nullptr 更好)。
  • 这很有趣Program is executing without any errorsrunning an infinite loop after entering the very first number.
  • @πάνταῥεῖ 用你的方法试过了,还是死循环。你介意在你的机器上执行代码吗?
  • @HikkiGOAT 你介意用调试器检查你的代码吗?
  • @πάνταῥεῖ 哦!所以我必须去看一些关于调试的在线教程。谢谢你的建议:)

标签: c++ linked-list singly-linked-list


【解决方案1】:

insert 函数的逻辑显然是错误的

让我们一步一步来。

首先分配节点并将其分配给temp。由于这是 C++,你应该使用 new 并且你应该使用构造函数,但我们会让它通过。

那么由于head 等于NULL,你将head 设置为temp

然后将temp1 设置为head,因为上一步意味着temp1 等于temp

然后循环到temp1 指向的最后一个节点。在这种情况下,您已经在最后一个节点,因此不会进入循环。

然后您将temp1-&gt;next 设置为temp,但请记住temp1 等于temp,(参见前面的两个步骤),所以现在您已经创建了一个循环列表。这解释了你的无限循环。

我猜你是想写这个

if (head == NULL) { head = temp; return; }

或者这个

if (head == NULL)
{
    head = temp; 
}
else
{
    ...
}

【讨论】:

  • 非常感谢,兄弟。我打算写第二个sn-p。 “返回”是什么意思?在第一个sn-p是什么意思?我为什么要使用构造函数?非常感谢您澄清问题:)
  • return 将在此时立即退出该函数。因此,这与您的意图之间的区别只是风格问题。
  • 使用new 而不是malloc 实际上更重要。 newmalloc 之间的主要区别在于 new 将为正在创建的对象(如果存在)调用构造函数,但 malloc 不会。因此,使用malloc 您最终可能会得到未构造的对象,这通常是个坏消息,尽管在这种情况下并不重要。
  • 至于为什么要使用构造函数,只是对象的初始化方式很重要,在面向对象的编程中你想要控制这个过程,而在C++中构造函数就是你这样做的方式。随着您获得更多经验,对它们的需求将变得更加清晰,但现在养成良好习惯并没有什么坏处。
  • @john 我知道 c++ 现在使用“new”,每当我们创建一个新节点时,new 都会调用构造函数,然后构造函数将初始化数据字段。我在想除了这个之外使用构造函数还有另一个原因。实际上,我正在关注的教程使用 malloc 来提供有关如何动态分配内存块的深入知识。是的,也感谢您澄清这一点:)。
猜你喜欢
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
相关资源
最近更新 更多