【问题标题】:Segmentation fault in C++ in printing linked list elementsC++中打印链表元素的分段错误
【发布时间】:2020-04-15 11:47:06
【问题描述】:

请帮忙。当我尝试打印此链接列表中的元素时,出现分段错误。 我首先声明一个类,插入和显示列表元素的函数是它的函数。 代码:

#include <iostream>
using namespace std;
struct node{
int data;
node *next;
 };
class ll{
node *head,*tail;
public:
void push(int x){
node *temp = new node;
temp->data = x;
temp->next = NULL;
if(head == NULL){
    head = temp;
    tail= temp;
}
else{
    tail->next = temp;
    tail= temp;

}
        }
void show(){
    node *n = head;
    while(n!=NULL){
        cout<<n->data<<"\n";
        n = n->next;
         }
  }

};
int main()
 {
ll a;
a.push(1);
a.push(2);
a.show();
return 0;
  }

【问题讨论】:

  • node* head; 不会将 head 初始化为 NULL。有时 C++ 实现会将变量归零,但这是一个不应该依赖的特性。

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


【解决方案1】:

数据成员head和数据成员tail都没有被nullptr初始化。所以程序有未定义的行为。

你可以写在类定义中

class ll{
node *head = nullptr, *tail = nullptr;
//...

记住结构节点应该是类ll的成员。例如

class ll{
    struct node{
       int data;
        node *next;
     } *head = nullptr,*tail = nullptr;

public:
    void push( int x ){
        node *temp = new node { x, nullptr };
        if( head == NULL ){
            head = tail = temp;
        }
        else {
            tail = tail->next = temp;
        }
    }
    //...

您可以在默认构造函数中初始化它们,而不是在类定义中初始化数据成员,例如

class ll{
    struct node{
       int data;
        node *next;
     } *head,*tail;

public:
    ll() : head( nullptr ), tail( nullptr ) {}
    // ...

此外,您至少需要定义析构函数并显式定义复制构造函数和复制赋值构造函数,或者将它们定义为已删除。例如

class ll{
    struct node{
       int data;
        node *next;
     } *head,*tail;

public:
    ll() : head( nullptr ), tail( nullptr ) {}
    ~ll() { /* must be defined */ }
    ll( const LL & ) = delete;
    ll & operator =( const ll & ) = delete;
    // ...

【讨论】:

    【解决方案2】:

    问题是您在创建列表时没有将head 设置为NULL。同样的问题适用于tail。这是构造函数的工作

    class ll {
        node *head,*tail;
    public:
        ll() { head = tail = NULL; }
        void push(int x) {
            ...
    

    【讨论】:

    • 在 C++ 中使用 NULL 是不好的做法,这也不使用初始化列表,并且作为默认值会更清晰
    • @LonesomeParadise OP使用了NULL,需要先了解构造函数,初始化列表会在后面。我在这个网站上的理念是,对于完全的初学者来说,最好一次只专注于一件事。
    • @john 好的,但是 OP 实际上并没有在他们的代码中使用构造函数,所以这两者都引入了他们可能不熟悉的东西(ctors)显示一种使用它们的方式,这是不好的做法和低效
    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2013-01-01
    相关资源
    最近更新 更多