学习笔记------数据结构(C语言版)数组之行逻辑链接的顺序表

本文是关于使用C语言实现数据结构中的一种特殊形式——行逻辑链接的顺序表。通过RLSMatrix.cpp源代码,详细探讨了如何在数组中实现这种逻辑链接,以提高数据操作效率。
摘要由CSDN通过智能技术生成

//RLSMatrix.cpp

#include"predefined.h"
#include"RLSMatrix.h"

Status MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q)
//算法5.3:求矩阵乘积Q=M*N,采用行逻辑链接存储表示
{
	int arow,tp,p,brow,t,q,ccol,i,ctemp[10];
	if(M.nu!=N.mu)
		return ERROR;
	(*Q).mu=M.mu;
	(*Q).nu=N.nu;
	(*Q).tu=0;
	if(M.tu*N.tu!=0)
	{
		for(arow=1;arow<=M.mu;arow++)
		{
			for(i=1;i<N.nu+1;i++)
				ctemp[i]=0;
			(*Q).rpos[arow]=(*Q).tu+1;
			if(arow<M.mu)
				tp=M.rpos[arow+1];
			else
				tp=M.tu+1;
			for(p=M.rpos[arow];p<tp;p++)
			{
				brow=M.data[p].j;
				if(brow<N.mu)
					t=N.rpos[brow+1];
				else
					t=N.tu+1;
				for(q=N.rpos[brow];q<t;q++)
				{
					ccol=N.data[q].j;
					ctemp[ccol]+=M.data[p].e*N.data[q].e;
				}
			}
			for(ccol=1;ccol<=(*Q).nu;ccol++)
			{
				if(ctemp[ccol])
				{
					if(++(*Q).tu>MAXSIZE)
						return ERROR;
					(*Q).data[(*Q).tu].i=arow;
					(*Q).data[(*Q).tu].j=ccol;
					(*Q).data[(*Q).tu].e=ctemp[ccol];
				}
			}
		}
	}
	return OK;
}

Status CreateSMatrix(RLSMatrix *M)
//创建稀疏矩阵
{
	int i,m,n,row,t;
	int num[10];
	ElemType e;
	printf("请输入矩阵的行、列、非零元个数:");
	scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);
	for(i=1;i<=(*M).tu;i++)
	{
		printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:",i,(*M).mu,(*M).nu);
		scanf("%d,%d,%d",&m,&n,&e);
		(*M).data[i].i=m;
		(*M).data[i].j=n;
		(*M).data[i].e=e;
	}
	for(row=1;row<=(*M).mu;row++)
			num[row]=0;
	for(t=1;t<=(*M).tu;t++)
			++num[(*M).data[t].i];
	(*M).rpos[1]=1;
	for(row=2;row<=(*M).mu;row++)
			(*M).rpos[row]=num[row-1]+(*M).rpos[row-1];
	return OK;
}

void PrintSMatrix(RLSMatrix M)
//打印稀疏矩阵
{
	int i;
	printf("%d行%d列%d个非零元素。\n",M.mu,M.nu,M.tu);
	printf("行  列  元素值\n");
	for(i=1;i<=M.tu;i++)
		printf("%2d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);
 }

//RLSMatrix.h

#define MAXSIZE 12500
#define MAXRC 20
typedef int ElemType;
typedef struct
{
	int i,j;
	ElemType e;
}Triple;
typedef struct
{
	Triple data[MAXSIZE+1];//date[0]未用
	int rpos[MAXRC+1];//各行第一个非零元的位置表
	int mu,nu,tu;
}RLSMatrix;

Status MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q);
Status CreateSMatrix(RLSMatrix *M);
void PrintSMatrix(RLSMatrix M);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值