Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;删除链接列表断点错误_C++_Linked List_Singly Linked List - Fatal编程技术网

C++ C++;删除链接列表断点错误

C++ C++;删除链接列表断点错误,c++,linked-list,singly-linked-list,C++,Linked List,Singly Linked List,嘿,我正在尝试制作一个链表,该链表显示从开始到结束添加元素所需的时间。然后从开头和结尾删除。我有添加和删除的代码,但是当我从列表中删除最后一个元素时,我得到了一个关于内存分配的断点错误。我猜当列表为空时,我需要添加一个故障保护,但我不知道如何做 一些建议将不胜感激,因为我对这一点非常陌生 谢谢 列表类的我的代码: class list { public: struct node { int data; struct node* next; } *h

嘿,我正在尝试制作一个链表,该链表显示从开始到结束添加元素所需的时间。然后从开头和结尾删除。我有添加和删除的代码,但是当我从列表中删除最后一个元素时,我得到了一个关于内存分配的断点错误。我猜当列表为空时,我需要添加一个故障保护,但我不知道如何做

一些建议将不胜感激,因为我对这一点非常陌生

谢谢

列表类的我的代码:

class list
{
public:
    struct node {
        int data;
        struct node* next;
    } *head, *tail;

    list() :head(NULL), tail(NULL) {}   // constructor  

    ~list() {
        node* current, * temp;
        current = head;
        temp = head;
        while (current != NULL) {
            current = current->next;
            delete temp;
            temp = current;
        }
    }

    // adding to the end of list  
    void addToEnd(int n) {
        node* newNode = new node;
        newNode->data = n;
        newNode->next = NULL;

        if (head == NULL) {
            head = newNode;
            return;
        }
        node* cur = head;
        while (cur) {
            if (cur->next == NULL) {
                cur->next = newNode;
                return;
            }
            cur = cur->next;
        }
    }
    
    //Add to beginning
    void addToBeginning(int n) {
        node* newNode = new node;
        newNode->data = n;
        newNode->next = NULL;

        if (head == NULL) {
            head = newNode;
            return;
        }
        else {
            newNode->next = head;
            head = newNode;
        }
        
    }

    void deleteFromBeginning() {
        if (head != NULL) {
            node* temp = head->next;
            delete head;
            head = temp;
        }
        if (head == NULL) {
            cout << "Nothing to delete" << endl;
            return;
        }
    }

    void deleteFromEnd() {
        node* removeLastNode = head;
            if (head == NULL)
                return;

            if (head->next == NULL) {
                delete head;
                return;
            }

            // Find the second last node 
            node* second_last = head;
            while (second_last->next->next != NULL)
                second_last = second_last->next;

            // Delete last node 
            delete (second_last->next);

            // Change next of second last 
            second_last->next = NULL;

        }

    //Display List
    void displayList() {
        if (head != NULL) {
// This was also triggering an access violation error when I tried to run this after the delete loop
            for (node* temp = head; temp != NULL; temp = temp->next) { 
                cout << temp->data << " ";
            }
            cout << endl;
        }
    }

};
int main() {
    int data;
    list myList;

    for (int i = 0; i < 10; i++){
        myList.addToBeginning(i);
    }
    myList.displayList();

    for (int i = 0; i < 5; i++) {
        myList.deleteFromBeginning();
    }
    myList.displayList();

    for (int i = 0; i < 10; i++) {
        myList.addToEnd(i);
    }
    myList.displayList();

    for (int i = 0; i < 15; i++) {
        myList.deleteFromEnd(); // Error comes here
    }
}
类列表
{
公众:
结构节点{
int数据;
结构节点*下一步;
}*头,*尾;
list():head(NULL),tail(NULL){}//构造函数
~list(){
节点*电流,*温度;
电流=水头;
温度=水头;
while(当前!=NULL){
当前=当前->下一步;
删除临时文件;
温度=电流;
}
}
//添加到列表的末尾
无效地址结束(整数n){
node*newNode=新节点;
newNode->data=n;
newNode->next=NULL;
if(head==NULL){
头=新节点;
返回;
}
节点*cur=头部;
while(cur){
如果(当前->下一步==NULL){
cur->next=newNode;
返回;
}
cur=cur->next;
}
}
//添加到开头
void addToBeginning(内部编号){
node*newNode=新节点;
newNode->data=n;
newNode->next=NULL;
if(head==NULL){
头=新节点;
返回;
}
否则{
新建节点->下一步=头部;
头=新节点;
}
}
void deleteFromStart(){
if(head!=NULL){
节点*temp=head->next;
删除标题;
压头=温度;
}
if(head==NULL){
cout next->next!=NULL)
second\u last=second\u last->next;
//删除最后一个节点
删除(倒数第二次->下一次);
//更改倒数第二的下一个
second_last->next=NULL;
}
//显示列表
void displayList(){
if(head!=NULL){
//当我尝试在删除循环后运行此操作时,这也触发了访问冲突错误
对于(节点*temp=head;temp!=NULL;temp=temp->next){

cout data必须检查列表中是否有多个项,然后启动while循环。当我只剩下1个节点时,它导致了一个问题

void deleteFromEnd() {
            node* temp;
            if (head == NULL)
            {
                cout << " There is no item to delete!" << endl;
                return;
            }
            node* start = head;
            if (start->next != NULL)
            {
                while ((start->next)->next != NULL)
                {
                    start = start->next;
                }
                temp = start->next;
                start->next = NULL;
            }
            else
            {
                temp = start;
                head = NULL;
            }
            delete temp;
        }
void deleteFromEnd(){
节点*温度;
if(head==NULL)
{
cout next)->next!=NULL)
{
开始=开始->下一步;
}
温度=开始->下一步;
开始->下一步=空;
}
其他的
{
温度=启动;
head=NULL;
}
删除临时文件;
}

“断点错误”-没有这类错误。您可能是指您在调试器中运行此程序,并且调试器在出现严重错误(可能是崩溃)时中断了执行检测到。各位,好消息!由于您正在使用调试器,因此可以检查变量的值以更好地了解出错的原因。请使用较小的调试器。您怀疑删除最后一个元素有问题。因此,请将
main
函数向下修剪,将单个元素添加到列表中,然后删除该元素。如果崩溃仍然存在,请删除不需要的所有代码,以支持此更简单的
main()
。异常:在将其从示例中删除之前,您可能需要查看
deleteFromStart()
。您可以在该函数中执行
deleteFromEnd()中缺少的一些操作
。我已经把它删减了,可能我还没有完全理解这里的指针是如何工作的。这是我仍然收到的消息:抛出异常:读取访问冲突。倒数第二个->下一个是nullptr。没关系,我已经解决了。我必须检查列表中是否有多个项目,然后启动while循环。您的修复看起来不错,但您的肛门没有问题ysis已关闭。如果列表只有一个项,则问题中此函数的版本也会跳过循环,通过行
if(head->next==NULL)
。因此更改不是固定的。此答案的关键改进是,在删除列表中的最后一项时更新
head
(通过分配
head=NULL
)。