(详细)C语言实现-稀疏矩阵及其转置(数据结构)

1.问题描述

        建立ADT稀疏矩阵定义,调用矩阵转置运算,并显示结果。从键盘输入稀疏矩阵的元素,利用三元组表进行存储,从屏幕显示稀疏矩阵的元素;然后调用稀疏矩阵(三元组存储结构)转置算法,将稀疏矩阵进行转置运算,并从屏幕显示转置后的稀疏矩阵的元素。

2.代码实现(代码中已注释)

//导入头文件
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100

//定义三元组
typedef struct{
	int i;//行
	int j;//列
	int e;//元素 
}Triple;

typedef struct{
	Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用
	int mu;//矩阵行数
	int nu;//矩阵列数
	int tu;//矩阵中非零元个数 
}TSMatrix; 

//创建稀疏矩阵
TSMatrix createMatrix(){
	TSMatrix M;//创建临时稀疏矩阵
	printf("请输入一个稀疏矩阵的三元组表示:\n");
	printf("请输入矩阵的行数、列数和非零元素的个数:");
	scanf("%d %d %d",&(M.mu),&(M.nu),&(M.tu));
	int k=1;
	while(k<=M.tu){
		printf("请输入第%d个非零元素的行号、列号和值:",k);
		scanf("%d %d %d",&(M.data[k].i),&(M.data[k].j),&(M.data[k].e));
		k++;
	}
	return M;//返回创建好的稀疏矩阵 
} 

//快速转置 
void FastTransposeSMatrix(TSMatrix M,TSMatrix *T){
	int num[MAXSIZE]; 
	int cpot[MAXSIZE];
	int q,p,col,t;
	T->mu=M.mu;//行数
	T->nu=M.nu;//列数
	T->tu=M.tu;//非零元素个数
	if(T->tu){
		for(col=1;col<=M.nu;col++){
			num[col]=0;
		}
		for(t=1;t<=M.tu;t++){
			++num[M.data[t].j];//求M中每一列非零元素个数 
		}
		cpot[1]=1;
		//求第col列中第一个非零元在b.data中的序号
		for(col=2;col<=M.nu;col++){
			cpot[col]=cpot[col-1]+num[col-1];
		}
		for(p=1;p<=M.tu;p++){
			col=M.data[p].j;
			q=cpot[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;
			cpot[col]++;
		}
	}
}

//以矩阵形式输出
void outMatrix(TSMatrix T){ 
	int k=1;
	for(int i=1;i<=T.mu;i++){
		for(int j=1;j<=T.nu;j++){
			if(i==T.data[k].i&&j==T.data[k].j){ //指定矩阵位置 
				printf("%d ",T.data[k].e);//输出元素
				k++;
			}else{
				printf("%d ",0);//输出元素 0
			}
		} 
		printf("\n");//换行
	}
} 
 
int main(){
	TSMatrix M,T;//创建稀疏矩阵,M为初始稀疏矩阵,T为稀疏矩阵转置后的矩阵 
	M=createMatrix();//创建稀疏矩阵 
	printf("构造好的矩阵如下:\n");//换行
	outMatrix(M); //输出显示
	FastTransposeSMatrix(M,&T);//快速转置 
	printf("\n转置后的稀疏矩阵的三元组表示为:\n");
	int k=1;
	while(k<=T.tu){
		printf("(%d,%d,%d)\n",(T.tu),(T.data[k].i),(T.data[k].j),(T.data[k].e));
		k++;
	}
	printf("\n转置后的矩阵如下:\n");
	outMatrix(T); //输出显示
	
} 

3.运行结果

猜你喜欢

转载自blog.csdn.net/m0_54158068/article/details/124761648