概述
#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++实现两个单链表有序合并所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复