数据结构实验(矩阵的压缩存储)

数据结构实验(矩阵的压缩存储)

  • 实验目的:掌握数组这种抽象数据类型的特点;掌握稀疏矩阵的三元组表存储结构的描述方法和具体实现。

  • 实验要求:采用三元组顺序表存储方式,实现稀疏矩阵的快速转置算法。

  • 实验内容

#include<iostream.h>
//using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;

//三元组顺序表类型定义
#define MAXSIZE 100
typedef struct
{
 int i,j;
 ElemType e;
}Triple;
typedef struct
{
	Triple *data;//data[0]不用
	int mu,nu,tu;
}TSMatrix;

//初始化三元组表
Status InitMatrix(TSMatrix &M)
{	
	M.data=new Triple[MAXSIZE+1];
	M.mu=0;M.nu=0;M.tu=0;
	return OK;
}

//按行优先顺序创建一个矩阵的三元组表
Status CreatMatrix(TSMatrix &M)
{
	int t;
	InitMatrix(M);
	cout<<"*********欢迎进入转置系统*********\n\n";
	cout<<"输入稀疏矩阵的行数、 列数和非零元素个数:"<<endl;
	cin>>M.mu>>M.nu>>M.tu;
	if(M.tu==0)return ERROR;
	cout<<"按行序输入"<<M.tu<<"个非零元的三元组:"<<endl;
	for(t=1;t<=M.tu;t++)
	{
	cout<<"输入第"<<t<<"个非零元的行号、列号和值:"<<endl;
	cin>>M.data[t].i>>M.data[t].j>>M.data[t].e;
	}
	return OK;

}

//转置三元组表--快速转置法
Status FastTransMatrix(TSMatrix M,TSMatrix &T)
{//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T。
	T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
	int cpot[100];int num[100];
	if(T.tu)
	{
		for(int col=1;col<=M.nu;++col)  num[col]=0;//num数组的初始化
		for(int 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];//求cpot向量
		int q;	
		for(int 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];
		}//for
	}//if
	
	return OK;
}//FastTransposeSMatrix


//按三元组表方式输出一个矩阵
Status OutputMatrix(TSMatrix M)
{
	int t;
	cout<<M.mu<<"行 "<<M.nu<<"列 "<<M.tu<<" 个非零元 "<<endl;
	cout<<" 各非零元分别为:  "<<endl;
	for(t=1;t<=M.tu;t++)
	{
	cout<<M.data[t].i<<" "<<M.data[t].j<<" "<<M.data[t].e<<endl;
	}
	return OK;

}


//按阵列方式输出一个矩阵
Status PrintMatrix(TSMatrix M)
{

	int row,col,k;
	int a[10][10];
	for(row=1;row<=M.mu;row++)
		for(col=1;col<=M.nu;col++)
			a[row][col]=0;
	for(k=1;k<=M.tu; k++)
	{
		for(row=1;row<=M.mu;row++)
			for(col=1;col<=M.nu;col++)
				if((M.data[k].i==row)&&(M.data[k].j==col))
					a[row][col]=M.data[k].e;
	
	
	}
	for(row=1;row<=M.mu;row++)
	{
		for(col=1;col<=M.nu;col++)
			cout<<a[row][col]<<" ";
		cout<<endl;
	
	
	}
	return OK;
	}

int main()
{
	TSMatrix M;
	TSMatrix T;

	CreatMatrix(M);//调用创建函数
	cout<<endl<<"原始矩阵M为: ";
	OutputMatrix(M);
	cout<<endl;

	cout<<"原始矩阵M阵列为:  "<<endl;
	PrintMatrix(M);
	InitMatrix(T);
	FastTransMatrix(M,T);

	cout<<endl<<"转置矩阵T为:";
	OutputMatrix(T);
	cout<<endl;

	cout<<"转置矩阵T阵列为:  "<<endl;
	PrintMatrix(T);

	return 0;
}
  • 运行结果
    在这里插入图片描述

  • 数据结构矩阵转置

to be continued
how
2019/11/19

  • 0
    点赞
  • 0
    评论
  • 8
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页

打赏作者

qq_45297146

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值