用单链表实现两个矩阵的自然连接算法

当矩阵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);

}

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

珞珈大胖强TURBO

谢谢兄弟们,我会一直努力出货的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值