簡體   English   中英

為什么我在 null 指針錯誤(鏈表)中獲得成員訪問權限

[英]why do I get member access within null pointer error (linked list)

以下是錯誤消息和我的鏈表代碼。 你能解釋一下為什么我會收到這個錯誤嗎?

“第 80 行:字符 21:運行時錯誤:null 類型‘節點’(solution.cpp)指針內的成員訪問摘要:UndefinedBehaviorSanitizer:未定義行為 prog_joined.cpp:85:21”

struct Node{
    int val;
    Node* prev;
    Node* next;
    Node(): val(-1), prev(nullptr), next(nullptr){}
    Node(int x): val(x), prev(nullptr), next(nullptr){}
};

class MyLinkedList {
private:
    Node* head;
    Node* tail;
    size_t size;
public:
    MyLinkedList() {
        head = new Node();
        tail = new Node();
        head->next = tail;
        tail->prev = head;
        size = 0;
    }
    
    int get(int index) {
        if(index < 0 || index > size) return -1;
        Node* temp = head->next;
        while(index--) temp = temp->next;
        return temp->val;
    }
    
    void addAtHead(int val) {
         Node* newNode = new Node(val);
         Node* next = head->next;

         next->prev = newNode;
         newNode->next = next;
         head->next = newNode;
         newNode->prev = head;
         size++;
    }
    void addAtTail(int val) {
        Node* last_node = new Node(val);
        Node* temp = tail->prev;
        
        temp->next = last_node;
        last_node->prev = temp;
        last_node->next = tail;
        tail->prev = last_node;
        size++;
    }
    
    void addAtIndex(int index, int val) {
        if(index < 0 || index > size+1) return;
        if(index == 0) addAtHead(val);
        else if(index == size+1) addAtTail(val);
        else{
            Node* index_node = new Node(val);
            Node* temp = head;
            while(index--) temp = temp->next;

            index_node->next = temp->next;
            temp->next->prev = index_node;
            temp->next = index_node;
            index_node->prev = temp;
            size++;
        }
    }
    
    void deleteAtIndex(int index) {
        if(index > size) return;
        Node* temp = head;
        while(index--) temp = temp->next;
        temp->next = temp->next->next;
        temp->next->prev = temp;
        size--;
    }
};

太感謝了

沒關系原來這個小家伙一直是問題:

 void addAtHead(int val) {
         Node* newNode = new Node(val);
         Node* next = head->next;

         next->prev = newNode;
         newNode->next = next;
         head->next = newNode;
         newNode->prev = head;
         size++;
    }

你初始化了tail to head next,但是在你的addToHead function中你從來沒有移動tail而是添加到head->next,所以在添加一次之后你的新節點將成為tail,並且在兩次迭代之后,你的新節點將超過你的tail,領先於你的尾巴。 然后你調用你的 addToTail function 所以當你這樣做時,tail->prev = last_node,記住 tail-prev 之前是什么:那是正確的頭,所以你將不再有頭節點,因此鏈被破壞了,下次你嘗試調用 addToHead,你找不到你的頭,你沒有指向它的指針,所以它崩潰了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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