数据结构-线性表自然连接-应用实验
Posted Adorable_Rocy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-线性表自然连接-应用实验相关的知识,希望对你有一定的参考价值。
数据结构-线性表实验
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;
}
以上是关于数据结构-线性表自然连接-应用实验的主要内容,如果未能解决你的问题,请参考以下文章