m0_74295064 2023-03-04 10:12 采纳率: 66.7%
浏览 56
已结题

访问冲突,不知道是不是空指针,我找不到

ListNode.h
#pragma once
#include<iostream>
using namespace std;
#include<stdlib.h>

template<class T>class LinkList;//为了实现友元,前向定义
template<class T>
class ListNode
{
    friend class LinkList<T>;
private:
    T data;
    ListNode<T>* next;
public:
    ListNode(ListNode<T>* ptrnext = NULL)
    {
        next = ptrnext;
    }
    ListNode(const T& item, ListNode<T>* ptrnext = NULL)
    {
        data = item;
        next = ptrnext;
    }
    ~ListNode() {}
};

LinkList.h
#pragma once
#include"ListNode.h"

template <class T>
class LinkList
{
private:
    ListNode<T>* head;
    int size;
public:
    LinkList();//构造
    ~LinkList();//析构
    ListNode<T>* Index(int i);//定位    
    T Delete(int i);//删除
    T GetData(int i);//取数据元素
    void PrintList();
    void OrderInsert(T x);//有序插入
    int GetSize()const;//取长度
};

//构造
template<class T>
LinkList<T>::LinkList()
{
    head = new ListNode<T>();
    size = 0;
}

//析构
template<class T>
LinkList<T>::~LinkList()
{
    ListNode<T>* p, * q;
    p = head;
    while (p != NULL)
    {
        q = p;
        p = p->next;
        delete p;
    }
    size = 0;
    head = NULL;
}

//取长度
template<class T>
int LinkList<T>::GetSize()const
{
    return size;
}

//定位
template<class T>
ListNode<T>* LinkList<T>::Index(int i)
{
    if (i<-1 || i>GetSize() - 1)
    {
        cout << "i越界" << endl;
        exit(0);//退出
    }
    if (i == -1)
    {
        return head;
    }
    else
    {
        ListNode<T>* p = head->next;
        int k = 0;
        while (p != NULL && k < i)
        {
            p = p->next;
            k++;
        }
        return p;
    }
}

//取数据元素
template<class T>
T LinkList<T>::GetData(int i)
{
    if (i<0 || i>GetSize() - 1)
    {
        cout << "i越界" << endl;
        exit(0);//退出
    }
    else
    {
        ListNode<T>* p = Index(i);
        return p->data;
    }
}



//输出
template<class T>
void LinkList<T>::PrintList()
{
    for (int i = 0; i < GetSize(); i++)
    {
        cout << GetData(i) << " ";
    }
    cout << endl;
}

//有序插入
template<class T>
void LinkList<T>::OrderInsert(T x)
{
    ListNode<T>* curr, * pre;
    curr = head->next;
    pre = head;
    while (curr != NULL && curr->data <= x)
    {
        pre = curr;
        curr = curr->next;
    }
    ListNode<T>* p = new ListNode<T>(x, pre->next); 
    pre->next = p;        
    size++;
}

#include"LinkList.h"
//合并
template<class T>
void Merge(LinkList<T>L1, LinkList<T>L2)
{
    T temp;
    for (int i = 0; i < L2.GetSize(); i++)
    {
        temp = L2.GetData(i);
        L1.OrderInsert(temp);
    }
}
int main()
{
    LinkList<int>list1, list2;
    int x;
    cout << "创建链表1;" << endl;
    cout << "输入元素:";
    cin >> x;
    while (x != 0)
    {
        list1.OrderInsert(x);
        cout << "输入元素:";
        cin >> x;
    }
    cout << "输出链表1:";
    list1.PrintList();

    cout << "创建链表2;" << endl;
    cout << "输入元素:";
    cin >> x;
    while (x != 0)
    {
        list2.OrderInsert(x);
        cout << "输入元素:";
        cin >> x;
    }
    cout << "输出链表2:";
    list2.PrintList();

    Merge(list1, list2);
    cout << "合并后的链表:";
    list1.PrintList();

    return 0;
}
  • 写回答

3条回答 默认 最新

  • 关注

    调试发现定位到LinkList.h里的~LinkList()里的错误,改成这样

    template<class T>
    LinkList<T>::~LinkList()
    {
        ListNode<T>* p, * q;
        p = head;
        while (p != NULL)
        {
            q = p;
            p = p->next;  
        }delete p;
        size = 0;
        head = NULL;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月12日
  • 已采纳回答 3月4日
  • 修改了问题 3月4日
  • 创建了问题 3月4日

悬赏问题

  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因