删除链表节点,C++函数不起作用

deleting a linked list node, C++ function not working

本文关键字:函数 不起作用 C++ 链表 节点 删除      更新时间:2023-10-16
#include <iostream>
using namespace std;
class List {
public:
    struct node {
        int data;
        node *next;
    };
    node* head = NULL;
    node* tail = NULL;
    node* temp = NULL;
    node* prev = NULL;
public:
    void addNum(int num) {
        temp = new node;
        temp->data = num;
        temp->next = NULL;
        if (head == NULL) {
            head = temp;
            tail = temp;
        }
        else {
            tail->next = temp;
            tail = temp;
        }
    }
    void PrintList() {
        temp = head;
        while (temp != NULL) {
            cout << temp->data << endl;
            temp = temp->next;
        }
    }
    void DelNum(int num) {
        temp = head;
        while (temp != NULL) {
            if (temp->data == num) {
                prev->next = temp->next;
                free(temp);
            }
            temp = prev;
            temp = temp->next;
        }
    }
};
int main() {
    List list;
    list.addNum(1);
    list.addNum(2);
    list.addNum(3);
    list.addNum(4);
    list.addNum(5);
    list.addNum(6);
    list.DelNum(3);
    list.PrintList();
    return 0;
}

我的 DelNum 函数出了什么问题?当我运行程序时,没有任何弹出。我输入什么数字并不重要。

正如 mss 指出的那样,问题出在你分配temp = prev;的 DelNum() 函数中。在初始化中,您定义了该node* prev = NULL;因此,prev = NULL当您将其分配给 temp 时,当您尝试像 temp = temp->next 一样使用它时会导致分段错误;

DelNum 函数中存在两个主要问题:

首先,当您处于 while 循环中时,您应该分配

prev = temp; 

其次,当你找到目标元素时,删除它后你必须脱离循环,这在你的代码中没有完成。

下面是您更正的代码(还更正了 DelNum 函数中的其他一些极端情况):

#include <iostream>
using namespace std;
class List {
public:
    struct node {
        int data;
        node *next;
    };
    node* head = NULL;
    node* tail = NULL;
    node* temp = NULL;
    node* prev = NULL;
public:
    void addNum(int num) {
        temp = new node;
        temp->data = num;
        temp->next = NULL;
        if (head == NULL) {
            head = temp;
            tail = temp;
        }
        else {
            tail->next = temp;
            tail = temp;
        }
      cout<<num<<" is added n";
    }
    void PrintList() {
        temp = head;
        while (temp != NULL) {
            cout << temp->data << endl;
            temp = temp->next;
        }
    }
        void DelNum(int num) {
        if(head==NULL)//empty
        {
            cout<<"empty linked list, can't be deletedn";
            return;
        }
        if(head->next==NULL)//means only one element is left
        {
            if(head->data==num)
            {
                node * fordelete=head;
                head=NULL;
                cout<<num<<"is deletedn";
                delete(fordelete);
            }
            else
            {
                cout<<"not found , can't be deletedn";
            }
            return;
        }
       temp = head;  // when more than one element are there
       prev = temp;
        while (temp != NULL) {
            if (temp->data == num) {
                prev->next = temp->next;
                free(temp);
            cout<<num<<" is deletedn";
                break;
            }
            prev= temp;
            temp = temp->next;
        }
        if(temp==NULL)
        {
            cout<<"not found, can't be deletedn";
        }
    }
};
int main() {
    List list;
    list.addNum(1);
    list.addNum(2);
    list.addNum(3);
    list.addNum(4);
    list.addNum(5);
    list.addNum(6);
    list.PrintList();
    list.DelNum(3);
    list.DelNum(7);
    list.PrintList();
    return 0;
}

我希望它能帮助你。