- 采用递增有序的顺序表表示集合,求解两个集合的交集
(1)定义顺序表的存储结构;
(2)实现存储递增有序集合的顺序表的建立、求交集运算;
//采用递增有序的顺序表表示集合,求解两个集合的交集
//(1)定义顺序表的存储结构;
//(2)实现存储递增有序集合的顺序表的建立、求交集运算;
# include<stdio.h>
# include<stdlib.h>
# define MaxSize 100
//定义顺序表的存储结构
typedef struct{
int data[MaxSize];
int length;
}SqList;
//建立顺序表 ,把数组的值放进表中
void CreateList(SqList *&L,int a[],int n){
int i=0,k=0;
L=(SqList *)malloc(sizeof(SqList));
while(i<n){
L->data[k]=a[i];
k++,i++;
}
L->length=k;
}
//输出线性表
void DispList(SqList *L){
for(int i=0;i<L->length;i++){
printf("%d ",L->data[i]);
}
}
/*----并集函数:二路归并算法 ----*/
void MergeList(SqList *La,SqList *Lb,SqList *&Lc){
int i=0,j=0,k=0;
Lc=(SqList *)malloc(sizeof(SqList));
while(i<La->length&&j<Lb->length){
if(La->data[i]<Lb->data[j]){
Lc->data[k]=La->data[i];
i++,k++;
}
else if(La->data[i]>Lb->data[j]){
Lc->data[k]=Lb->data[j];
j++,k++;
}
else if(La->data[i]=Lb->data[j]){
Lc->data[k]=La->data[i];
i++,j++,k++;
}
}
while(i<La->length){
Lc->data[k]=La->data[i];
i++,k++;
}
while(j<Lb->length){
Lc->data[k]=Lb->data[j];
j++,k++;
}
Lc->length=k;
}
/*--------交集函数--------*/
void InterSection(SqList *La,SqList *Lb,SqList *&Ld){
int i=0,j=0,k=0;
Ld=(SqList *)malloc(sizeof(SqList));
while(i<La->length&&j<Lb->length){
if(La->data[i]==Lb->data[j]){
Ld->data[k]=La->data[i];
i++,j++,k++;
}
else{
if(La->data[i]>Lb->data[j]){
j++;
}
else{
i++;
}
}
}
Ld->length=k;
}
/*--------主函数--------*/
int main(){
SqList *A,*B,*C,*D;
int a[3]={2,5,9};
int b[4]={3,5,9,11};
CreateList(A,a,3);
CreateList(B,b,4);
MergeList(A,B,C);
printf("并集:");
DispList(C);
InterSection(A,B,D);
printf("交集:");
DispList(D);
}
实验结果:
- 采用递增有序的链表表示集合,求解两个集合的交集
(1)定义链表的存储结构;
(2)实现存储递增有序集合的链表的建立、求交集运算
#include<stdio.h>
#include<stdlib.h>
//定义单链表存储结构
typedef struct LNode{
int data;
struct LNode *next;
}LinkNode;
//尾插法建立单链表
void CreateListR(LinkNode *&L,int a[],int n){
LinkNode *s,*r;
L=(LinkNode *)malloc(sizeof(LinkNode)); //创建头结点
r=L; //r始终指向尾结点,初始时指向头结点
for(int i=0;i<n;i++){ //循环建立数据结点
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a[i]; //建立数据结点s
r->next=s; //将结点s插入到结点r之后
r=s;
}
r->next=NULL;
}
//输出线性表
void DespList(LinkNode *L){
LinkNode *p=L->next; //p指向首结点
while(p!=NULL){ //p不为NULL,输出p的data域
printf("%d ",p->data);
p=p->next; //p移向下一个结点
}
printf("\n");
}
/*并集函数,二路归并算法*/
void MergeList(LinkNode *LA,LinkNode *LB,LinkNode *&LC){
LinkNode *pa=LA->next,*pb=LB->next,*r,*s;
LC=(LinkNode *)malloc(sizeof(LinkNode)); //创建LC的头结点
r=LC; //r始终指向LC的尾结点
while (pa!=NULL&&pb!=NULL){
if(pa->data<pb->data){
s=(LinkNode *)malloc(sizeof(LinkNode)); //复制所指结点
s->data=pa->data;
r->next=s; //将s结点插入到LC中
r=s;
pa=pa->next; //pa移向下一个结点
}
else if(pa->data>pb->data){
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=pb->data;
r->next=s;
r=s;
pb=pb->next;
}
else {
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=pb->data;
r->next=s;
r=s;
pb=pb->next; //pa,pb都移向下一个结点
pa=pa->next;
}
}
while(pa!=NULL){
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=pa->data;
r->next=s;
r=s;
pa=pa->next;
}
while(pb!=NULL){
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=pb->data;
r->next=s;
r=s;
pb=pb->next;
}
r->next=NULL;
}
//交集函数
void InterSection(LinkNode *LA,LinkNode *LB,LinkNode *&LD){
LinkNode *pa=LA->next,*pb=LB->next,*r,*s;
LD=(LinkNode *)malloc(sizeof(LinkNode)); //创建LD的头结点
r=LD;
while (pa!=NULL&&pb!=NULL){
if(pa->data>pb->data){
pb=pb->next;
}
else if(pa->data<pb->data){
pa=pa->next;
}
else{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=pa->data;
r->next=s;
r=s;
pb=pb->next;
}
r->next=NULL;
}
}
//主函数
int main(){
LinkNode *A,*B,*C,*D;
int a[3]={2,5,9};
int b[4]={3,5,9,11};
CreateListR(A,a,3);
CreateListR(B,b,4);
MergeList(A,B,C);
printf("并集:");
DespList(C);
InterSection(A,B,D);
printf("交集:");
DespList(D);
}