#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"); }
问题出在析构有问题
相关分类