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

标签 c++

我的 add 函数显然有问题,因为它首先取消引用,然后首先指向任何内容。我只是不知道如何修复它,使其不是空指针。

    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 ++;
            }
        }

最佳答案

ifelse 之间有很多共同的代码。

        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 ++;
        }

if 中,您将 count0 递增到 1。在 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 ++;

您还在它们中将 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 ++;

当它是第一个新节点时,您还忘记了创建一个新节点

        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 ++;

if 中的 first->data = item 是多余的。 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 ++;

并且由于 firstnewNodeif 中具有相同的值,我们可以使用变量名可互换。

        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 ++;

现在,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 ++;

该代码现在也应该更容易理解了。教训:Don't Repeat Yourself . :)

关于c++ - 访问冲突读取位置 0xC0000005 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15892477/

相关文章:

c++ - 在 API 和应用程序线程之间共享数据

c++ - Stack使用Struct或Class实现其私有(private)数据

c++ - 为什么 long 和 long long 的最大值产生相同的输出?

c++ - try block 中一条语句中的异常是否会导致控制流绕过 try block 中的任何剩余语句?

c++ - 限制用户输入的字符数

c++ - 将 C++ builder 6 项目转换为 C++ builder 2010

c++ - Visual C++ 2010 - 转换 10 GB BYTE 数组的最快方法?

c++ - 使用顶点缓冲对象的 OpenGL 快速纹理绘制。这是这样做的方法吗?

C++类返回对自身的引用

c++ - 我需要释放推力返回的 device_ptr 吗?