【问题标题】:Add node to Front of Linked List then count number of nodes in Linked List将节点添加到链表的前面,然后计算链表中的节点数
【发布时间】:2019-12-16 17:37:58
【问题描述】:

我想通过调用一个对象在列表的前面添加一个节点并打印列表的长度。到目前为止,我一直遇到分段错误。我想要一些足够基本的东西,以便我可以从以下方面构建想法:

#include <iostream>

using namespace std;

class Node {
  public:
    int data;
    Node *next; //creating a pointer to store the address of the next node or null (at the end of a linked list)
   int key;

    Node(int d){
        data = d;
        next = NULL;
        key = -1;
    }
};

class LinkedList {
public:
    Node *head;
    LinkedList (){
        head = NULL;

    }

    void addNodetoFront(int data){
        Node *n = new Node(data);//allocate memory on the heap with address that is returned to n (pointer)


        n->next=head;
        head=n;


        if(n != NULL){
            n->key = n->next->key+1;
        }
        else{
            n->key = 1;
        }
    }

};

int main(){
    LinkedList linkedlist;

    linkedlist.addNodetoFront(2);
    linkedlist.addNodetoFront(3);
    linkedlist.addNodetoFront(4);
    linkedlist.addNodetoFront(5);
    linkedlist.addNodetoFront(26);
    linkedlist.addNodetoFront(27);
    linkedlist.addNodetoFront(9);
    linkedlist.addNodetoFront(45);
    linkedlist.addNodetoFront(87);

    return 0;
}

期望是9个节点的链表,程序打印9个元素。

【问题讨论】:

  • 想想当你添加第一个元素时addToFront做了什么。

标签: c++ class linked-list


【解决方案1】:

您的 head 以 NULL 开头。添加第一个节点时,该节点成为头,其next 指针变为NULL。现在,看看这个:

if(n != NULL){
    n->key = n->next->key+1;  // But n->next is NULL :(
}

在上面,n-&gt;next-&gt;key 是未定义的行为,因为您正在取消引用 NULL 指针。此外,虽然 n 实际上不可能为 NULL,但如果 n 假设 可能为 NULL,则以下逻辑很疯狂:

else{
    n->key = 1;  // But you said n was NULL :(
}

唯一有意义的方法是,如果您在测试中确实有错字,并且您的意思是:

if(n->next != NULL)

把这些放在一起,你的函数看起来像这样:

void addNodetoFront(int data)
{
    Node *n = new Node(data);

    n->next = head;
    head = n;

    if (n->next != NULL) {
        n->key = n->next->key + 1;
    } else {
        n->key = 1;
    }
}

或者,以下更紧凑的样式实现完全相同:

void addNodetoFront(int data)
{
    Node *n = new Node(data);
    n->next = head;
    n->key = (head ? head->key + 1 : 1);
    head = n;
}

【讨论】:

  • 如果链表中只有一个节点,那么 head 将指向 null。但是如果创建了一个新节点,那么头部应该设置为新节点,那么我当然认为如果你这样做你会丢失链表
  • “如果你这样做了,你会丢失链表” ...如果你做了什么? head 是列表的第一个元素。当您将head 替换为n 时,您已经设置了n-&gt;next = head,它会保留整个列表,使其跟随新节点。您的崩溃与包含项目的列表无关。这与列表何时为空并且您尝试添加内容完全相关。
  • 所以当我在 main 中调用对象时,列表没有被创建?
  • 我不明白你的问题。您正在创建一个列表。在您最初的问题中,您在尝试此操作时遇到了崩溃。我回答是为了告诉你你哪里出错了。现在我对你的回答感到困惑。您是否按照我的建议进行了修复?
  • 你是说通过改变条件来解决?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 2022-08-17
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多