数据结构-线性表自然连接-应用实验

数据结构-线性表实验

1.实验项目:线性表的应用
2. 实验目的:通过计算任意两个表的简单自然连接过程。表A和表B的笛卡尔积中满足指定连接的所有记录,连接条件为表的第i列与表B的第j列相等。
3. 实验过程内容记录

1.A和表B是一个简单的二维数组组成的,但是由于每个表的行数不确定,所以采用单链表作为标的存储结构,每行作为一个数据节点。由于我们需要查找每行的元素以及扩充元素,所以我们需要准备一个查询速度快的存储结构来存储列数据,所以我们需要行数和列数,并且将行数和列数设置到头结点中,表每行的列数据放到数据结点中。
2.准备两个数据结点类型,Node1(data数组,指针域),Node2(行数列数,Node1指针域)。
3.连接表A和表B最后生成的结果集。创建连接表算法,合并两个结果集。
4.在连接表A和表B之后,两个结果集需要输出。创建销毁单链表算法,传入链表地址,我们使用free()函数对链表进行销毁,最后再释放头结点。
5.在准备数据并且准备输出的时候,按照printf函数指定输入值创建单链表。
6.创建完链表后调用合并链表的算法,将表A和表B进行自然连接,完成自然连接。
7.在完成连接后,调用输出连接后结果的算法,将表A和表B自然连接结果输出展示。
8.验证算法正确性,以及是否有出现漏算、漏连等不合理设计。
9.观察最终结果,进行结果实验分析。
关键点:表A->data[i-1]B->data[j-1]如果相等,则应用尾插法将结点补上。
#define MaxCol 10
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>


typedef struct Node1{
	int data[MaxCol];
	struct Node1 *next;
}Dlist;

typedef struct Node2{
	int Row , Col;
	Dlist *next;
}Hlist;

//创建节点链表 
void createNode(Hlist *&H){
	
	int i = 0 , j = 0;
	Dlist *r , *s;
	H = (Hlist *)malloc(sizeof(Hlist));
	printf("请输入行列数:\n");
	scanf("%d,%d",&H->Row , &H->Col);
	H->next = NULL;
	for(i = 0;i<H->Row;i++){
	
		s = (Dlist *)malloc(sizeof(Dlist));
		for(j = 0;j<H->Col;j++){
				printf("第%d行第%d列的值:",i+1,j+1);
			scanf("%d",&s->data[j]);	
			printf("\n");		
		}		
				if(H->next == NULL)
					H->next = s;
				else
					r->next = s;
					
				r = s;	
	}
	r->next = NULL;
}
//销毁链表
void destoryTable(Hlist *&h){
	Dlist *p = h->next , *pre = p->next;
	
		while(p!=NULL){
			free(p);
			p = pre;
			pre = pre -> next;
		} 
		free(h);
		free(pre);
}

void DispTable(Hlist *h){
	int i = 0;
	Dlist *p = h->next;
	while(p!=NULL){
		
		for(i = 0;i<h->Col;i++){
			printf("%d\t",p->data[i]);
		}
		printf("\n");
		p = p->next;
		
	}
}

void LinkTable(Hlist *h1 , Hlist *h2 , Hlist *&h3){
	
	int i , j , k ;
	Dlist *p = h1->next , *q ,*s , *r;
	printf("连接字段是:第1个表序号,第2个表序号:"); 
	scanf("%d,%d",&i,&j);
	
	h3 = (Hlist *)malloc(sizeof(Hlist));
	h3->Row = 0;
	h3->Col = h1->Col + h2->Col;
	h3->next = NULL;
	
	while(p!=NULL){
		q = h2->next;
		while(q!=NULL){
			if(p->data[i-1] == q->data[j-1]){
				s = (Dlist *)malloc(sizeof(Dlist));
				for(k=0;k<h1->Col;k++){
					s->data[k] = p->data[k];
				}
				for(k=0;k<h2->Col;k++){
					s->data[h1->Col + k] = q->data[k];
				}
				if(h3->next == NULL){
					h3->next = s;
				}else{
					r -> next = s;
				}
				r = s;
				h3->Row++;
			}
			q = q->next;
		}
		p = p->next;
	}
		r -> next = NULL;	 
}

main(){
	
	Hlist *h1 , *h2 , *h3;
	printf("表一:\n");
	createNode(h1);
		printf("表二:\n");
	createNode(h2);
	
	LinkTable(h1,h2,h3);
	printf("连接结果表:\n");
	DispTable(h3);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值