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