稀疏矩阵 定义. 矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素的分布没有规律,通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,则称该矩阵为稀疏矩阵 (sparse matrix),该比值称为这个矩阵的稠密度;与之相区别的是,如果非零元素的分布存在规律(如上三角矩阵、下三角矩阵、对角矩阵),则称该矩阵为 特殊矩阵 。. 比较基本的定义是矩阵中的大多数元素为零,并且可以利用零元素节约大量存储、运算和程序运行时间。
本代本文利用定义三元组,以数组的方式存放稀疏矩阵。
代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SMAX 100 //三元组非零元素的最大个数
typedef struct SPNode { //定义三元组
int i; //三元组非零元素的行、列和值
int j;
int v;
}SPNode;
typedef struct sparmatrix { //定义稀疏矩阵
int rows;
int cols;
int terms; //稀疏矩阵行、列和非零元素的个数
SPNode data[SMAX]; //三元组表
}sparmatrix;
sparmatrix CreateSparmatrix(){ //创建稀疏距阵
sparmatrix A;
int n;
printf("输入稀疏矩阵的行数、列数和非零元素的个数");
scanf("%d %d %d",&A.rows,&A.cols,&A.terms);
for(n=0;n<A.terms;n++)
{printf("输入第%d个非零元素行数、列数和值:",n+1);
scanf("%d %d %d",&A.data[n].i,&A.data[n].j,&A.data[n].v);
}
return A;
}
sparmatrix Trans(sparmatrix A){ //将稀疏矩阵A转置
sparmatrix B;
int col,p;
B.cols=A.rows;
B.rows=A.cols;
B.terms=A.terms;
if(B.terms>0){
int k=0;
for(col=0;col<A.cols;col++){
for(p=0;p<A.terms;p++){
if(A.data[p].j==col+1){
B.data[k].i=A.data[p].j;
B.data[k].j=A.data[p].i;
B.data[k].v=A.data[p].v;
k++;
}
}
}
}
return B;
}
void ShowSparmatrix(sparmatrix A) { //显示稀疏矩阵
int n,m,k,l;
for(n=0;n<A.rows;n++){
for(m=0;m<A.cols;m++){
l=0;
for(k=0;k<A.terms;k++){
if(A.data[k].i==n+1&&A.data[k].j==m+1){
printf("%4d",A.data[k].v);
l=1;
}
}
if(l==0)
printf("%4d",0);
}
printf("\n");
}
}
void SearchSparmatrix(sparmatrix A,int s){ //查找稀疏矩阵中非零元素
int n,m,k,l,num;
for(k=0;k<A.terms;k++){
if(A.data[k].v==s){
printf("%4d %4d %4d",A.data[k].i,A.data[k].j,A.data[k].v);
continue;
}
}
}
void main(){ //稀疏矩阵的三元组存储
int ch=1,choice,s;
struct sparmatrix A,B;
A.terms=0;
B.terms=0;
while(ch){
printf("\n");
printf("\n\t\t稀疏矩阵的三元组存储\n");
printf("\n\t\t********************************");
printf("\n\t\t 1---------新建 ");
printf("\n\t\t 2---------转置 ");
printf("\n\t\t 3---------查找 ");
printf("\n\t\t 4---------显示 ");
printf("\n\t\t 0---------退出 ");
printf("\n\t\t********************************");
printf("\n\n\t\t 请输入选择(0-4):");
scanf("%d",&choice);
switch(choice){
case 1: A=CreateSparmatrix();
break;
case 2: if(A.terms==0)
printf("\n\t\t三元组为空! \n");
else {
B=Trans(A);
printf("\n\t\t转置后的稀疏矩阵:\n");
ShowSparmatrix(B);
}
break;
case 3:if (A.terms==0)
printf("\n\t\t三元组为空! \n");
else {
printf("\n\t\t输入要查找的非零元素: ");
scanf ("%d", &s) ;
SearchSparmatrix(A,s);
}
break;
case 4:ShowSparmatrix(A);
break;
case 0: ch=0;
break;
default:system("cls");
printf("\n\t\t输入有误!请重新输入!\n");
break;
}
if (choice==1||choice==2||choice==3||choice==4){
printf("\n\t\t");
system("pause");
system("cls");
}
else system("cls");
}
}