链表的归并

//利用线性表中的链表实现两个链表的归并

//头文件
#pragma warning(disable: 4996)
#include <stdio.h>
#include <stdlib.h>

//定义返回码与常量
#define   OK                1
#define   TRUE              1
#define   ERROR             0
#define   OVERFLOW          -1

//定义类型与结构
typedef int Status;
typedef int ElemType;

typedef struct  LNode {
	//节点类型
	ElemType data;      //数据域
	struct LNode* next; //指针域

}LNode, * LinkList;


//基本操作的实现

Status InitList_L(LinkList& L) {
	//构造一个空的线性链表L
	LNode* q;
	L = (LNode*)malloc(sizeof(LNode));
	if (L == NULL) return OVERFLOW;
	L->next = NULL; q = L;
	return OK;

}//InitList_L;

Status InitList_Lc(LinkList& L, int n) {
	//构造一个线性链表Lc
	//n为链表的大小
	LNode* p;
	L = (LNode*)malloc(sizeof(LNode));
	if (L == NULL) return OVERFLOW;
	L->next = NULL; p = L;
	for (int i = 1; i <= n; i++) {
		p = (LNode*)malloc(sizeof(LNode));
		L->next = NULL; p = L;
	}
	return OK;

}//InitList_Lc;

Status PrintList_L(LinkList L) {
	//输出链表L
	LNode* p;
	p = L->next;
	while (p) {
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
	return OK;

}//PrintList_L;

Status CreatList_L(LinkList& L, int n) {
	//正序输入数据
	//L为头节点,n为元素个数
	LNode* q, * p;
	L = (LNode*)malloc(sizeof(LNode));
	if (L == NULL) return OVERFLOW;
	L->next = NULL; q = L;
	for (int i = 1; i <= n; i++) {
		p = (LNode*)malloc(sizeof(LNode));
		scanf("%d", (&p->data));
		q->next = p; q = p;
	}
	q->next = NULL;
	return OK;

}//CreatList_L;

Status Judge_L(LNode *L) {
	//判断L是否为非递减排序,若不是则给链表排序。
	//L为一个链表
	LNode *q, *p;
	int N = 0;
	for (p = L->next; p != NULL; p = p->next) {
		for (q = p->next; q != NULL; q = q->next) {
			if (p->data > q->data) {
				int t = p->data; p->data = q->data; q->data = t;
				N = 1;
			}
		}
	}
	if (N!= 0) return OVERFLOW;
	//N为0,表示L是非递减排序的,N为1,表示L不是非递减排序的。
	return OK;

}//Judge_L;

Status MergeList_L(LinkList& La, LinkList& Lb, LinkList& Lc) {
	//已知两个链表La,Lb中的元素按值的非递减排序
	//归并La和Lb得到一个新的链表Lc,Lc的值也是非递减排序的
	LNode* pa, * pb, * pc;
	pa = La->next; pb = Lb->next;
	Lc = pc = La;
	while (pa && pb) {
		if (pa->data <= pb->data)
		{
			pc->next = pa; pc = pa; pa = pa->next;
		}
		else { pc->next = pb; pc = pb; pb = pb->next; }
	}
	pc->next = pa ? pa : pb;
	free(Lb);  //释放Lb的地址
	return OK;

}//MergeList_L;


//主函数
int main() {
	LNode* La, * Lb, * Lc;
	int n = 0;
	int m = 0;

	//链表La
	printf("请输入La中的元素个数(个数为整数且范围为:1~20):");
	scanf("%d", &n);
	if (n < 1 || n>20) {
		while (n < 1 || n>20) {
			printf("请重新输入La中的元素个数(个数为整数且范围为:1~20):");
			scanf("%d", &n);
		}
	}
	printf("请输入La中的元素(元素为整数),从小到大输入:");
	CreatList_L(La, n);

	//链表Lb
	printf("请输入Lb中的元素个数(个数为整数且范围为:1~20):");
	scanf("%d", &m);
	if (m < 1 || m>20) {
		while (m < 1 || m>20) {
			printf("请重新输入Lb中的元素个数(个数为整数且范围为:1~20):");
			scanf("%d", &m);
		}
	}
	printf("请输入Lb中的元素(元素为整数),从小到大输入:");
	CreatList_L(Lb, m);

	//链表Lc
	InitList_Lc(Lc,m+n);

	//La与Lb是否为非递减排序与归并后的输出
	if (InitList_Lc(Lc, m + n) == OK) {

		if (Judge_L(La) == OVERFLOW)                     //判断La是非否为非递减排序
			printf("La不是非递减排序,La重新排序为: ");
		else
			printf("La是非递减排序,La为: ");

		PrintList_L(La);                                 //输出La

		if (Judge_L(Lb) == OVERFLOW)                     //判断Lb是非否为非递减排序
			printf("Lb不是非递减排序,Lb重新排序为: ");
		else
			printf("Lb是非递减排序,Lb为: ");

		PrintList_L(Lb);                                 //输出Lb

		if (MergeList_L(La, Lb, Lc) == OK)
			printf("La,Lb归并排序后为: ");

		PrintList_L(Lc);                                 //输出Lc,Lc为La与Lb归并后的链表
	}
	return OK;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值