采用三元组法存储稀疏矩阵
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR -1
#define MAX_SIZE 12500
typedef int ElemType;//储存数据的类型 可更改
typedef int Status;
三元组结构体
typedef struct
{
int row, col;//row,col 为行列下标
ElemType e;
}Triple;
稀疏矩阵的结构体
typedef struct
{
Triple data[MAX_SIZE + 1];
int rn;//矩阵的行数
int cn;//列数
int tn;//非0元素的个数
}TSMatrix;
创建一个稀疏矩阵
int CreateSMatrix(TSMatrix *M)
{
int len = 0;
int pos = 1;
char c = 'y';
printf("请输入稀疏矩阵的行数:");
scanf("%d", &M->rn);
printf("请输入稀疏矩阵的列数:");
scanf("%d", &M->cn);
M->tn = 0;
while(1)
{
if(c == 'y' || c == 'Y')
{
printf("请输入行下标:");
scanf("%d", &M->data[pos].row);
if(M->data[pos].row > M->rn + 1)
{
printf("error!\n");
printf("是否插入元素(Y/N):");
getchar();
scanf("%c", &c);
continue;
}
printf("请输入列下标:");
scanf("%d", &M->data[pos].col);
if(M->data[pos].col > M->cn + 1)
{
printf("error!\n");
printf("是否插入元素(Y/N):");
getchar();
scanf("%c", &c);
continue;
}
printf("请输入值:");
scanf("%d", &M->data[pos].e);
len++;
printf("-------------\n");
printf("position:%d\n", pos);
pos++;
M->tn++;
printf("length:%d\n", len);
printf("M.tu:%d\n", M->tn);
printf("-------------\n");
}
else if(c == 'n' || c == 'N')
{
break;
}
else
{
printf("error.\n");
}
printf("是否插入元素(Y/N):");
getchar();
scanf("%c", &c);
}
return OK;
}
输出稀疏矩阵
void OutPutSMatrix(TSMatrix M)
{
int i;
printf("row col value\n");
for(i = 1; i < M.tn + 1; i++)
{
printf("%2d", M.data[i].row);
printf("%7d", M.data[i].col);
printf("%7d", M.data[i].e);
printf("\n");
}
}
稀疏矩阵的转置矩阵
M是原矩阵
M1是转置后的矩阵
num[col]:统计矩阵第col列中非0元素的个数
cpot[col]:指示矩阵第col列第一个非0元素在b.data中的恰当位置
Status TransposeMatrix(TSMatrix *M, TSMatrix *M1)
{
int cpot[M->cn];
int num[M->rn];
int p;
int q;
int i;
int col;
M1->rn = M->cn;
M1->cn = M->rn;
M1->tn = M->tn;
if(M->tn == 0)
{
printf("The Matrix A = 0\n");
}
else
{
//向量num[col]初始化为0
for(col=1; col <= M->cn + 1; col++)
{
num[col]=0;
}
//求原矩阵中每一列非0元素个数
for(i = 1; i < M->tn + 1; i++)
{
num[M->data[i].col] += 1;
}
//求第col列中第一个非0元在b.data中的序号
col = 1;
while(col <= M->cn + 1)
{
if(col == 1)
{
cpot[col] = 1;
}
else if(col >= 2 && col < M->cn + 1)
{
cpot[col] = cpot[col - 1] + num[col - 1];
}
col++;
}
}
for(p = 1; p < M->tn + 1; p++)
{
q = cpot[M->data[p].col];
M1->data[q].row = M->data[p].col;
M1->data[q].col = M->data[p].row;
M1->data[q].e = M->data[p].e;
cpot[M->data[p].col] += 1;
}
return OK;
}
int main()
{
TSMatrix M;
TSMatrix M1;
CreateSMatrix(&M);
printf("----------\n");
OutPutSMatrix(M);
TransposeMatrix(&M, &M1);
printf("----转置后----\n");
OutPutSMatrix(M1);
return 0;
}
运行结果:
例: