访问冲突读取位置0xC0000005 C++

Bdk*_*nna 1 c++

我的添加功能显然有一个问题,因为它首先解除引用,因此首先指向什么.我只是不知道如何修复它,以便它不是一个空指针.

    struct Node
    {
        int data;
        Node *next;
    };

    class LinkedList
    {
        Node *first;
        Node *last;
        int count;
        public:

        LinkedList()
        {
            first = NULL;
            last = NULL;
            count = 0;
        }


        void Add(int item)
        {
            if (first == NULL)
            {
                first->data = item;
                last->data = item;
                last->next = NULL;
                first->next = last;
                count = 1;
            }
            else
            {
                Node *newNode = new Node;
                newNode->data = last->data;
                newNode->next = last;
                last->data = item;
                last->next = NULL;
                count ++;
            }
        }
Run Code Online (Sandbox Code Playgroud)

Dre*_*ann 6

if和它之间有很多共同的代码else.

        if (first == NULL)
        {
            first->data = item;
            last->data = item;
            last->next = NULL;
            first->next = last;
            count = 1;
        }
        else
        {
            Node *newNode = new Node;
            newNode->data = last->data;
            newNode->next = last;
            last->data = item;
            last->next = NULL;
            count ++;
        }
Run Code Online (Sandbox Code Playgroud)

if,你count从增量01.在else,你增加它.

count始终得到增加.所以你不需要输入两次.

        if (first == NULL)
        {
            first->data = item;
            last->data = item;
            last->next = NULL;
            first->next = last;
        }
        else
        {
            Node *newNode = new Node;
            newNode->data = last->data;
            newNode->next = last;
            last->data = item;
            last->next = NULL;
        }
        count ++;
Run Code Online (Sandbox Code Playgroud)

你也last->data准备item在他们两个.

而你正last->next准备NULL参与其中.

        if (first == NULL)
        {
            first->data = item;
            first->next = last;
        }
        else
        {
            Node *newNode = new Node;
            newNode->data = last->data;
            newNode->next = last;
        }
        last->data = item;
        last->next = NULL;
        count ++;
Run Code Online (Sandbox Code Playgroud)

您还忘记创建new Node第一个新节点时.

        if (first == NULL)
        {
            Node *newNode = new Node;   // Added
            first = newNode;            // Added
            last = newNode;             // Added
            first->data = item;
            first->next = last;
        }
        else
        {
            Node *newNode = new Node;
            newNode->data = last->data;
            newNode->next = last;
        }
        last->data = item;
        last->next = NULL;
        count ++;
Run Code Online (Sandbox Code Playgroud)

first->data = item你的if是多余的. firstlast那里一样,并且last->data = item已经发生了.

        if (first == NULL)
        {
            Node *newNode = new Node;
            first = newNode; 
            last = newNode;
            // Removed
            first->next = last;
        }
        else
        {
            Node *newNode = new Node;
            newNode->data = last->data;
            newNode->next = last;
        }
        last->data = item;
        last->next = NULL;
        count ++;
Run Code Online (Sandbox Code Playgroud)

而且,由于firstnewNode具有相同的价值在于if,我们可以交替使用的变量名.

        if (first == NULL)
        {
            Node *newNode = new Node; 
            first = newNode;            // These two pointers are equal!
            last = newNode;
            newNode->next = last;       // (same pointer)
        }
        else
        {
            Node *newNode = new Node;
            newNode->data = last->data;
            newNode->next = last;
        }
        last->data = item;
        last->next = NULL;
        count ++;
Run Code Online (Sandbox Code Playgroud)

现在,你身上的几乎所有东西都在你else的身上if.它可以搬出去.

        Node *newNode = new Node; 
        if (first == NULL)
        {
            first = newNode;
            last = newNode;
        }
        else
        {
            newNode->data = last->data;
        }
        newNode->next = last;
        last->data = item;
        last->next = NULL;
        count ++;
Run Code Online (Sandbox Code Playgroud)

那个代码现在也应该更容易理解.教训:不要重复自己.:)