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

//操作结果  C = AUB
#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); //输出线性表中的元素

int comp(int c1,int c2);
void MergeList(SqList La,SqList Lb, SqList * Lc);

int main()
{
	SqList La, Lb, Lc;
	int j;
	InitList(&La); //在表La中插入5个元素
	for(j = 1; j <= 5; j++)
		ListInsert(&La,j,j);
	printf("La = ");
	ListTraverse(&La); //输出La的元素

	InitList(&Lb);
	for(j = 1; j <= 5; j++) //在表Lb中插入5个元素
		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;
	for(p = L->elem + L->listsize - 1; p >= q; p--) //插入位置及插入位置之后的元素右移
		*(p+1) = *p;
	*q = e; //插入e
	L->length++;
	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)
{
	int *pa, *pa_last, *pb, *pb_last, *pc;
	pa = La.elem;
	pb = Lb.elem;
	Lc->listsize = 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均为非空
	{
		switch(comp(*pa,*pb))
		{
			case 0: pb++;
			case 1: *pc++ = *pa++;
				break;
			case -1: *pc++ = *pb++;
		}
	}
	while(pa <= pa_last) //表La非空 表Lb为空
		*pc++ = *pa++;
	while(pb <= pb_last)
		*pc++ = *pb++;
	Lc->length = pc - Lc->elem; 
}

int comp(int c1,int c2)
{
	int i;
	if(c1 < c2)
		i = 1;
	else if(c1 = c2)
		i = 0;
	else
		i = -1;
	return i;
}

程序执行结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值