c ++类中的链表实现,显示了Segmentation fault

时间:2017-03-02 18:41:48

标签: c++ pointers constructor linked-list doubly-linked-list

我知道在这个while循环中发生了分段错误:(while(temp != NULL){temp = temp->next;}),但我不明白为什么。

#include<iostream>

using namespace std;

class zDepthList {

        typedef struct node {
                int data;
                node* next;
                node* prev;
        } Node;

public:

        zDepthList() {
                head = NULL;
        }

        zDepthList(int array[], int length) {

                Node *temp, *ptr;
                int i = 0;

                while(i != length - 1) {
                        temp = head;
                        ptr = new Node;
                        ptr->data = array[i];
                        i++;
                        ptr->next = NULL;

                        if(head == NULL) {
                                head = ptr;
                                ptr->prev = NULL;
                        }

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

        void out(const char order) {

                cout << head->data << endl;

        return;
        }

private:
        Node *head;
};

2 个答案:

答案 0 :(得分:1)

您永远不会设置head,但您可以访问它。这意味着它是未初始化的,这是一个UB。

你有2个ctors,只有在没有任何参数的情况下调用它时才初始化head

答案 1 :(得分:1)

对于初学者,您必须将head初始化为NULL

此后循环

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

指针temp等于NULL,因为它是中断循环的条件。因此这句话

                    temp->next = ptr;

导致未定义的行为。

如果你有一个双链表,那么自然也要引入数据成员tail,这样可以很容易地添加新节点。

所以你应该包括

class zDepthList {
//...
private:
        Node *head, *tail;
};

在这种情况下,构造函数可以按以下方式查找

    zDepthList() : head( nullptr ), tail( nullptr )
    {
    }

    zDepthList( const int a[], size_t n ) : head( nullptr ), tail( nullptr )
    {
        for ( size_t i = 0; i < n; i++ )
        {
            Node *tmp = new Node { a[i], nullptr, tail };
            tail == nullptr ? head = tmp : tail->next = tmp;
            tail = tmp;
        }
    }

这是一个示范程序

#include <iostream>

class zDepthList {

    typedef struct node {
        int data;
        node* next;
        node* prev;
    } Node;

public:

    zDepthList() : head(nullptr), tail(nullptr)
    {
    }

    zDepthList(const int a[], size_t n) : head(nullptr), tail(nullptr)
    {
        for (size_t i = 0; i < n; i++)
        {
            Node *tmp = new Node{ a[i], nullptr, tail };
            tail == nullptr ? head = tmp : tail->next = tmp;
            tail = tmp;
        }
    }


    std::ostream & out( std::ostream &os = std::cout ) const
    {
        for (Node *current = head; current; current = current->next)
        {
            os << current->data << ' ';
        }

        return os;
    }

private:
    Node *head, *tail;
};

int main()
{
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    zDepthList l(a, sizeof(a) / sizeof(*a));

    l.out() << std::endl;
}

程序输出

0 1 2 3 4 5 6 7 8 9