SeqList.hpp
#pragma once
#include<iostream>
using namespace std;
template<class T, int MaxSize>
class SeqList
{
T data[MaxSize];
int length;
public:
int MaxSize;
SeqList();
SeqList(T a[], int n);
int ListLength();
void CreatSeqlist(int n);
void Insert(SeqList& L3, int k, int data);
void Delete(int i);
void Merge(SeqList L1, SeqList L2, SeqList& L3);
};
template<class T, int MaxSize>
SeqList<T, MaxSize>::SeqList()
{
length = 0;
MaxSize = 10000;
}
template<class T, int MaxSize>
SeqList<T, MaxSize>::SeqList(T a[], int n)
{
if (n > MaxSize)
{
cerr << "参数非法";
exit(1);
}
for (int i = 0; i < n; i++)
{
data[i] = a[i];
}
length = n;
}
template<class T, int MaxSize>
void SeqList<T, MaxSize>::CreatSeqlist(int n)
{
if (n < 0 || n > MaxSize)
{
cerr << "非法";
exit(1);
}
for (int i = 0; i < n; i++)
{
cin >> data[i];
length++;
}
}
template<class T, int MaxSize>
int SeqList<T, MaxSize>::ListLength()
{
return length;
}
template<class T,int MaxSize>
void SeqList<T, MaxSize>::Insert(SeqList& L3, int k, int data)
{
L3.data[k] = data;
}
template<class T, int MaxSize>
void SeqList<T, MaxSize>::Delete(int i)
{
if (length == 0)
{
cerr << "下溢" << endl;
exit(1);
}
if (i < 0 || i > length)
{
cerr << "删除位置非法" << endl;
exit(1);
}
int x = data[i - 1];
for (int j = i; j < length; j++)
{
data[j - 1] = data[j];
}
length--;
}
template<class T, int MaxSize>
void SeqList<T, MaxSize>::Merge(SeqList L1, SeqList L2,SeqList& L3)
{
int i = 0;
int j = 0;
int k = 0;
if (L1.length + L2.length > L3.MaxSize) //超过最大空间
{
cerr << "上溢" << endl;
exit(1);
}
while ((i < L1.length) && (j < L2.length))
{
if (L1.data[i] < L2.data[j])
{
Insert(L3, k, L1.data[i]);
i++;
k++;
}
else if (L1.data[i] > L2.data[j])
{
Insert(L3, k, L2.data[j]);
j++;
k++;
}
else
{
Insert(L3, k, L1.data[i]);
L2.Delete(j);
i++;
k++;
}
}
while (i < L1.length) //说明L2结束了
{
Insert(L3, k, L1.data[i]);
i++;
k++;
}
while (j < L2.length) //说明L1结束了
{
Insert(L3, k, L2.data[j]);
j++;
k++;
}
L3.length = k; //!!!!!
cout << "合并后有序顺序表L3为" << endl;
for (int l = 0; l < L3.length; l++)
{
cout << L3.data[l] << " ";
}
cout << " " << endl;
}
LinkList.hpp
#pragma once
#include<iostream>
using namespace std;
template<class T>class LinkList;
template<class T>
struct Node
{
friend class LinkList<T>;
private:
T data;
Node<T>* next = NULL;
};
template<class T>
class LinkList
{
Node<T>* head;
public:
LinkList();
LinkList(T a[], int n);
~LinkList();
int ListLength();
int Locate(T item);
void Insert(int i,T item);
void Show();
void Delete(int i);
void Merge(LinkList<T>& list1, LinkList<T>& list2);
};
template<class T>
LinkList<T>::LinkList()
{
head = new Node<T>;
head->next = NULL;
}
template<class T>
LinkList<T>::LinkList(T a[], int n)
{
head = new Node<T>;
Node<T>* rear;
rear = head;
for (int i = 0; i < n; i++)
{
Node<T>* p;
p = new Node<T>;
p->data = a[i];
rear->next = p;
rear = p;
}
rear->next = NULL;
}
template<class T>
LinkList<T>::~LinkList()
{
Node<T>* p;
p = head;
while (p)
{
Node<T>* q;
q = new Node<T>;
q = p;
p = p->next;
delete q;
}
head = NULL;
}
template<class T>
int LinkList<T>::ListLength()
{
Node<T>* p;
int num = 0;
p = head->next;
while (p)
{
p = p->next;
num++;
}
return num;
}
template<class T>
int LinkList<T>::Locate(T item)
{
Node<T>* p;
p = head->next;
int j = 1;
while (p && p->data != item)
{
p = p->next;
j++;
}
if (p)
return j;
else
return 0;
}
template<class T>
void LinkList<T>::Insert(int i, T item)
{
Node<T>* p;
p = head;
int j = 0;
while (p && j < i - 1)
{
p = p->next;
j++;
}
if (!p)
{
cerr << "插入位置非法" << endl;
exit(1);
}
else
{
Node<T>* s;
s = new Node<T>;
s->data = item;
s->next = p->next;
p->next = s;
}
}
template<class T>
void LinkList<T>::Show()
{
Node<T>* p;
p = head->next;
while (p != NULL)
{
cout << p->data << "-->";
p = p->next;
}
cout << "null" << endl;
}
template<class T>
void LinkList<T>::Delete(int i)
{
Node<T>* p;
p = head;
int j = 0;
while (p && j < i - 1)
{
p = p->next;
j++;
}
if (!p || !p->next)
{
cerr << "删除位置非法" << endl;
exit(1);
}
else
{
Node<T>* q;
int x;
q = p->next;
x = q->data;
p->next = q->next;
delete q;
}
}
template<class T>
void LinkList<T>::Merge(LinkList& li1, LinkList& li2)
{
Node<T>* p1, * p2, * p3;
p1 = li1.head->next;
p2 = li2.head->next;
p3 = li1.head;
while ((p1 != NULL) && (p2 != NULL))
{
if ((p1->data) < (p2->data))
{
p3->next = p1;
p1 = p1->next;
p3 = p3->next;
}
else if ((p1->data) > (p2->data))
{
p3->next = p2;
p2 = p2->next;
p3 = p3->next;
}
else if ((p1->data) = (p2->data))
{
p3 = p3->next;
p1 = p1->next;
p2 = p2->next;
}
}
if (p1 != NULL)
{
p3->next = p1;
}
if (p2 != NULL)
{
p3->next = p2;
}
}
main函数
#include<iostream>
#include"SeqList.hpp"
#include"LinkList.hpp"
using namespace std;
void Menu()
{
cout << "+—————菜单—————+" << endl;
cout << "| 请选择操作: |" << endl;
cout << "| 1——合并有序顺序表 |" << endl;
cout << "| 2——合并有序单链表 |" << endl;
cout << "| 0——退出 |" << endl;
cout << "+————————————+" << endl;
}
int main()
{
int choice;
while (true)
{
Menu();
cin >> choice;
switch (choice)
{
case 1:
{
int n;
SeqList<int, 100> L1;
cout << "请输入有序顺序表L1的元素个数" << endl;
cin >> n;
cout << "请输入有序顺序表L1中的元素" << endl;
L1.CreatSeqlist(n);
int m;
SeqList<int, 100> L2;
cout << "请输入有序顺序表L2的元素个数" << endl;
cin >> m;
cout << "请输入有序顺序表L2的元素" << endl;
L2.CreatSeqlist(m);
SeqList<int, 100>L3;
L1.Merge(L1, L2, L3);
break;
}
case 2:
{
cout << "请输入有序链表List1元素个数" << endl;
int n;
cin >> n;
int* a;
a = new int[n];
cout << "请输入有序链表List1中的元素" << endl;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
LinkList<int>List1(a, n);
List1.Show();
cout << "请输入有序链表List2元素个数" << endl;
int m;
cin >> m;
int* b;
b = new int[m];
cout << "请输入有序链表List2中的元素" << endl;
for (int i = 0; i < m; i++)
{
cin >> b[i];
}
LinkList<int>List2(b, m);
List2.Show();
List1.Merge(List1, List2);
cout << "合并后链表List3为:" << endl;
List1.Show();
}
case 0:
{
cout << "再见" << endl;
return 0;
}
default:
break;
}
}
}