线性表的操作 (1)实现 A= A U B

本文介绍了一个使用C语言实现的线性表并集操作示例。通过定义线性表结构,实现初始化、插入、遍历等基本操作,并在此基础上实现了两个线性表的并集功能。用户可以输入两个线性表的元素,程序将输出这两个线性表的并集。
/*
LA和LB分别表示两个集合(现在要求一个新的集合 A = A U B) 
LA = {1,2,3,4}
LB = {4,5,6,7,8,9,0}
*/
#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); //输出线性表中的元素

//以下四个函数被Union()函数所调用
bool GetElem(SqList L,int pos,int *e); //取第pos个数据元素的值
bool equal(int c1,int c2); 
int LocateElem(SqList L,int e,bool (*compare)(int,int));
int ListLength(SqList L); //求线性表的长度
void Union(SqList *La,SqList Lb);//将所有在线性表Lb中但不在La中的元素插入到La中

int main()
{
	SqList La, Lb;
	int j;
	int va, vb;
	int num1, num2;
	InitList(&La);
	printf("请输入La元素的个数:");
	scanf("%d",&num1);
	for(j = 1; j <= num1; j++) //在表中插入4个元素
	{
		printf("请输入La中第%d个元素的值为",j);
		scanf("%d",&va);
		ListInsert(&La,j,va);
	}
	printf("La = "); //输出表La的元素
	ListTraverse(&La);

	InitList(&Lb);
	printf("请输入Lb中元素的个数:");
	scanf("%d",&num2);
	for(j = 1; j <= num2; j++) //在Lb表中插入7个元素
	{
		printf("请输入Lb中第%d个元素的值为",j);
		scanf("%d",&vb);
		ListInsert(&Lb,j,vb);
	}
	printf("Lb = "); //输出表Lb的内容
	ListTraverse(&Lb);
	Union(&La,Lb); //将所有在线性表Lb中但不在La中的元素插入到La中
	printf("new La = "); //输出新表La的内容
	ListTraverse(&La);
	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 true;
}

bool ListInsert(SqList *L,int pos,int e) //在第pos个位置插入e的值
{
	int * newbase, *q, *p;
	if(pos < 1 || pos > L->length+1 ) //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; //q为插入位置
	for(p = L->elem + L->length - 1; p >= q; --p) //插入位置及之后的元素右移
		*(p+1) = *p;
	*q = e; //插入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);
		*p++;
	}
	printf("\n");

	return true;
}

void Union(SqList *La,SqList Lb)
{  //将所有在线性表Lb中但不在La中的元素插入到La中
	int e;
	int La_len, Lb_len;
	int i;
	La_len = ListLength(*La); //求线性表的长度
	Lb_len = ListLength(Lb);
	//printf("Lb_len = %d\n",Lb_len);
	for(i = 1; i <= Lb_len; i++)
	{
		GetElem(Lb,i,&e); //取Lb中第i个元素赋给e
	//	printf("e = %d\n",e);
		if( !LocateElem(*La,e,equal) ) //La中不存在和e相同的元素 则插之
			ListInsert(La,++La_len,e);
	}
}

int ListLength(SqList L) //求线性表的长度
{
	return L.length;
}

bool GetElem(SqList L,int pos,int *e) //取第pos个数据元素的值
{
	if(pos < 1 || pos > L.length)
		return false;
	*e = *(L.elem + pos - 1);
	return true;
}

bool equal(int c1,int c2)
{
	if(c1 == c2)
		return true;
	else
		return false;
}

int LocateElem(SqList L,int e,bool (*compare)(int,int))
{//返回L中第一个与e满足关系compare()的数据元素的位序
	int *p;
	int i = 1; //i的初始值为第一个元素的位序
	p = L.elem;
	while(i <= L.length && !compare(*(p++),e))
		i++;
	if(i <= L.length)
		return i;
	else
		return 0;
}

程序执行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值