Endless winds 2023-03-19 10:45 采纳率: 0%
浏览 139
已结题

c++写单链表,析构函数delete触发断点

c++写单链表,析构函数delete触发断点,如何修复?
问题应该是指针越界,如何修改?

img

源代码:



#include <iostream>
using namespace std;

//带头节点的单链表
template<class T>
struct Node
{
    T date;
    Node<T>*next;
};

template<typename T>
class headLinkList
{
public:
    //成员函数
    headLinkList()
    {
        length = 0;
        head = new Node<T>;
        head->next = 0;
    }
    //头插法构造
    headLinkList(T a[], int n);
    //尾插法构造
    headLinkList(T a[], int n, int b);
    //按关键字大小顺序插入
    void seqinsert(T x);
    //查找
    Node<T>* GetElem(headLinkList list, T x);
    //获取链表长度
    int GetLength(headLinkList list)
    {
        cout << "length= " << length << endl;
        return length;
    }

    T Delete(int n);
    void show()
    {
        if(head->next==NULL)throw"链表为空";
        Node<T>*p = head->next;
        while (!p->next)
        {
            cout << p->date << " ";
            p = p->next;
        }cout <<p->date<< endl;
    }
    
    Node<T>* GetElem(Node<T>*head,int num)//得到第num位的节点地址
    {
        if (head->next == NULL)throw"链表为空";
        Node<T>*p = head;
        while (p->next != NULL)
        {
            p = p->next;
        }return p;
        
    }
    ~headLinkList()
    {

        Node<T> *tempptr;
            while (head->next != NULL)
            {
                tempptr = head->next;
                delete head;
                head = tempptr;
            }
            delete head;

    }
private:
    Node<T>*head;
    int length;
};

template<class T>
headLinkList<T>::headLinkList(T a[], int n)
{
    head = new Node<T>;
    head->next = NULL;
    for (int i = 0; i < n; i++)
    {
        Node<T>*p = new Node<T>;
        p->date = a[i];
        p->next = head->next;
        head->next = p;
        length++;
    }
}

template<class T>
headLinkList<T>::headLinkList(T a[], int n, int b)
{
    head = new Node<T>;
    head->next = NULL;
    Node<T>*p = head;
    for (int i = 0; i < n; i++)
    {
        Node<T>*temp = new Node<T>;
        temp->date = a[i];
        p->next = temp;
        p = temp;
        length++;
        /*p->next = NULL;*/
    }

}

template <class T>
void headLinkList<T>::seqinsert(T x)
{
    if(head->next==NULL)throw"链表为空"

    Node<T>*p = head;
    Node<T>*temp = head;
    Node<T>*x = new Node<T>;
    x->date = x;
    while (p->next)
    {
      p = p->next;
      if (x->date <= p->date)
      {
          temp->next = x;
          x->next = p;
          length++;
          return 0;
      }
      temp = temp->next;
    }
    p->next = x;
    length++;
    x->next = NULL;

}

template<typename T>
T headLinkList<T>::Delete(int n)
{ 
    /*if (n > length || n < 1)throw"链表为空";*/
        Node<T>*p = head;
    int i = 0;
    while (i<n-1)
    {
        p = p->next;
        i++;
    }
    Node<T>*x = p->next;
    p->next = x->next;
    T l = x->date;
    delete x;
    length--;
    x = NULL;
    cout << "delete了" << l << endl;
    return 0;

}

template<class T>
Node<T>* headLinkList<T>::GetElem(headLinkList list, T x)
{
    if (head->next == Null)throw"链表为空"
        Node<T>*p = head;
    while (p->next)
    {
        p = p->next;
        if (p->date == x)
        {
            return p;
        }
    }
    return 0;
}


int main()
{
    try {
        int arr[] = { 1,2,5,9,7 };
        cout << "test" << endl;
        //头插法构造函数
        headLinkList<int> mode1(arr, 5);
        //尾插法构造函数
        headLinkList<int>mode2(arr, 5, 0);
        //遍历链表
        cout << "mode1:"; mode1.show(); 
        cout << endl;
        cout << "mode2:"; mode2.show();
        cout << endl;
        
        mode1.Delete(2);

        mode2.GetLength(mode2);
    }
    catch (const char*s)
    {
        cout << s << endl;
    }
}

  • 写回答

11条回答 默认 最新

  • 「已注销」 2023-03-19 11:00
    关注

    参考GPT和自己的思路:在析构函数中,您试图删除头结点和每个节点,但是当您删除头结点时,您将头指针设置为下一个节点,这可能会导致您在迭代过程中遗漏某些节点。因此,建议您使用临时节点指针来删除每个节点,而不是直接删除头结点。

    此外,您在函数 seqinsert 中声明了参数 T x,但是在函数内部又声明了变量 Node*x,这会导致编译错误。建议您更改参数名称,以避免名称冲突。

    最后,函数 GetElem 中的 if 语句中有一个拼写错误(Null 应更正为 NULL)。

    以下是修改后的代码:

    template<class T>
    headLinkList<T>::~headLinkList()
    {
        Node<T> *tempptr;
        while (head->next != NULL)
        {
            tempptr = head->next;
            delete head->next; // 修改1:删除 head 的下一个节点而不是 head 自己
            head->next = tempptr->next;
        }
        delete head; // 修改2:在循环外部删除 head 节点
    }
    
    
    

    这样修改后,~headLinkList() 析构函数可以正常删除链表中所有的节点。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月27日
  • 创建了问题 3月19日

悬赏问题

  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多
  • ¥15 设计一个温度闭环控制系统
  • ¥100 rtmpose姿态评估