数据结构实验报告一

  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);
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值