資料結構實驗報告一
阿新 • • 發佈:2020-12-28
技術標籤:資料結構
- 採用遞增有序的順序表表示集合,求解兩個集合的交集
(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);
}