[英]Access violation reading location 0xC0000005 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 ++;
}
}
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 ++;
您還將兩個item
中的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 ++;
當它是第一個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 ++;
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
幾乎所有 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 ++;
該代碼現在也應該更容易理解。 本課: 不要重復自己 。 :)
if (first == NULL)
{
/* if first is NULL dereference it. Hooray! */
first->data = item;
...
看看鏈表
很少有細節, first == NULL
需要首先創建first == NULL
,然后將其插入到鏈表中並進行連接,有關某些算法,請參閱鏈條。
我想說的最簡單的是帶有頭節點(而不是first *
)的單個鏈表,它可以指向自身,但實現鏈表的方法有很多,這取決於您選擇如何連接元素。
這取決於您要執行的操作,但是如果您只需要某些工作,則可以從增強型侵入式循環slist算法中學習 ,在其中您可以使用數據和next指針定義自己的結構,告訴它如何訪問next並使用提供的算法來執行所有工作(鏈接和取消鏈接節點)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.