1. 程式人生 > 其它 >資料結構實驗報告一

資料結構實驗報告一

技術標籤:資料結構

  1. 採用遞增有序的順序表表示集合,求解兩個集合的交集
    (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. 採用遞增有序的連結串列表示集合,求解兩個集合的交集
    (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);
}