我的 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 (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
中,您将 count
从 0
递增到 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
是多余的。 first
与 last
相同,并且 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 ++;
并且由于 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 ++;
现在,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/