您的位置:首页 > 理论基础 > 数据结构算法

顺序表:两集合的交集

2015-09-21 16:59 309 查看

【项目 - 求集合并集】

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

 
list.h
 
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED

/*
* Copyright (c) 2015, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:main.cpp,hanshu.cpp,list.h
* 作者:徐吉平
* 完成日期:2015年9月21日
* 版本号:code ::Block 13.12
*
* 问题描述:顺序表:两集合的交集
* 输入描述:无
* 程序输出:线性表的结果
*/

#include <stdio.h>
#include <malloc.h>
#define MaxSize 50    //Maxsize将用于后面定义存储空间的大小
typedef int ElemType;  //ElemType在不同场合可以根据问题的需要确定,在此取简单的int
typedef struct
{
ElemType data[MaxSize];  //利用了前面MaxSize和ElemType的定义
int length;
}SqList;

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

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

bool ListInsert(SqList *&L,int i,ElemType e) ;//插入数据元素ListInsert(L,i,e)
int ListLength(SqList *L);//求线性表的长度ListLength(L)
bool GetElem(SqList *L,int i,ElemType &e);//求某个数据元素值GetElem(L,i,e)
int LocateElem(SqList *L, ElemType e);//按元素值查找LocateElem(L,e)
bool ListDelete(SqList *&L,int i,ElemType &e);//删除数据元素ListDelete(L,i,e)
bool ListEmpty(SqList *L);//判断线性表是否为空
void DispList(SqList *L);//输出线性表
void DestroyList(SqList *&L);//销毁线性表DestroyList(L)

#endif // LIST_H_INCLUDED

hanshu.cpp

#include "list.h"

void unionList(SqList *LA, SqList *LB, SqList *&LC)
{
int lena;
ElemType e;
InitList(LC);
for(int i=1;i<=LA->length;i++)
{
GetElem(LA,i,e);
ListInsert(LC,i,e);
}

for(int i=1;i<=LB->length;i++)
{
GetElem(LB,i,e);         //取LB中第i个数据元素赋给e
if (!LocateElem(LA,e)) //LA中不存在和e相同者,插入到LC中
ListInsert(LC,++lena,e);

}
}

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

void InitList(SqList *&L)
{
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
//用数组创建线性表CreateList(SqList L, ElemType a, int n)
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;
}
//插入数据元素ListInsert(L,i,e)
bool ListInsert(SqList *&L,int i,ElemType e)
{
int j;
if(i<1||i>L->length+1)
{
return false;
}
i--;
for(j=L->length;j>i;j--)
{
L->data[j]=L->data[j-1];
}
L->data[i]=e;
L->length++;
return true;
}
//求线性表的长度ListLength(L)
int ListLength(SqList *L)
{
return(L->length);
}
//求某个数据元素值GetElem(L,i,e)
bool GetElem(SqList *L,int i,ElemType &e)
{
if (i<1 || i>L->length)  return false;
e=L->data[i-1];
return true;
}
//按元素值查找LocateElem(L,e)
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;
}
//删除数据元素ListDelete(L,i,e)
bool ListDelete(SqList *&L,int i,ElemType &e)
{
int j;
if (i<1 || i>L->length)  //参数错误时返回false
return false;
i--;        //将顺序表逻辑序号转化为物理序号
e=L->data[i];
for (j=i; j<L->length-1; j++) //将data[i..n-1]元素前移
L->data[j]=L->data[j+1];
L->length--;              //顺序表长度减1
return true;              //成功删除返回true
}
//判定是否为空表ListEmpty(L)
bool ListEmpty(SqList *L)
{
return (L->length==0);
}
//输出线性表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");
}
//销毁线性表DestroyList(L)
void DestroyList(SqList *&L)
{
free(L);
}


main.cpp

#include <stdio.h>
#include "list.h"

int main()
{
SqList *sq_a,*sq_b,*sq_c;
ElemType a[10]={0,1,2,3,4,5,6,7,8,9};
ElemType b[10]={5,6,7,8,9,10,11,12,13,14};

CreateList(sq_a, a, 10);
CreateList(sq_b,b,10);

printf("顺序表sq_a为:");
DispList(sq_a);

printf("顺序表sq_b为:");

DispList(sq_b);

unionList(sq_a, sq_b,sq_c);

printf("顺序表sq_c为:");

DispList(sq_c);

return 0;
}

总结体会:该项目充分的利用了算法库的函数,使项目的编写大大简化了,unionList(sq_a, sq_b,sq_c)函数编写时由于对顺序表sq_c没有初始化,程序始终无法运行。后来经过老师指正后,虽然程序能运行了,但结果却不正确,经过反复查找问题发现,将sq_a复制给sq_c的语句是不对的,因为sq_c的长度是不是固定的,用sq_c->data[i]=sq_a->data[i]是不行的,只能通过先提取数据元素再插入到sq_c的方式才能解决sq_c的长度问题,所以问题终于解决了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息