第五章 数组和广义表(3)三元组矩阵转换
2018-02-08 13:46
537 查看
#include<stdio.h>
#include<stdlib.h>
//宏定义
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 12
typedef int Status;
typedef int ElemType;
typedef struct{
int i,j; //该非零元的行下标和列下标
ElemType e; //元素值
}Triple;
typedef struct{
Triple data[MAXSIZE+1]; //非零元素三元组表,data[0]未用
int mu,nu,tu; //矩阵的行数、列数和非零个数
}TSMatrix;
//创建稀疏M
Status CreateSMatrix(TSMatrix *M){
int a,b,c;
int m=3,n=4,t;
M->mu=m; //稀疏矩阵的行列
M->nu=n;
printf("请输入稀疏矩阵的非零元素个数:\n");
scanf("%d",&t);
for(int i=1;i<=t;i++){
printf("请输入 第 %d 个元素的行、列和值:",i);
scanf("%d %d %d",&a, &b, &c);
M->data[i].i=a;
M->data[i].j=b;
M->data[i].e=c;
}
M->tu=t;
return OK;
}
//输出稀疏矩阵、行数列数
//输出,在屏幕上以行列的形式输出矩阵
Status PrintSMatrix(TSMatrix *M){
int i=0,j=0,k=1;
for(i=1;i<=M->mu;i++){
for(j=1;j<=M->nu;j++){
if(i==M->data[k].i && j==M->data[k].j){
printf("%d",M->data[k].e);
k++;
}
else{
printf("%d",0);
}
}
printf("\n");
}
return OK;
}
//采用三元组表存储表示,求稀疏矩阵M的转置矩阵T
Status TransposeSMatrix(TSMatrix *M,TSMatrix *T){
int col,p,q;
T->mu=M->nu; T->nu=M->mu; T->tu=M->tu;
if(T->tu){
q=1;
for(col=1;col<=M->nu;col++)
for(p=1;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 OK;
}
void main(){
TSMatrix M;
TSMatrix T;
//M= (TSMatrix *)malloc(sizeof(TSMatrix)); //创建一个稀疏矩阵a
CreateSMatrix(&M);
PrintSMatrix(&M);
TransposeSMatrix(&M,&T);
PrintSMatrix(&T);
}一般矩阵的转置算法为:
for(col=1;col<=nu;col++)
for(row=1;row<=mu;row++)
T[col][row]=M[row][col];
其时间复杂度为 O(mu*nu);
----------------------------------------------------------------------------------------------------------------
//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T(快速转置)
Status 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(M->tu*sizeof(int));
cpot=(int *)malloc(M->tu*sizeof(int));
for(col=1;col<=M->nu;col++)
num[col]=0;
//求M中每一列含有非零元素个数
for(t=1;t<=M->tu;t++)
++num[M->data[t].j];
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]++;
}
}
return OK;
}
#include<stdlib.h>
//宏定义
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 12
typedef int Status;
typedef int ElemType;
typedef struct{
int i,j; //该非零元的行下标和列下标
ElemType e; //元素值
}Triple;
typedef struct{
Triple data[MAXSIZE+1]; //非零元素三元组表,data[0]未用
int mu,nu,tu; //矩阵的行数、列数和非零个数
}TSMatrix;
//创建稀疏M
Status CreateSMatrix(TSMatrix *M){
int a,b,c;
int m=3,n=4,t;
M->mu=m; //稀疏矩阵的行列
M->nu=n;
printf("请输入稀疏矩阵的非零元素个数:\n");
scanf("%d",&t);
for(int i=1;i<=t;i++){
printf("请输入 第 %d 个元素的行、列和值:",i);
scanf("%d %d %d",&a, &b, &c);
M->data[i].i=a;
M->data[i].j=b;
M->data[i].e=c;
}
M->tu=t;
return OK;
}
//输出稀疏矩阵、行数列数
//输出,在屏幕上以行列的形式输出矩阵
Status PrintSMatrix(TSMatrix *M){
int i=0,j=0,k=1;
for(i=1;i<=M->mu;i++){
for(j=1;j<=M->nu;j++){
if(i==M->data[k].i && j==M->data[k].j){
printf("%d",M->data[k].e);
k++;
}
else{
printf("%d",0);
}
}
printf("\n");
}
return OK;
}
//采用三元组表存储表示,求稀疏矩阵M的转置矩阵T
Status TransposeSMatrix(TSMatrix *M,TSMatrix *T){
int col,p,q;
T->mu=M->nu; T->nu=M->mu; T->tu=M->tu;
if(T->tu){
q=1;
for(col=1;col<=M->nu;col++)
for(p=1;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 OK;
}
void main(){
TSMatrix M;
TSMatrix T;
//M= (TSMatrix *)malloc(sizeof(TSMatrix)); //创建一个稀疏矩阵a
CreateSMatrix(&M);
PrintSMatrix(&M);
TransposeSMatrix(&M,&T);
PrintSMatrix(&T);
}一般矩阵的转置算法为:
for(col=1;col<=nu;col++)
for(row=1;row<=mu;row++)
T[col][row]=M[row][col];
其时间复杂度为 O(mu*nu);
----------------------------------------------------------------------------------------------------------------
//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T(快速转置)
Status 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(M->tu*sizeof(int));
cpot=(int *)malloc(M->tu*sizeof(int));
for(col=1;col<=M->nu;col++)
num[col]=0;
//求M中每一列含有非零元素个数
for(t=1;t<=M->tu;t++)
++num[M->data[t].j];
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]++;
}
}
return OK;
}
相关文章推荐
- 第五章 数组和广义表(4)三元组矩阵转换(转)
- 5-2-三元组顺序表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版
- 第五章 数组和广义表(2)稀疏矩阵的存储
- 第九周 数据结构实践项目——数组和广义表【项目3.1-稀疏矩阵的三元组表示的实现及应用】
- 数据结构--数组和广义表--以三元组顺序表存储方式的矩阵的一般转置和快速转置
- 数组与广义表_稀疏矩阵的压缩存储_三元组做存储结构_矩阵转置
- 2015年大二上-数据结构-数组与广义表(3)-1.稀疏矩阵的三元组表示
- 数组与广义表_稀疏矩阵的压缩存储_三元组做存储结构_矩阵相乘
- 2015年大二上-数据结构-数组与广义表(3)-2.稀疏矩阵的三元组表示
- [数据结构]第五章-数组和广义表(读书笔记2)
- BUAA 2014级数据结构第五次上机 二叉树之数组转换广义表
- 堆栈队列和数组-三元组稀疏矩阵
- python 列表,数组,矩阵两两转换tolist()
- 数据结构 第五章 数组和广义表
- 【数组与广义表项目3-2-稀疏矩阵的三元组的加法】
- 数据结构编程笔记十三:第五章 数组和广义表 稀疏矩阵的压缩存储实现
- Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换
- c语言版数据结构(奇迹冬瓜)-数组和广义表(十字链表存贮稀疏矩阵的行列值)
- [数据结构]第五章-数组和广义表(读书笔记3)
- python numpy矩阵和数组的转换