删除节点时的分割故障

Segmentation Fault in deleting a node

本文关键字:分割 故障 节点 删除      更新时间:2023-10-16

我有一个C 代码,该代码只能操纵基本链接列表 - 添加一个新节点,删除一个节点并查看列表

//UNIX Environment
#include <iostream>
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
#define clear() printf("33[H33[J")
using namespace std;
struct node
{
    int val;
    node *next;
};
struct node* head = NULL;
void add_node(struct node *hea)
{
    char f;
    int val;
    cout<<"Enter value : ";
    cin>>val;
    if(head==NULL)
    {
        head = new(struct node);
        head->val = val;
        head->next = NULL;
    }
    else
    {
        node *traverser = hea;
        node *traverser_prev = NULL;
        while(traverser!=NULL)
        {
            traverser_prev = traverser;
            traverser=traverser->next;
        }
        traverser = new(struct node);
        traverser->val = val;
        traverser->next = NULL;
        traverser_prev->next=traverser;
    }
    cout<<"nEnter Y to return : ";
    cin>>f;
    while(f!='Y')
    {
        cout<<"Wrong entry.Enter again : ";
        cin>>f;
    }
    return;
}
void view_list(struct node *hea)
{
    char f;
    node *traverser = hea;
    while(traverser!=NULL)
    {
        cout<<traverser->val<<" ";
        traverser=traverser->next;
    }
    cout<<"nEnter Y to return : ";
    cin>>f;
    while(f!='Y')
    {
        cout<<"Wrong entry.Enter again : ";
        cin>>f;
    }
    return;
}
void delete_node(node *hea)
{
    char f;
    int del_value;
    cout<<"Enter value to be deleted :";
    cin>>del_value;
    node *traverser = hea;
    cout<<"OK1n";
    node* traverser_prev = NULL;
    cout<<"OK2n";
    while(traverser!=NULL)
    {
        if(traverser->val==del_value)
        {
            if(traverser==hea)
            {
                hea=traverser->next;
                cout<<"Here cond1n";
                delete traverser;
            }
            else
            {
                traverser_prev->next = traverser->next;
                cout<<"Here cond2n";
            }
        }
        else
        {
            traverser_prev = traverser;
            traverser = traverser->next;
            cout<<"Here cond3n";
        }
    }
    cout<<"nEnter Y to return : ";
    cin>>f;
    while(f!='Y')
    {
        cout<<"Wrong entry.Enter again : ";
        cin>>f;
    }
    return;
}
int main(int argc, char* argv[])
{
    while(1)
    {
        clear();
        int choice;
        cout<<"POINTER BASICSn";
        cout<<"1. Add new elementn";
        cout<<"2. View elementsn";
        cout<<"3. Delete elementn";
        cout<<"4. Exitn";
        cout<<"Enter choice: ";
        cin>>choice;
        switch(choice)
        {
            case 1: add_node(head);
                    break;
            case 2: view_list(head);
                    break;
            case 3: delete_node(head);
                    break;
            default:break;
        }
        if(choice==4)
            break;
    }
}

但是,每当我尝试删除节点时,它都会给我带来一个细分故障错误,而core倾倒了。错误的原因是什么?

一个问题是,在 delete_node函数中,您通过value 传递列表头,这意味着指针是复制的,并且内部是内部的您仅修改副本的功能。

有两种解决方案:要么根本不使用参数,只使用全局变量,或者通过参考:

传递参数
void delete_node(node*& hea)

当您执行行

时,有可能

traverser_prev->next = traverser->next;

traverser_prev == null?