双向链表错误



我试图向后显示一个双向链表,但每次我尝试运行任何东西时,甚至远程触摸程序中的"prev"指针,我都会得到一个 seg 错误。我已经试图解决这个问题大约 4 个小时了,但我似乎无法确定它。我无法判断问题来自我的向后打印函数还是来自实际的 prev 指针本身。

#include <iostream> 
#include "list.h"
LinkedList::LinkedList(){
    head = NULL;
    tail = NULL;     
};
bool LinkedList::addAtBeginning(int val){
    Node *upd8L = head; // This Node will update Last
    Node *upd8 = head;;  // This Node will update the previous pointers
    Node *point = new Node(); // This Node will insert the new node at the beginning
    point->data=val;      // This sets the data in the new node
    point->next=head;         // This sets the next pointer to the same as head
    head = point;         // This sets the head to the new Node
    while(upd8){
    upd8 = upd8->next;
    upd8->prev = upd8L;
    upd8L=upd8L->next; 
    }
return true; 
};
bool LinkedList::remove(int val){
    Node *temp = head;
    Node *trail = 0;
    while(temp != NULL){
        if(temp->data == val){
            if(temp->next == head->next){
            head = head->next; 
            }else{
            trail->next = temp->next; 
            }
        delete temp; 
        }   
    trail = temp; 
    temp = temp->next;
    }
return true; 
};
void LinkedList::printForward() const{
    Node *temp; 
    temp = head;
    while(temp){
        cout << temp -> data << endl;
        temp = temp->next; 
        }
};
void LinkedList::printBackward() const{
    Node *temp = head; 
    while(temp){
    temp = temp->next;
    cout << temp->data << endl;
    }
    while(temp){
    cout << temp->data;
    cout << "Pop" << endl;
    temp = temp-> prev;
    }
};

如果可能的话,我希望有一个关于是什么困扰我的程序的解释,而不仅仅是一个直接的答案,我想知道我做错了什么以及为什么是错误的。谢谢!

编辑这是列表。

#ifndef LIST_H
#define LIST_H
#include <iostream>
using namespace std;
class LinkedList
{
private:
    struct Node
    {
        int data;
        Node * next;
        Node * prev;
    };
    Node * head, * tail;
public:
    LinkedList();
    bool addAtBeginning(int val);
    bool remove(int val);
    void printForward() const;
    void printBackward() const;
};

#endif

函数printBackward()可能会导致循环的最后一次迭代中出现段错误。 while(temp)的意思是迭代,直到你把元素从列表中拿出来NULL。然后,temp = temp->next temp->next NULL的位置分配。现在,当您调用cout << temp->data << endl;时,您正在尝试从指针获取数据NULL。尝试更改顺序。首先显示节点数据,然后更改temp指针。举个例子:

void LinkedList::printBackward() const{
    Node *temp = head; 
    while(temp){
    cout << temp->data << endl;
    temp = temp->next;
    }

你做错了从NULL指针获取数据。

所以,经过大量的试验和错误,我弄清楚了!我遇到的最大问题是,每当我删除列表的元素时,我都无法更新节点的"prev"部分,因此每当我尝试向后读取列表时,我都会收到 seg 错误。

//put your implementation of LinkedList class here
#include <iostream> 
#include "list.h"
LinkedList::LinkedList(){
    head = NULL;
    tail = NULL;     
};
bool LinkedList::addAtBeginning(int val){
    Node *point = new Node(); // This Node will insert the new node at the beginning
    point->data=val;      // This sets the data in the new node
    point->next=head;         // This sets the next pointer to the same as head
    head = point;         // This sets the head to the new Node
    if(head->next != NULL){
        Node *temp = head->next;
        temp->prev = head;
        }
return true; 
};
bool LinkedList::remove(int val){
    Node *temp = head->next;
    Node *trail = head;  
    if(head->data ==val){
            head = head->next;
            head->prev = NULL; 
            delete trail;
            }else{
        while(temp != NULL){
            if(temp->data == val){
                if(temp->next != NULL){
                trail->next = temp->next;  
                delete temp;
                temp= temp->next;
                temp->prev=trail; 
                }else{delete temp;
                    trail->next = NULL;
                }
            }   
            trail = temp; 
            temp = temp->next;
        }
}   
return true; 
};
void LinkedList::printForward() const{
    Node *temp; 
    temp = head;
    while(temp){
        cout << temp->data << endl;
        temp = temp->next; 
        }
};
void LinkedList::printBackward() const{
    Node *temp = head; 
    while(temp->next != NULL){
    temp = temp->next;
    }
    while(temp->prev != NULL){
    cout << temp->data << endl;
    temp = temp->prev;
    }
    cout << head->data << endl;
};

最新更新