线性表的操作 (2.2) C = A U B

//线性表的操作  实现 C = A U B
//A = {1,2,3,4} B = {2,4,6,8} 则 C = {1,2,2,3,4,4,5,6,8}
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define LIST_INIT_SIZE 10
#define LISTINCREMENT 2

typedef struct SqList
{
	int *elem;
	int length;
	int listsize;
}SqList;

bool InitList(SqList *L); //创建空表
bool ListInsert(SqList *L,int pos,int e); //在第pos个位置插入e
bool ListTraverse(SqList *L); //输出线性表各元素
void MergeList(SqList La,SqList Lb,SqList *Lc);

int main()
{
	SqList La, Lb, Lc;
	int j;
	InitList(&La); //创建空表La
	for(j = 1; j <= 5; j++)
		ListInsert(&La,j,j); //插入元素
	printf("La = ");
	ListTraverse(&La);

	InitList(&Lb);
	for(j = 1; j <= 5; j++)
		ListInsert(&Lb,j,2*j);
	printf("Lb = ");
	ListTraverse(&Lb);

	MergeList(La,Lb,&Lc);
	printf("Lc = "); 
	ListTraverse(&Lc);
	return 0;
}

bool InitList(SqList *L) //创建空表
{
	L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
	if(L->elem == NULL)
	{
		printf("内存分配失败 程序终止!\n");
		exit(-1);
	}
	L->length = 0;
	L->listsize = LIST_INIT_SIZE;
	return 0;
}

bool ListInsert(SqList *L,int pos,int e) //在第pos个位置插入e
{
	int *newbase, *p, *q;
	if(pos < 1 || pos > L->listsize) //pos 不合法
		return false;
	if(L->length >= L->listsize)
	{
		newbase = (int *)realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(int));
		if(newbase == NULL)
		{
			printf("内存分配失败 程序终止!\n");
			exit(-1);
		}
		L->elem = newbase;
		L->listsize += LISTINCREMENT;
	}
	q = L->elem + pos - 1; //p 指向擦人位置
	for(p = L->elem + L->listsize - 1; p >= q; p--) //插入位置及之后的元素后移
		*(p+1) = *p;
	*q = e;
	L->length++; //表长增1
	return true;
}

bool ListTraverse(SqList *L) //输出线性表各元素
{
	int *p;
	int i;
	p = L->elem;
	for(i = 1; i < L->length; i++)
		printf("%d ",*p++);
	printf("\n");
	return true;
}

void MergeList(SqList La,SqList Lb,SqList *Lc)
{
	//已知顺序线性表La和Lb的元素按值 非递减排序
	//归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
	int *pa, *pa_last, *pb, *pb_last, *pc;
	pa = La.elem;
	pb = Lb.elem;
	Lc->listsize = Lc->length = La.length + Lb.length; 
	pc = Lc->elem = (int *)malloc(Lc->listsize*sizeof(int));
	if(Lc->elem == NULL)
	{
		printf("内存分配失败 程序终止!\n");
		exit(-1);
	}
	pa_last = La.elem + La.length - 1;
	pb_last = Lb.elem + Lb.length - 1;
	while(pa <= pa_last && pb <= pb_last) //表La和表Lb均为非空
	{
		if(*pa <= *pb)
			*pc++ = *pa++;
		else
			*pc++ = *pb++;
	}
	while(pa <= pa_last)
		*pc++ = *pa++;
	while(pb <= pb_last)
		*pc++ = *pb++;
}

程序执行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值