实现稀疏矩阵的输入、输出、添加元素、删除元素、转置操作。
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define true 0
#define false 1
typedef struct
{
int i, j;//记录矩阵行和列的数值
int e;//记录非零元素的值
}Triple;
typedef struct
{
Triple data[MAXSIZE + 1];
int mu, nu, tu;//记录矩阵行数、列数、非零元素个数
}TSMatrix;
int get(TSMatrix &T);//输入
int show(TSMatrix &T);//输出
int init(TSMatrix &T);//插入
int del(TSMatrix &T);//删除
int transport(TSMatrix &L, TSMatrix &T);//转置
int main()//主函数
{
int x=-1 ;
TSMatrix t;
while(x!=0)
{
printf("请输入要执行的操作:\n1.建立矩阵\n2.矩阵的插入\n3.矩阵的删除\n4.矩阵的转置\n0.退出\n");
scanf("%d", &x);
switch (x)
{
case 1:
if(get(t)==0)
show(t);
break;
case 2:
printf("矩阵的插入\n");
init(t);
printf("插入此元素后\n");
show(t);
break;
case 3:
printf("矩阵的删除\n");
if(del(t)==0)
{
printf("删除后\n");
show(t);
}
else
{
printf("该数据已为0\n");
}
break;
case 4:
printf("矩阵的转置\n");
TSMatrix l;
transport(t, l);
printf("转置后\n");
show(l);
break;
}
}
system("pause");
return 0;
}
int get(TSMatrix &T)//建立矩阵
{
int i,m,n,e;
printf("请输入矩阵的行数、列数和非零元个数\n" );
scanf("%d", &T.mu);
scanf("%d", &T.nu);
scanf("%d", &T.tu);
if (T.tu > MAXSIZE||T.tu>(T.mu*T.nu))
{
printf("非零元素太多,请重新输入\n"); return false;
}
T.data[0].i = 0;
for (i = 1; i <= T.tu; i++)
{
printf("请输入第 %d 个非零元的行数、列数以及非零元的值\n" ,i);
scanf("%d", &m);
scanf("%d", &n);
scanf("%d", &e);
if (m<1 || m>T.mu || n<1 || n>T.nu)
{
printf("行或列超出范围,请重新输入\n"); return false;
}
if (m < T.data[i - 1].i || m == T.data[i - 1].i&&n <= T.data[i - 1].j)
{
printf("行或列的顺序有错,请重新输入\n"); return false;
}
T.data[i].i = m;
T.data[i].j = n;
T.data[i].e = e;
}
return true;
}
int show(TSMatrix &T)//输出矩阵
{
int i, j, k, p;
for (i = 1; i <= T.mu; i++)
{
for (j = 1; j <= T.nu; j++)
{
p = 0;
for (k = 1; k <= T.tu; k++)
if (T.data[k].i == i&&T.data[k].j == j)
{ printf("%d",T.data[k].e ); p = 1; }
if (p == 0)printf("0");
}
printf("\n");
}
return 0;
}
int init(TSMatrix &T)//插入元素
{
int m, n, k, r = 1;
printf("请输入要插入的行数、列数和非零元的值\n" );
scanf("%d",&m);
scanf("%d",&n);
scanf("%d", &k);
if (T.tu == 0)
{
T.tu = T.tu + 1;
T.data[T.tu].i = m;
T.data[T.tu].j = n;
T.data[T.tu].e = k;
}
for (r = 1; r <= T.tu; r++)
if (T.data[r].i == m&&T.data[r].j == n)
{
printf("此位置已有数据,请存储在其他位置\n");
return false;
break;
}
T.tu = T.tu + 1;
T.data[T.tu].i = m;
T.data[T.tu].j = n;
T.data[T.tu].e = k;
return true;
}
int del(TSMatrix &T)//删除元素
{
int m, n, r;
printf("请输入要删除的行数、列数\n" );
scanf( "%d", &m);
scanf("%d", &n);
for (r = 1; r <= T.tu; r++)
if (T.data[r].i == m&&T.data[r].j == n)
{
T.data[r].e = 0;
return true;
break;
}
return false;
}
int transport(TSMatrix & L, TSMatrix &T)//转置矩阵
{
T.mu = L.nu; T.nu = L.mu; T.tu = L.tu;
if (T.tu)
{
int m, n, p = 1;
for (m = 1; m <= T.mu; m++)
for (n = 1; n <= T.tu; n++)
if (L.data[n].j == m)
{
T.data[p].i = L.data[n].j;
T.data[p].j = L.data[n].i;
T.data[p].e = L.data[n].e;
p++;
}
}
return 0;
}