C/C++学习(八)两个有序链表归并为一个有序链表
2015-12-27 10:56
477 查看
假设头指针为La和Lb的单链表分别为线性表LA和LB的存储结构,现要归并La和Lb得到单链表Lc,接着C/C++学习(七)
#include <iostream>
#include <iostream>
using namespace std;
template<class T1>
class linklist
{
public:
linklist()
{
//p = new LNode;
//s = new LNode;
//q = new LNode;
L = new LNode;//申请节点空间
p = new LNode;
if(L == NULL)//判断是否有足够的空间
cout << "申请内存空间失败" <<endl;
L->next = NULL;//将next设置为空,初始化长度
flag = 0;
}
typedef struct LNode
{
T1 data;
struct LNode *next;
}LNode,*Linklist;//Linklist 指向节点的指针
//单链表的建立,头插法建立单链表
Linklist linklistCreatH()
{
while((cin >> data1) && (data1 != 0))//data1终止循环
{
p = new LNode;//关键一步重新分配一个指针节点
p->data = data1;
p->next = L->next;
L->next = p;
}
return L;
}
//单链表的建立,头插法建立单链表
Linklist linklistCreatHLa()
{
La = new LNode;
if(La == NULL)//判断是否有足够的空间
cout << "申请内存空间失败" <<endl;
La->next = NULL;//将next设置为空,初始化长度
while((cin >> data1) && (data1 != 0))//data1终止循环
{
p = new LNode;//关键一步重新分配一个指针节点
p->data = data1;
p->next = La->next;
La->next = p;
}
return L;
}
//单链表的建立,头插法建立单链表
Linklist linklistCreatHLb()
{
Lb = new LNode;
Lb = new LNode;
if(Lb == NULL)//判断是否有足够的空间
cout << "申请内存空间失败" <<endl;
Lb->next = NULL;//将next设置为空,初始化长度
while((cin >> data1) && (data1 != 0))//data1终止循环
{
p = new LNode;//关键一步重新分配一个指针节点
p->data = data1;
p->next = Lb->next;
Lb->next = p;
}
return Lb;
}
//单链表的建立,尾插法建立单链表
Linklist linklistCreatF()
{
LNode *r;
r = L;//r始终指向终端节点,开始时指向头结点
while((cin >> data1) && (data1) != 0)
{
p = new LNode;
p->data = data1;
r->next = p;//将节点插入到表头
r = p;
}
r->next = NULL;
return L;
}
//获取链表元素
void GetElem_L(int i, T1 &e)
{//L带头结点的单链表指针,第i个元素存在时赋给e并返回OK,否则返回ERROR
p = L->next;//初始化,p指向第一个节点
j = 1;
while(p && j<i)
{
p = p->next;
++j;
}
if(!p || j>i)
{
cout << "error getelem!" << endl;
}
e = p->data;
}
//在链表中插入某值
Linklist ListInsert_L(int i, T1 e)
{
p = L;
j = 0;
while(p && j<i-1)
{
p = p->next;
++j;//寻找i-1节点
}
if(!p || j>i)
{
cout << "error insert!" << endl;
return L;
}
s = new LNode;
s->data = e;
s->next = p->next;//插入L
p->next = s;
return L;
}
//删除某值
Linklist ListDelete(int i, T1 &e)
{//删除第i个元素,并由e返回
p = L;
j = 0;
while(p->next && j<i-1)
{
p = p->next;
++j;
}
if(!(p->next) || j>i-1)
{
cout << "error delete!" << endl;
return L;
}
q = new LNode;
q = p->next;
p->next = q->next;
e = q->data;
return L;
}
Linklist Mergelist()
{
Lc = new LNode;
/*重点分配内存,复制NULL值*/
if(Lc == NULL)//判断是否有足够的空间
cout << "申请内存空间失败" <<endl;
Lc->next = NULL;//将next设置为空,初始化长度
p = new LNode;
q = new LNode;
s = new LNode;
p = La->next;
q = Lb->next;
Lc = s = La ;
while(p&&q)
{
if(p->data <= q->data)
{
s->next = p;
s = p;
p = p->next;
}
else
{
s->next = q;
s = q;
q = q->next;
// if(q != NULL)
// {
// cout << "." << endl;
// }
}
}
s->next = p ? p : q;//插入剩余段
delete Lb;
return Lc;
}
void showdataMerge()
{
p = new LNode;
p = Lc->next;//指向头结点的下一个节点
while(p != NULL)
{
cout << p->data << " ";
p = p->next;
}
}
void showdata()
{
p = new LNode;
p = L->next;//指向头结点的下一个节点
while(p != NULL)
{
cout << p->data << " ";
p = p->next;
}
}
~linklist()
{
delete L;
delete p;
delete q;
delete s;
delete La;
delete Lb;
}
private:
int j;
LNode *p;//
LNode *s;
LNode *q;
LNode *L;
LNode *La;
LNode *Lb;
LNode *Lc;
// LNode *L1;
T1 data1;
T1 flag;
// Linklist L1;
};
int main()
{
// cout << "Hello World!" << endl;
//头插法
int data, data1;
linklist<int> *list = new linklist<int>;
cout << "(H)please enter numbers or chars or strings: " << endl;
list->linklistCreatH();
cout << "show linklist data:" << endl;
list->showdata();
cout << endl;
//尾插法
cout << "(F)please enter numbers or chars or strings: " << endl;
list->linklistCreatH();
cout << "show linklist data:" << endl;
list->showdata();
cout << endl;
//插入某值
cout << "after insert numbers or chars or strings " << endl;
list->ListInsert_L(3,10);
cout << "show linklist data:" << endl;
list->showdata();
cout << endl;
//查找某值
cout << "get numbers or chars or strings: " << endl;
list->GetElem_L(3,data);
cout << "input data: " << data << endl;
cout << endl;
//删除某值
cout << "delete numbers or chars or strings: " << endl;
list->ListDelete(4,data1);
cout << "delete data1: " << data1 << endl;
list->showdata();
cout << endl;
//两个有序链表归并为一个有序链表
cout << "(M-La)please enter numbers or chars or strings: " << endl;
list->linklistCreatHLa();
cout << "(M-Lb)please enter numbers or chars or strings: " << endl;
list->linklistCreatHLb();
list->Mergelist();
cout << "show linklist data:" << endl;
list->showdataMerge();
cout << endl;
return 0;
}
相关文章推荐
- c++标准14取消decltype推算函数返回类型
- C语言学习笔记----伊能C语言学习笔记-----全局变量
- C++之路进阶——优先队列优化最短路径算法(dijkstra)
- 一起talk C栗子吧(第八十四回:C语言实例--使用信号进行进程间通信一)
- C++模板元编程 入门简介
- C语言中常用计时方法总结
- C++.OOP
- C++模板类线性表的实现与测试
- C++ Primer Plus (Chapter 9)
- fibonacci heap.(C++)
- C++类型转换操作符(type conversion operator)
- 山东省第六届蓝桥杯 ///标题:错误票据//c/c++组
- 山东省第四届蓝桥杯 ///标题:三部排序//c/c++组
- 山东省第四届蓝桥杯 ///题目标题:前缀判断//c/c++组
- 山东省第四届蓝桥杯 ///题目标题: 第39级台阶//c/c++组
- 山东省第四届蓝桥杯 ///标题: 马虎的算式//c/c++组
- 简单c语言习题:矩阵求乘积
- 【C++ STL应用与实现】17: 如何使用迭代器辅助函数
- 山东省第四届蓝桥杯 ///题目标题: 高斯日记//c/c++组
- vim使用—实现程序的自动补齐(C语言)