c++单链表的合并

#include<iostream>
#include<algorithm>
#include<assert.h>
using namespace std;
template<class ElemType>
struct Node
{
 //数据成员
 ElemType data;         //数据域
 Node<ElemType> *next;       //指针域
             //构造函数
 Node();           //无参数的构造函数
 Node(ElemType e, Node<ElemType> *Link = NULL); //有参数的构造函数
};
template<class ElemType>
Node<ElemType>::Node()
{
 next = NULL;
}
template<class ElemType>
Node<ElemType>::Node(ElemType e, Node<ElemType> *link)
{
 data = e;
 next = link;
}
//单链表
template<class ElemType>
class LinkList
{
protected:
 //单链表类模板的数据成员
 Node<ElemType> *head;  //头指针结点
 int length;     //元素个数
public:
 //单链表类模板的函数成员
 LinkList();      //无参数构造函数
 LinkList(ElemType v[], int n); //有参数的构造函数
 virtual ~LinkList();   //析构函数
 int GetLength()const;   //求链表长度
 bool IsEmpty()const;   //判断链表是否为空 
 void Clear();     //将链表清空
 void UseMerge(LinkList<ElemType>p1, LinkList<ElemType>p2);
 Node<ElemType>* merge(Node<ElemType> *head1, Node<ElemType> *head2); //合并
 void output();     //将链表输出
};
//无参数的构造函数
template<class ElemType>
LinkList<ElemType>::LinkList()
{
 head = new Node<ElemType>;  //构造头函数
 length = 0;      //单链表长度定为0;
}
//有参数构造函数
template<class ElemType>
LinkList<ElemType>::LinkList(ElemType v[], int n)
{
 //排序
 for (int i = 0; i < n; i++)
 {
  for (int j = 1; j < n - i; j++)
  {
   if (v[j] < v[j - 1])
    swap(v[j], v[j - 1]);
  }
 }
 Node<ElemType> *p;
 p = head = new Node<ElemType>; //构造头结点
 for (int i = 0; i < n; i++)
 {
  p->next = new Node<ElemType>(v[i], NULL);
  assert(p->next);   //构造元素结点失败,终止程序运行
  p = p->next;
 }
 length = n;
}
//析构函数
template<class ElemType>
LinkList<ElemType>::~LinkList()
{
 Clear();   //清空链表
 delete head;  //释放头结点所指空间
}
//清空链表
template<class ElemType>
void LinkList<ElemType>::Clear()
{
 Node<ElemType> *p;
 p = head->next;
 while (p != NULL)
 {
  cout << p->data;
  head->next = p->next;
  delete p;
  p = head->next;
 }
 length = 0;
}
//求链表长度
template<class ElemType>
int LinkList<ElemType>::GetLength()const
{
 return length;
}
//判断链表是否为空
template<class ElemType>
bool LinkList<ElemType>::IsEmpty()const
{
 Node<ElemType> *p = head->next;
 if (p != NULL)
  return false;
 return true;
}
//调用合并
template<class ElemType>
void LinkList<ElemType>::UseMerge(LinkList<ElemType>p1, LinkList<ElemType>p2)
{
 head->next = merge(p1.head->next, p2.head->next);
}
//合并链表
template<class ElemType>
Node<ElemType>* LinkList<ElemType>::merge(Node<ElemType> *head1, Node<ElemType> *head2)
{
 if (head1 == NULL)
  return head2;
 if (head2 == NULL)
  return head1;
 Node <ElemType> *head = NULL;
 if (head1->data < head2->data)
 {
  head = head1;
  head->next = merge(head1->next, head2);
 }
 else
 {
  head = head2;
  head->next = merge(head1, head2->next);
 }
 cout << "e";
 return head;
}
//输出链表
template<class ElemType>
void LinkList<ElemType>::output()
{
 Node<ElemType> *p;
 p = head->next;
 while (p != NULL)
 {
  cout << p->data << ",";
  p = p->next;
 }
}
void main() {
 cout << "输入第一组五个整数:";
 int v1[1];
 for (int i = 0; i < 1; i++)
  cin >> v1[i];
 cout<<"\n";
 LinkList<int> p1(v1, 1);
 cout << "输出有序单链表应为:";
 p1.output();
 cout << "\n";
 cout << "输入第二组五个整数:";
 int v2[1];
 for (int i = 0; i < 1; i++)
  cin >> v2[i];
 cout << "\n";
 LinkList<int> p2(v2, 0);
 cout << "输出有序单链表应为:";
 p2.output();
 cout << "\n";
 
 LinkList<int> p;
 p.UseMerge(p1, p2);
 cout << "合并两个单链表,合并后输出结果应为:";
 p.output();
 system("pause");
}

问题出在析构有问题

为啥有昵称
浏览 1848回答 0
0回答
打开App,查看更多内容
随时随地看视频慕课网APP