稀疏矩阵以及转置

稀疏矩阵 定义. 矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素的分布没有规律,通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于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");
			}
		  }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值