Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问违规读取位置0xC000 000 C++_C++ - Fatal编程技术网

访问违规读取位置0xC000 000 C++

访问违规读取位置0xC000 000 C++,c++,C++,我的add函数显然有一个问题,因为它首先是去引用的,而第一个函数没有指向任何东西。我只是不知道如何修复它,使它不是空指针 struct Node { int data; Node *next; }; class LinkedList { Node *first; Node *last; int count; public: LinkedLis

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

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

在if中,将计数从0增加到1。在else中,您还可以增加它

计数总是递增的。所以你不需要再打两次

        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 ++;
您还将最后->数据设置为它们中的项

        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 ++;
在这两个选项中都将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中的第一个->数据=项是多余的。第一个与最后一个相同,最后一个->数据=项已经发生

        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 ++;
由于first和newNode在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 ++;
现在,几乎所有的东西都在你的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 ++;

这段代码现在也应该更容易理解了。教训是:

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

在if中,将计数从0增加到1。在else中,您还可以增加它

计数总是递增的。所以你不需要再打两次

        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 ++;
您还将最后->数据设置为它们中的项

        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 ++;
在这两个选项中都将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中的第一个->数据=项是多余的。第一个与最后一个相同,最后一个->数据=项已经发生

        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 ++;
由于first和newNode在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 ++;
现在,几乎所有的东西都在你的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 ++;
这段代码现在也应该更容易理解了。教训是:

看一看

当first==NULL时,首先需要创建一些细节,将其插入链表并连接起来,有关一些算法,请参阅链接文章

我想说最简单的是带有标题节点的单链表,而不是第一个*可以指向自身,但是有很多方法可以实现链表,这取决于您选择什么来连接元素

这取决于您所追求的是什么,但如果您只是需要一些工作,那么您可以从中选择,您只需使用数据和下一个指针定义您自己的结构,告诉它如何访问下一个,并使用提供的算法来完成所有工作链接和取消链接节点。

看一看

当first==NULL时,首先需要创建一些细节,将其插入链表并连接起来,有关一些算法,请参阅链接文章

我想说最简单的是带有标题节点的单链表,而不是第一个*可以指向自身,但是有很多方法可以实现链表,这取决于您选择什么来连接元素


这取决于您所追求的是什么,但如果您只是需要一些工作,那么您可以从中选择,您只需使用数据和下一个指针定义自己的结构,告诉它如何访问下一个,并使用提供的算法来执行所有工作链接和取消链接节点。

如果您不希望首先为null,则将其指向某个对象。您已经知道如何创建else块中所示的节点,也知道如何创建:first=new Node;。条件语句表示如果first为null,则使用first。这是不正确的。如果为空,则不能使用first。你是认真的吗?再打开一个帖子怎么样?@BdkFivehunna我把你的问题回复到原来的形式。如果你有不同的问题,问一个新问题。不要替换现有的问题。这样做会使所有的评论和答案看起来毫无意义。@BdkFivehunna请停止替换您的问题。如果您不想首先为空,请将其指向某个对象。您已经知道如何创建else块中所示的节点,也知道如何创建:first=new Node;。条件语句表示如果first为null,则使用first。这是不正确的。如果为空,则不能使用first。你是认真的吗?再打开一个帖子怎么样?@BdkFivehunna我把你的问题回复到原来的形式。如果你有不同的问题,问一个新问题。不要替换现有的问题。这样做会使所有的评论和答案看起来都毫无意义。@BdkFivehunna请停止替换您的问题。我认为OP可能已经知道它正在首先取消引用,而第一个什么都没有指向,但不知道如何修复它。只需简单地将first=new Node@BdkFivehunna无论是否为空,您都需要一个新节点。@jamesdlin考虑到循环的else部分分配了一个新节点,这似乎不太可能。但是你永远不知道。@NikBougalis:实际上OP回复了这个答案,并证实了我所说的,但出于某种原因删除了评论。我很瘦
k OP可能已经知道它正在首先解引用,而first没有指向任何东西,但不知道如何修复它@BdkFivehunna无论是否为空,您都需要一个新节点。@jamesdlin考虑到循环的else部分分配了一个新节点,这似乎不太可能。但是你永远不知道。@NikBougalis:实际上,OP回复了这个答案,并证实了我所说的,但出于某种原因删除了评论。非常好的帖子,有大量的细节和很好的解释,所以OP可以跟进+1精彩的帖子,包含大量细节和良好的解释,以便OP跟进+1.