为了账号安全,请及时绑定邮箱和手机立即绑定

c++单链表的合并

c++单链表的合并

C++
为啥有昵称 2017-10-14 10:17:21
#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"); }问题出在析构有问题
查看完整描述

目前暂无任何回答

  • 0 回答
  • 1 关注
  • 1841 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信