码迷,mamicode.com
首页 > 其他好文 > 详细

_DataStructure_C_Impl:稀疏矩阵三元组

时间:2015-08-08 06:45:52      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:数据结构

#include<stdlib.h>
#include<stdio.h>

#define MaxSize 200
typedef int DataType;
typedef struct{			//三元组类型定义
	int i,j;
	DataType e;
}Triple;
typedef struct{				//矩阵类型定义
	Triple data[MaxSize];
	int rpos[MaxSize];		//用于存储三元组中的每一行的第一非零元素的位置
	int m,n,len;		//矩阵的行数,列数和非零元素的个数
}TriSeqMatrix;
//创建稀疏矩阵。要求按照行优先顺序输入非零元素值
int CreateMatrix(TriSeqMatrix *M){
	int i,m,n;
	DataType e;
	int flag;
	printf("请输入稀疏矩阵的行数、列数和非零元素数:");
	scanf("%d,%d,%d",&M->m,&M->n,&M->len);
	if(M->len>MaxSize)
		return 0;
	for(i=0;i<M->len;i++){
		do{
			printf("请以行序顺序输入第%d个非零元素所在的行(0~%d),列(0~%d)元素值:",i,M->m-1,M->n-1);
			scanf("%d,%d,%d",&m,&n,&e);
			flag=0;							/*初始化标志位*/
			if(m<0||m>M->m||n<0||n>M->n)	/*如果行号或列号不正确,标志位为1*/
				flag=1;
			if(i>0&&m<M->data[i-1].i||m==M->data[i-1].i&&n<=M->data[i-1].j) /*如果输入的顺序不正确,标志位为1*/
				flag=1;
		}while(flag);
		M->data[i].i=m;
		M->data[i].j=n;
		M->data[i].e=e;
	}
	return 1;
}
//稀疏矩阵的输出
void PrintMatrix(TriSeqMatrix M){
	int i;
	printf("稀疏矩阵是%d行×%d列,共%d个非零元素。\n",M.m,M.n,M.len);
	printf("行    列    元素值\n");
	for(i=0;i<M.len;i++)
		printf("%2d%6d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);
}
//稀疏矩阵相乘
void MultMatrix(TriSeqMatrix A,TriSeqMatrix B,TriSeqMatrix *C){
	int i,k,t,p,q,arow,brow,ccol;
	int temp[MaxSize];	//累加器
	int num[MaxSize];
	if(A.n!=B.m)		//如果矩阵A的列与B的行不相等,则返回
		return;
	C->m=A.m;		//初始化C的行数、列数和非零元素的个数
	C->n=B.n;
	C->len=0;
	if(A.len*B.len==0)		//只要有一个矩阵的长度为0,则返回
		return;
	/*---------------求矩阵B中每一行第一个非零元素的位置------------*/
	for(i=0;i<B.m;i++)		//初始化num
		num[i]=0;
	for(k=0;k<B.len;k++){		//num存放矩阵B中每一行非零元素的个数
		i=B.data[k].i;
		num[i]++;
	}
	B.rpos[0]=0;//0,0
	for(i=1;i<B.m;i++)		//rpos存放矩阵B中每一行第一个非零元素的位置,是在B.data中的位置
		B.rpos[i]=B.rpos[i-1]+num[i-1];
	/*---------------求矩阵A中每一行第一个非零元素的位置--------------*/
	for(i=0;i<A.m;i++)			/*初始化num*/
		num[i]=0;  
	for(k=0;k<A.len;k++)
	{
		i=A.data[k].i;
		num[i]++;
	}
	A.rpos[0]=0;     
	for(i=1;i<A.m;i++)			/*rpos存放矩阵A中每一行第一个非零元素的位置*/
		A.rpos[i]=A.rpos[i-1]+num[i-1];
	/*----------------计算两个矩阵的乘积---------------------------------*/
	for(arow=0;arow<A.m;arow++){		//依次扫描矩阵A的每一行
		for(i=0;i<B.n;i++)		//初始化累加器temp
			temp[i]=0;
		C->rpos[arow]=C->len;
		//对每个非0元处理
		if(arow<A.m-1)
			t=A.rpos[arow+1];
		else
			t=A.len;
		for(p=A.rpos[arow];p<t;p++){
			brow=A.data[p].j;		/*取出A中元素的列号*/
			if(brow<B.m-1)
				t=B.rpos[brow+1];
			else
				t=B.len;
			for(q=B.rpos[brow];q<t;q++)	/*依次取出B中的第brow行,与A中的元素相乘*/
			{
				ccol=B.data[q].j;		
				temp[ccol]+=A.data[p].e*B.data[q].e;/*把乘积存入temp中*/
			}
		}
		for(ccol=0;ccol<C->n;ccol++)  /*将temp中元素依次赋值给C*/
			if(temp[ccol])
			{
				if(++C->len>MaxSize) 
					return;
				C->data[C->len-1].i=arow;
				C->data[C->len-1].j=ccol;
				C->data[C->len-1].e=temp[ccol];
			}
	}
}
void main(){
	//0,0不能为0
	TriSeqMatrix M,N,Q;
	CreateMatrix(&M);
	PrintMatrix(M);
	CreateMatrix(&N);
	PrintMatrix(N);
	printf("矩阵M和N的乘积为:\n");
	MultMatrix(M,N,&Q);
	PrintMatrix(Q);
	system("pause");
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

_DataStructure_C_Impl:稀疏矩阵三元组

标签:数据结构

原文地址:http://blog.csdn.net/williamfan21c/article/details/47349931

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!