有序表的合并——链表实现

完整代码

#include <iostream>
using namespace std;
 
#define TRUE    1
#define FALSE   0
#define OK      1
#define ERROR   0
#define INFEASIBLE -1
#define OVERFLOW   -2
#define MAXSIZE    100
#define Status int
#define ElemType int

typedef struct LNode
{
	ElemType data;
	struct LNode * next;
}LNode, *LinkList;


/*****************基本操作函数**************/ 

//1.初始化链表——构造一个空表
//算法步骤:
//	1.生成新结点做头结点,用头指针L指向头结点
//	2.将头结点的指针域置空 
Status InitList(LinkList &L)
{
	L = new LNode;        //生成头结点 
	L->next = NULL;		  //将头结点指针域置空 
	return 1;
}

//10.尾插法建立链表
//算法步骤:
//	1.从一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r指向链表的尾结点
//	2.初始时,r和L同时指向头结点,每读入一个数据新生成一个结点
//	将新结点插到尾结点后,r指向新结点 
void CreatList_R(LinkList &L, int n)
{
	LinkList r, p;
	L = new LNode;
	L->next = NULL;
	r = L;				//尾指针指向头结点 
	
	for (int i = 0; i < n; ++i)
	{
		p = new LNode;
		cin >> p->data;
		p->next = NULL;
		r->next = p;		//插入到表尾 
		r = p;				//r指向新的尾结点 
	}
}

/*****************功能函数**************/ 
//遍历输出函数 
void PrintList(LinkList L)
{
	LinkList p = L->next; 		//跳过头结点 
	if( p ) 
	{
		printf("当前单链表所有元素:");
		while(p)
		{
			printf("%d ",p->data);
			p=p->next;
		}
		printf("\n");
	}
	else
	{
		printf("当前单链表已空!\n");
	}
}

//建立链表函数
void Create(LinkList &L)
{
	int n = 5;
	printf("请输入链表的长度:");
	scanf("%d",&n);
	printf("请输入链表的数据:"); 
	CreatList_R(L, n);			//尾插 
	if( L->next ) 
	{
		printf("建表成功!!!\n");	
	}
	else
	{
		printf("建表失败!!!\n");

	}
}

void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc)
{
	LinkList pa = La->next;
	LinkList pb = Lb->next;
	LinkList pc = Lc = La;		//用La的头结点作为La的头结点 
	
	while (pa && pb)
	{
		if (pa->data <= pb->data)
		{
			pc->next = pa;		//pc指向pa 
			pc = pa;			//pc移到pa结点 
			pa = pa->next;		//pa移到下一个结点 
		}
		else
		{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa? pa : pb;		//判断并插入剩余段
	delete Lb;					//删除Lb头结点
}


int main()
{
	LinkList La;
	InitList(La);
	Create(La);
	PrintList(La);
	cout << endl;
	
	LinkList Lb;
	InitList(Lb);
	Create(Lb);
	PrintList(Lb);
	cout << endl;
	
	LinkList Lc;
	InitList(Lc);
	MergeList(La, Lb, Lc);
	cout << "合并后的链表Lc:" << endl; 
	PrintList(Lc);
	cout << endl;
	
	return 0;
}

运行结果

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值