簡體   English   中英

訪問沖突讀取位置0xC0000005 C ++

[英]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 ++;
            }
        }

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

您還將兩個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 ++;

iffirst->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 幾乎所有 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM