用顺序表实现求两个集合的并集
Posted xuzhiyi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用顺序表实现求两个集合的并集相关的知识,希望对你有一定的参考价值。
#include<iostream.h>
#include<malloc.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<stdlib.h>
#include<process.h>
#define OK 1
#define INIT_LiST_SIZE 100//顺序表的初始长度
#define LIST_ADD 10//顺序表每次增加的长度
#define ERROR 0
#define OVERFLOW 3
typedef int Elemtype;
typedef struct
{
Elemtype *elem;//顺序表的基地址
int length;//顺序表的当前长度
int listsize;//顺序表分配的长度
}SqList;
void InitList(Sqlist &La)//初始化顺序表
{
La.elem=(Elemtype *)malloc(INIT_LIST_SIZE*sizeof(int));//开辟100个一连串的地址,并强制转化为Elemtype类型
La.length=0;//顺序表的当前长度为0
La.listsize=100;//目前顺序表的总长度
}
Elemtype ListInsert(Sqlist &La,int i,int e)//在顺序表的第i个元素前一个位置插入元素e
{
if(i<1||i>La.length+1)return ERROR;//表示插入位置不合理
if(La.listsize>=La.length)
{
Elemtype *newbase=(Elemtype *)realloc(La.elem,(INIT_LIST_SIZE+LIST_ADD)*sizeof(int));//给当前顺序表增加长度
La.elem=newbase;//将新开辟的一片连续地址的首地址赋给基地址
}
int *q=La.elem[i-1];
for(int *p=La.elem[lLa.length-1];p>=q;p--)
{
*(p+1)=*(p);//j将顺序表的最后一个元素到*q这个元素一次向后移一个位置
}
*q=e;//插入元素
La.length++;//顺序表的长度加1
return OK;
}
SqList Union(SqList La,SqList Lb,SqList &Lc)//求两个集合的相同元素并插入到Lc中
{
int La_len=La.length;
int Lb_len=Lb.length;
int i=1;
for(int *p=La.elem;p<=La.elem[La_len-1];p++)
for(int *q=Lb.elem;q<=Lb.elem[Lb_len-1];q++)//此处类似于冒泡排序法
{
if(*p==*q)
{
ListInsert(Lc,i;*p);
i++;
break;//此处的break可以减少不必要的查找,减少计算机的工作量
}
}
return Lc;
}
void Print(SqlList La)//输出函数
{
for(int *p=La.elem;p<=La.elem[La.length-1];p++)cout<<*p<<endl;
}
void main()
{
int a[3]={1,2,3};
int b[4]={1,2,3,4};
SqList La,Lb,Lc;
InitList(La);
InitList(Lb);
InitList(Lc);
for(int i=1;i<=3;i++)ListInsert(La,i,a[i-1]);//将数组a的元素插入到La中
for(int j=1;j<=4;j++)ListInsert(Lb,j,b[j-1]);//将数组b中的元素插入到Lb中
Print(Union(La,Lb,Lc));
以上是关于用顺序表实现求两个集合的并集的主要内容,如果未能解决你的问题,请参考以下文章