我是靠谱客的博主 彪壮日记本,最近开发中收集的这篇文章主要介绍C++实现两个单链表有序合并,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#include<iostream>
using namespace std;
typedef int T;

class Node
{
public:
	void Setdata(int data);
	void Setnext(Node *next);
	T Getdata();
	Node* Getnext();

private:
	T m_Data;
	Node* m_Next;
};

void Node::Setdata(T data)
{
	m_Data = data;
}

void Node::Setnext(Node* next)
{
	m_Next = next;
}

T Node::Getdata()
{
	return m_Data;
}

Node* Node::Getnext()
{
	return m_Next;
}

class LinkList
{
public:
	LinkList();     //初始化单链表
	~LinkList();     //销毁
	bool CreateList();  //创建单链表
	void EmptyList();  //判断是否 为空
	int LengthList();  //获取长度
	void ShowList();   //遍历输出
	bool InsertLinkList(); //指定位置插入指定数据
	bool LocateDelLinkList();  //删除指定位置元素
	bool ElemDeleLinkList();  //删除指定值
	bool SortLinkList();    //排序
	void MergeLinkList(LinkList& L1, LinkList& L2);  //归并两个单链表

private:
	Node* m_Head;
};

LinkList::LinkList()  //初始化单链表(头节点)
{
	m_Head = new Node; 
	m_Head->Setdata(0);
	m_Head->Setnext(NULL);
}
 
LinkList::~LinkList()   //销毁
{
	Node* p;
	while (m_Head->Getnext()) {
		p = m_Head;
		m_Head = m_Head->Getnext();  //m_Head指针依次后移,依次删除结点,头节点后移
		delete p;
	}
	m_Head->Setnext(NULL);
	m_Head->Setdata(0);
}

bool LinkList::CreateList()  //创建单链表
{
	T k = 0;
	cout << "请输入链表长度" << endl;  cin >> k;
	Node* pnew, * ptemp;
	ptemp = m_Head;
	for (int i = 0; i < k; i++)
	{
		T e = 0;
		cout << "请输入数据:" << " ";  cin >> e;  cout << endl;
		pnew = new Node;
		pnew->Setdata(e);
		pnew->Setnext(NULL);
		ptemp->Setnext(pnew);
		ptemp = pnew;
	}
	return true;
}

void LinkList::EmptyList() //判断是否 为空
{
	if (m_Head->Getnext() == NULL) {
		cout << "空表" << endl;
	}
	else {
		cout << "非空" << endl;
	}
}

int LinkList::LengthList()  //获取长度
{
	int j = 0;  //初始化计数器
	Node* ptemp;
	ptemp = m_Head;
	while (ptemp->Getnext()) {
		ptemp = ptemp->Getnext();
		j++;
	}
	cout << "表长为:" << j << endl;
	return j;
}

void LinkList::ShowList()   //遍历输出
{
	Node* ptemp;
	ptemp = m_Head;
	while (ptemp->Getnext()) {
		ptemp = ptemp->Getnext();
		cout << "表中数据为:" << ptemp->Getdata() << " ";
	}
	cout << endl;
}

bool LinkList::InsertLinkList() //指定位置插入指定数据
{
	int i, e = 0;  int j = 0;
	cout << "请输入插入位置:" << " ";  cin >> i; cout << endl;
	cout << "请输入插入数据:" << " ";  cin >> e; cout << endl;
	Node* pnew,*ptemp;   //工作指针
	ptemp = m_Head;
	while (ptemp && j < i - 1) {
		ptemp = ptemp->Getnext();
		j++;
	}
	pnew = new Node;
	pnew->Setdata(e);
	pnew->Setnext(ptemp->Getnext());
	ptemp->Setnext(pnew);
	return true;
}

bool LinkList::LocateDelLinkList() //删除指定位置元素
{
	int i, j = 0;
	cout << "请输入删除位置:" << " ";  cin >> i; cout << endl;
	Node* ptemp;
	ptemp = m_Head;
	while (ptemp->Getnext() && j < i - 1) {
		ptemp = ptemp->Getnext();
		j++;
	}
	ptemp->Setnext((ptemp->Getnext())->Getnext());
	return true;
}

bool LinkList::ElemDeleLinkList()  //删除指定值
{
	int e = 0;
	cout << "输入删除的数值:" << " ";  cin >> e; cout << endl;
	while (m_Head != NULL && m_Head->Getdata() == e) {
		// 排除链表头指定值的情况
		Node* ptemp;  ptemp = m_Head;
		m_Head = m_Head->Getnext();
		delete ptemp;
	}

	Node* ptemp, * qtemp;// p:较快地指针, q:较慢指针
	ptemp = qtemp = m_Head;
	while (ptemp != NULL) {
		if (ptemp->Getdata() == e) {// 第一个p肯定不会是data
			qtemp->Setnext(ptemp->Getnext());
			delete ptemp;
			ptemp = qtemp->Getnext();
		}
		else {
			qtemp = ptemp;
			ptemp = ptemp->Getnext();
		}
	}
	return true;
}

bool LinkList::SortLinkList()    //排序
{
	Node* p, * q;
	p = m_Head->Getnext();
	while (p!= NULL) {
		q = p->Getnext();
		while (q != NULL) {
			if (p->Getdata() > q->Getdata())
			{
				int i = 0;
				i = p->Getdata();
				p->Setdata(q->Getdata());
				q->Setdata(i);
			}
			q = q->Getnext();
		}
		p = p->Getnext();
	}
	return true;
}

void LinkList::MergeLinkList(LinkList& L1, LinkList& L2)  //归并两个单链表
{
	L1.SortLinkList(); L2.SortLinkList();
	Node* a, * b, * c;
	c = L1.m_Head;
	a = L1.m_Head->Getnext();  b = L2.m_Head->Getnext();
	while (a && b) {
		if (a->Getdata() >= b->Getdata()) {
			c->Setnext(b);
			c = c->Getnext();
			b = b->Getnext();
		}
		else {
			c->Setnext(a);
			c = c->Getnext();
			a = a->Getnext();
		}
		if (c->Getnext() == a) {
			c->Setnext(b);
		}
		else {
			c->Setnext(a);
		}
	}
	delete L2.m_Head;
}

int main()
{
	

	LinkList L1;
	LinkList L2;
	L1.CreateList();
	L1.ShowList();
	L2.CreateList();
	L2.ShowList();


	L1.MergeLinkList(L1, L2);
	L1.ShowList();

	
	/*LinkList L;
	L.CreateList();
	L.ShowList();
	
	L.SortLinkList();
	L.ShowList();*/

	system("pause");
	return 0;
}

 

 实现效果如下:

 

最后

以上就是彪壮日记本为你收集整理的C++实现两个单链表有序合并的全部内容,希望文章能够帮你解决C++实现两个单链表有序合并所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部