一步一步复习数据结构和算法基础-稀疏矩阵基本操作

本文介绍了如何创建、打印和快速转置稀疏矩阵。通过`CreatSMatrix`函数输入矩阵信息,`PrintSMatrix`展示矩阵,`TransposeSMatrix`和`FastTransposeSMatrix`完成矩阵转置。示例代码中,矩阵的存储结构为`TSMatrix`,包含三部分:非0元素、行数、列数和非0元个数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 1024
typedef struct {
	int i,j;
	int e;
}Triple;
typedef struct {
	Triple data[MAXSIZE+1];
	int mu,nu,tu;				//矩阵的行数、列数和非0元个数
}TSMatrix;

void CreatSMatrix(TSMatrix *M)
{

	int row,col;
	int t,k,sum;
	printf("输入矩阵的行数列数和非零元的个数\n");
	scanf("%d%d%d",&t,&k,&sum);
	(*M).mu = t;	(*M).nu = k;	(*M).tu = sum;
	for(t=0;t<sum;t++)
	{
		scanf("%d%d%d",&row,&col,&k);
		(*M).data[t].i = row;
		(*M).data[t].j = col;
		(*M).data[t].e = k;
	}

}


void PrintSMatrix(TSMatrix M)
{

	int t,k;
	int p=0;

	printf("\n");
	for(t=0;t<M.mu;t++)
	{
		for(k=0;k<M.nu;k++)
		{
			if(t == (M.data[p].i-1) && k == (M.data[p].j-1))
			{
				printf("%d ",M.data[p].e);
				p++;
			}
			else
				printf("0 ");
		}
		printf("\n");
	}
	printf("\n");

}

int TransposeSMatrix(TSMatrix M,TSMatrix *T)
{
	int p,q,col;
	(*T).mu = M.mu;
	(*T).nu = M.nu;
	(*T).tu = M.tu;

	if((*T).tu)
	{
		q = 0;
		for(col = 1;col <= M.nu;col++)
			for(p = 0;p < M.tu; p++)
				if(M.data[p].j == col)
				{
					(*T).data[q].i = M.data[p].j;
					(*T).data[q].j = M.data[p].i;
					(*T).data[q].e = M.data[p].e;
					q++;
				}
	}
	
	return 1;
}

int FastTransposeSMatrix(const TSMatrix *M,TSMatrix *T){  

	int col,t,p,q,*num,*cpot;  

	T->mu=M->nu;    T->nu=M->mu;    T->tu=M->tu;  

	if(T->tu){

		num=(int *)malloc(sizeof(int)*M->tu);  
		cpot=(int *)malloc(sizeof(int)*M->tu);  
		if(!(num&&cpot)){  
			printf("error.\n");  
			exit(0);  
		}
		for(col=0;col<M->nu;col++) num[col]=0;  
		 
		for(t=0;t<M->tu;t++)   ++num[M->data[t].j - 1];

		cpot[0]=0;
		 
		for(col=1;col<M->nu;col++)  
			cpot[col]=cpot[col-1]+num[col-1];

		for(p=0;p<M->tu;p++)
		{

			col=M->data[p].j;   q=cpot[col - 1];
			T->data[q].i=M->data[p].j;
			T->data[q].j=M->data[p].i;
			T->data[q].e=M->data[p].e;
			++cpot[col - 1];

		}

	}
	return 1;  
} 

int main()
{

	TSMatrix M,T;
	CreatSMatrix(&M);
	PrintSMatrix(M);
	FastTransposeSMatrix(&M,&T);
	PrintSMatrix(T);
	return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值