顺序表中两个集合的并集

/*程序的版权和版本声明部分:
*Copyright(c)2014,烟台大学计算机学院学生
*All rights reserved.
*文件名称:
*作者:田成琳
*完成日期:2014 年 9 月 2 日
*版本号:v1.0
*对任务及求解方法的描述部分:
*问题描述:线性顺序表的简单应用
*程序输入:两个集合
*程序输出:两个集合的并集
*问题分析:
*算法设计:
*/
#include<iostream>
#include<cstdlib>
using namespace std;
const int MaxSize=50;       //顺序表中最多元素个数
typedef struct
{
	int data[MaxSize];  //存放顺序表中元素
	int length;         //存放顺序表长度
}SqList;
void InitList(SqList *&L);       //初始化线性表,构造空线性表L
void CreateList(SqList *L,int a[],int n);//建立顺序表
void DestroyList(SqList *&L);    //销毁线性表,释放L占用的空间
bool ListEmpty(SqList *L);       //判断线性表是否为空
int ListLength(SqList *L);       //返回线性表元素个数
void DisplayList(SqList *L);     //输出线性表
int GetElem(SqList *L,int i,int &e);//求线性表中某个元素值,e返回该数据
bool LocateElem(SqList *L,int e);    //返回线性表中与e相等的元素位置
bool ListInsert(SqList *L,int i,int e);//在第i(1<=i<=n)插入元素e到线性表
bool ListDelete(SqList *L,int i);//,int &e);//删除数据元素,并用e返回值
void InitList(SqList *L)
{
    L->length=0;                   //空线性表长度设为0
	L=(SqList *)malloc(sizeof(SqList));//分配存放线性表的空间
}
void CreateList(SqList *L,int a[],int n)
{
    for(int i=0;i<n;i++)
        L->data[i]=a[i];
    L->length=n;
}
void DestroyList(SqList *&L)
{
	free(L);
}
bool ListEmpty(SqList *L)
{
	return(L->length==0);
}
int ListLength(SqList *L)
{
	return(L->length);
}
void DisplayList(SqList *L)
{
	for(int i=0;i<L->length;i++)
		cout<<L->data[i]<<" ";  //遍历输出
	cout<<endl;
}
int GetElem(SqList *L,int i,int &e)
{
	if(i<1||i>L->length)
		cout<<"输入数据出错!"<<endl;
	e=L->data[i-1];
	return e;
}
bool LocateElem(SqList *L,int n)
{
	int i=0;
	while(i<=L->length&&L->data[i]!=n)
		i++;
	if(i>L->length)
		return false;    //未找到返回false
	else
		return true;    //找到返回true
}
bool ListInsert(SqList *L,int i,int 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];//将i及后面元素后移一个位置
	L->data[i]=e;  //插入元素e
	L->length++;   //长度加1
	return true;
}
bool ListDelete(SqList *L,int i)//,int &e)
{
    int j;
	if(i<1||i>L->length+1)
		return false;    //参数错误
	i--;    //将顺序表逻辑序号转为物理序号
	//e=L->data[i];
	for(j=i;j<L->length-1;j++)
		L->data[j]=L->data[j+1];//将i及后面元素前移一个位置
		L->length--;   //长度减1
		return true;
}
int main()
{
    SqList LA,LB,LC;
	int na,nb,a[MaxSize],b[MaxSize],i,j,lena;
	cout<<"请输入A集合元素个数及元素值:"<<endl;
	cin>>na;
	for(i=0;i<na;i++)
		cin>>a[i];
	CreateList(&LA,a,na);  //创建A集合
	cout<<"请输入B集合元素个数及元素值:"<<endl;
	cin>>nb;
	for(j=0;j<nb;j++)
		cin>>b[j];
    CreateList(&LB,b,nb);  //创建B集合
    InitList(&LC);
    for(i=1;i<=ListLength(&LA);i++)//将LA所有元素插入LC
    {
        GetElem(&LA,i,na);
        ListInsert(&LC,i,na);
    }
    lena=ListLength(&LA);//求线性表A的长度
    for(i=1;i<=ListLength(&LB);i++)
    {
        GetElem(&LB,i,nb);  
        if(!LocateElem(&LA,nb))   //遍历A集合,和B集合中不同就插入C集合
            ListInsert(&LC,++lena,nb);
    }
	cout<<"集合A与B的并集为:"<<endl;
	DisplayList(&LC);
    return 0;
}

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值