您的位置:首页 > 其它

第三周项目三 求集合并集

2016-09-17 21:45 155 查看
问题及代码:

/*

*Copyright (c) 2016, 烟台大学计算机与控制工程学院

*All rights reserved.

*文件名称:main

*作 者:申鹏鹏

*完成日期:2016年9月17日

*问题描述:假设有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即线性表中的数据元素即为集合中的成员。设计算法,用函数unionList(List LA, List LB, List &LC )函数实现该算法,求一个新的集合C=A∪B,即将两个集合的并集放在线性表LC中。

提示:

(1)除了实现unnionList函数外,还需要在main函数中设计代码,调用unionList进行测试和演示;

(2)可以充分利用前面建好的算法库[点击…],在程序头部直接加 #include<list.h>即可(工程中最普遍的方法,建议采纳);

(3)也可以将实现算法中需要的线性表的基本运算对应的函数,与自己设计的所有程序放在同一个文件中。

*/

#include<stdio.h>

#include<malloc.h>

#define MaxSize 50

typedef int ElemType;

typedef struct

{

ElemType data[MaxSize];

int length;

} SqList;

void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表

void InitList(SqList *&L);//初始化线性表InitList(L)

void DestroyList(SqList *&L);//销毁线性表DestroyList(L)

bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L)

int ListLength(SqList *L);//求线性表的长度ListLength(L)

void DispList(SqList *L);//输出线性表DispList(L)

bool GetElem(SqList *L,int i,ElemType &e);//求某个数据元素值GetElem(L,i,e)

int LocateElem(SqList *L, ElemType e);//按元素值查找LocateElem(L,e)

bool ListInsert(SqList *&L,int i,ElemType e);//插入数据元素ListInsert(L,i,e)

bool ListDelete(SqList *&L,int i,ElemType &e);//删除数据元素ListDelete(L,i,e)

void unionList(SqList *LA, SqList *LB, SqList *&LC);//合并

void CreateList(SqList *&L, ElemType a[], int n)

{

int i;

L=(SqList *)malloc(sizeof(SqList));

for (i=0; i<n; i++)

L->data[i]=a[i];

L->length=n;

}

//初始化线性表InitList(L)

void InitList(SqList *&L) //引用型指针

{

L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间

L->length=0;

}

//销毁线性表DestroyList(L)

void DestroyList(SqList *&L)

{

free(L);

}

//判定是否为空表ListEmpty(L)

bool ListEmpty(SqList *L)

{

return(L->length==0);

}

//求线性表的长度ListLength(L)

int ListLength(SqList *L)

{

return(L->length);

}

//输出线性表DispList(L)

void DispList(SqList *L)

{

int i;

if (ListEmpty(L)) return;

for (i=0; i<L->length; i++)

printf("%d ",L->data[i]);

printf("\n");

}

bool GetElem(SqList *L,int i,ElemType &e)

{

if (i<1 || i>L->length) return false;

e=L->data[i-1];

return true;

}

bool ListInsert(SqList *&L,int i,ElemType e)

{

int j;

if (i<1 || i>L->length+1)

return false; //参数错误时返回false

i--; //将顺序表逻辑序号转化为物理序号

for (j=L->length; j>i; j--) //将data[i..n]元素后移一个位置

L->data[j]=L->data[j-1];

L->data[i]=e; //插入元素e

L->length++; //顺序表长度增1

return true; //成功插入返回true

}

int LocateElem(SqList *L, ElemType e)

{

int i=0;

while (i<L->length && L->data[i]!=e) i++;

if (i>=L->length) return 0;

else return i+1;

}

void unionList(SqList *LA, SqList *LB, SqList *&LC)

{

int lena,i;

ElemType e;

InitList(LC);

for (i=1; i<=ListLength(LA); i++) //将LA的所有元素插入到Lc中

{

GetElem(LA,i,e);

ListInsert(LC,i,e);

}

lena=ListLength(LA); //求线性表LA的长度

for (i=1; i<=ListLength(LB); i++)

{

GetElem(LB,i,e); //取LB中第i个数据元素赋给e

if (!LocateElem(LA,e)) //LA中不存在和e相同者,插入到LC中

ListInsert(LC,++lena,e);

}

}

int main()

{

SqList *sq_a, *sq_b, *sq_c;

ElemType a[6]= {5,8,7,2,4,9};

CreateList(sq_a, a, 6);

printf("LA: ");

DispList(sq_a);

ElemType b[6]= {2,3,8,6,0};

CreateList(sq_b, b, 5);

printf("LB: ");

DispList(sq_b);

unionList(sq_a, sq_b, sq_c);

printf("LC: ");

DispList(sq_c);

return 0;

}

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: