/*
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;
}
程序执行结果: