合并有序顺序表和有序链表

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;
		}
	}	
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈笑死哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值