数据结构(严蔚敏版)配套实验报告册--稀疏矩阵的基本操作
copy之前请先点赞!! 码字不易!!
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define FALSE 0
#define ERROR 0
typedef int ElemType;
typedef int Status;
#define MAXSIZE 100
typedef struct
{
int i, j;
ElemType e;
} Triple;
typedef struct
{
Triple data[MAXSIZE + 1];
int mu, nu, tu;
} TSMatrix;
Status CreatMatrix(TSMatrix &M)
{
int k,e,m, n;
printf("********欢迎进入转置系统********\n");
printf("输入稀疏矩阵的行数、列数和非零元素个数:\n");
scanf("%d%d%d", &M.mu, &M.nu, &M.tu);
if (M.tu > MAXSIZE || M.mu * M.nu > MAXSIZE || M.mu * M.nu <= 0||M.tu<0)
return ERROR;
printf("按行序输入%d个非零元素的三元组:\n", M.tu);
for (k = 1; k <= M.tu; k++)
{
printf("输入第%d个非零元素的行号、列号和值:", k);
scanf("%d%d%d", &m, &n, &e);
M.data[k].i = m;
M.data[k].j = n;
M.data[k].e = e;
}
return OK;
}
Status PrintMatrix(TSMatrix M)
{
int i, j;
int k = 1;
for (i = 1; i <= M.mu; i++)
{
printf("\n");
for (j = 1; j <= M.nu; j++)
{
if (i == M.data[k].i && j == M.data[k].j)
{
printf("%2d", M.data[k].e);
k++;
}
else
printf("%2d", 0);
}
}
return OK;
}
Status OutputMatrix(TSMatrix M)
{
int k, e;
printf("%d行 %d列 %d个非零元\n", M.mu, M.nu, M.tu);
printf("各非零元分别为:\n");
for (k = 1; k <= M.tu; k++)
printf("%d%2d%2d\n", M.data[k].i, M.data[k].j, M.data[k].e);
return OK;
}
Status FastTtanMatrix(TSMatrix M, TSMatrix &T)
{ //采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
T.mu = M.nu;
T.nu = M.mu;
T.tu = M.tu;
int col;
int p, q;
int num[100];
int cpot[100];
if (T.tu)
{
for ( col = 1; col <= M.nu; ++col)
num[col] = 0;
for (int t = 1; t <= M.tu; ++t)
++num[M.data[t].j];
cpot[1] = 1;
for (int col = 2; col <= M.tu; ++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;
}
int main()
{
TSMatrix M;
TSMatrix T;
CreatMatrix(M);
printf("原始矩阵M为:");
OutputMatrix(M);
printf("原始矩阵M阵列为:");
PrintMatrix(M);
FastTtanMatrix(M, T);
printf("\n转置矩阵T为:");
OutputMatrix(T);
printf("转置矩阵T阵列为:\n");
PrintMatrix(T);
return 0;
}