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日

悬赏问题

  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line