本文针对数据结构基础系列网络课程(2):线性表中第14课时线性表的应用。
问题:有表A,m1行、n1列,表B,m2行、n2列,求A和B的自然连接结果C
例:
解答:
#include <stdio.h>
#include <malloc.h>
#define MaxCol 10 //最大列数
typedef int ElemType;
typedef struct Node1 //定义数据结点类型
{
ElemType data[MaxCol];
struct Node1 *next; //指向后继数据结点
} DList;
typedef struct Node2 //定义头结点类型
{
int Row,Col; //行数和列数
DList *next; //指向第一个数据结点
} HList;
void CreateTable(HList *&h)
{
int i,j;
DList *r,*s;
h=(HList *)malloc(sizeof(HList)); //创建头结点
h->next=NULL;
printf("表的行数,列数:");
scanf("%d%d",&h->Row,&h->Col);
for (i=0; i<h->Row; i++)
{
printf(" 第%d行:",i+1);
s=(DList *)malloc(sizeof(DList)); //创建数据结点
for (j=0; j<h->Col; j++) //输入一行的数据初步统计
scanf("%d",&s->data[j]);
if (h->next==NULL) //插入第一个数据结点
h->next=s;
else //插入其他数据结点
r->next=s; //将*s插入到*r结点之后
r=s; //r始终指向最后一个数据结点
}
r->next=NULL; //表尾结点next域置空
}
void DispTable(HList *h)
{
int j;
DList *p=h->next;
while (p!=NULL)
{
for (j=0; j<h->Col; j++)
printf("%4d",p->data[j]);
printf("\n");
p=p->next;
}
}
void LinkTable(HList *h1,HList *h2,HList *&h)
{
int f1,f2,i;
DList *p=h1->next,*q,*s,*r;
printf("连接字段是:第1个表位序,第2个表位序:");
scanf("%d%d",&f1,&f2);
h=(HList *)malloc(sizeof(HList));
h->Row=0;
h->Col=h1->Col+h2->Col;
h->next=NULL;
while (p!=NULL)
{
q=h2->next;
while (q!=NULL)
{
if (p->data[f1-1]==q->data[f2-1]) //对应字段值相等
{
s=(DList *)malloc(sizeof(DList)); //创建一个数据结点
for (i=0; i<h1->Col; i++) //复制表1的当前行
s->data[i]=p->data[i];
for (i=0; i<h2->Col; i++)
s->data[h1->Col+i]=q->data[i]; //复制表2的当前行
if (h->next==NULL) //插入第一个数据结点
h->next=s;
else //插入其他数据结点
r->next=s;
r=s; //r始终指向最后数据结点
h->Row++; //表行数增1
}
q=q->next; //表2下移一个记录
}
p=p->next; //表1下移一个记录
}
r->next=NULL; //表尾结点next域置空
}
int main()
{
HList *h1,*h2,*h;
printf("表1:\n");
CreateTable(h1); //创建表1
printf("表2:\n");
CreateTable(h2); //创建表2
LinkTable(h1,h2,h); //连接两个表
printf("连接结果表:\n");
DispTable(h); //输出连接结果
return 0;
}