当矩阵a的第i列和矩阵b的第j列的某一行数字相等的时候,将这一行连接起来
2,2,3
1,3,2的第三列
和
3,1
2,4的第一列链接
2,2,3,3,1
1,3,2,2,4
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct Node1//普通节点,每个节点保存一行数字
{
int data[10];//存放一行数字的数组
struct Node1* next;//指向下一个node节点的指针
}DList;
typedef struct Node2//头节点,保存行数,列数,指向下一个node节点的指针
{
int Row, Col;
DList* next;
}HList;
void CreateTable(HList*& h)//创建链表的方法
{
int i, j;
DList* r=NULL, * s;//r置空不出错
h = (HList*)malloc(sizeof(HList));//创建头节点
h->next = NULL;
cout << "表的行数,列数:";
cin >> h->Row >> h->Col;//存行数列数
for (i = 0; i < h->Row; i++)//每一行一循环
{
cout << "第" << i + 1 << "行";
s = (DList*)malloc(sizeof(DList));//创建这一行的数据结构
for (j = 0; j < h->Row; j++)//记录这一行的数据
cin >> s->data[j];
if (h->next == NULL)//第一下,插s为头节点的下一个节点
h->next = s;
else
r->next = s;//以后都是将s插到r后面
r = s;
}
r->next = NULL;
}
void DestroyTable(HList*& h)//销毁链表的方法
{
DList* pre = h->next, * p = pre->next;//pre为第一个节点,p第二个
while (p != NULL)//释放前一个,整体向后移动一位
{
free(pre);
pre = p;
p = p->next;
}
free(pre);//最后剩一个pre了
free(h);
}
void show(HList*& L)
{
DList* p = L->next;
while (p->next != NULL)
{
for (int i = 0; i < L->Col; i++)
cout << p->data[i] << " ";
cout << endl;
p = p->next;//每个p里面有一行数据,全部输出了将p后移
}
for (int i = 0; i < L->Col; i++)
cout << p->data[i] << " ";
}
void LinTable(HList* h1, HList* h2, HList*& h)//链接矩阵算法
{
int i, j, k;
DList* p = h1->next, * q, * r=NULL, * s;//p作为第一个矩阵
cout << "链接字段是:第一个,第二个:";
cin >> i >> j;
h = (HList*)malloc(sizeof(HList));
h->Row = 0;
h->Col = h1->Col + h2->Col;
h->next = NULL;
while (p != NULL)//p的所有行遍历,此循环最后一行自增p
{
q = h2->next;
while (q != NULL)//q的所有行遍历
{
if (p->data[i - 1] == q->data[j - 1])//判断第一个矩阵的第i个数字是否和第二个矩阵的第j个数字相等
{
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 (h->next == NULL)
h->next = s;
else
r->next = s;
r = s;
h->Row++;
}
q = q->next;
}
p = p->next;
}
r->next = NULL;
}
void main()
{
HList* h1, * h2, * h;
cout << "第一个矩阵";
CreateTable(h1);
cout << "第二个矩阵";
CreateTable(h2);
show(h1);
cout << endl;
show(h2);
LinTable(h1, h2, h);
cout << endl;
show(h);
DestroyTable(h1);
DestroyTable(h2);
DestroyTable(h);
}