一.实验目的1、掌握稀疏矩阵的三元组表示方法,了解它的其他表示方法;2、掌握稀疏矩阵的基本算法。
二、实验内容1、编写函数,创建用三元组表示的稀疏矩阵;2、编写函数,求指定位置的稀疏矩阵元素值;3、编写函数,修改指定位置的稀疏矩阵元素值;4、编写函数,求稀疏矩阵的转置矩阵(用两种算法)。
#include <stdio.h> #define MAX 10 /*非0元素最大为10个*/ typedef struct { int row; /*非0元素的行、列下标*/ int col; int e; /*非0元素值*/ }Triple; typedef struct /*稀疏矩阵存储结构*/ { Triple data[MAX+1]; /*三元组数组存储非0元*/ int m,n,len; /*矩阵的行列数目以及非0元个数*/ }TSMatrix; void CreatTSMatrix(TSMatrix *M); /*创建稀疏矩阵M*/ void PrintTSMatrix(TSMatrix M); /*输出稀疏矩阵M*/ int GetValueTSMatrix(int row1,int col1,TSMatrix M); /*取稀疏矩阵M中的值*/ int ChangValueTSMatrix(int row1,int col1,int value,TSMatrix *M); /*修改稀疏矩阵M元素的值*/ int TransposeTSMatrix(TSMatrix A,TSMatrix *B); /*将稀疏矩阵的三元组A进行转置操作,转置结果保存到三元组B中,即得到稀疏矩阵A的转置距阵。*/ int FastTransposeTSMatrix(TSMatrix A,TSMatrix *B); /* 对稀疏距阵A进行快速转置操作结果存储在B中*/ void CreatTSMatrix(TSMatrix *M) /*创建稀疏矩阵M*/ { int i; int a[8]={1,1,3,3,4,5,6,6}; /*储存非0元素行坐标*/ int b[8]={2,3,1,6,3,2,1,4}; /*储存非0元素列坐标*/ int c[8]={12,9,-3,14,24,18,15,-7}; /*储存非0元素的值*/ M->n=6; M->m=7; M->len=8; for(i=0;i<M->len;i++) { M->data[i+1].row=a[i]; M->data[i+1].col=b[i]; M->data[i+1].e=c[i]; } } void PrintTSMatrix(TSMatrix M) /*输出稀疏矩阵M*/ { int i; for(i=1;i<=M.len;i++) { printf("%3d",M.data[i].row); /*输出非0元素行坐标*/ } printf("\n"); for(i=1;i<=M.len;i++) { printf("%3d",M.data[i].col); /*输出非0元素列坐标*/ } printf("\n"); for(i=1;i<=M.len;i++) { printf("%3d",M.data[i].e); /*输出非0元素的值*/ } printf("\n"); } int GetValueTSMatrix(int row1,int col1,TSMatrix M) /*取稀疏矩阵M中的值*/ { int i,k=-1; for(i=0;i<M.len;i++) /*判断行坐标为row1,列坐标为col1的元素是否非0*/ { if(row1==M.data[i+1].row&&col1==M.data[i+1].col) k=i+1; } if(k!=-1) /*非0*/ return (M.data[k].e); else /*0*/ return 0; } int ChangValueTSMatrix(int row1,int col1,int y,TSMatrix *M) /*修改稀疏矩阵M元素的值*/ { int i,j=-1; if(row1>M->m||col1>M->n) /*行或列大于M矩阵*/ return 0; else /*行或列不大于M矩阵*/ { for(i=0;i<M->len;i++) /*判断行坐标为row1,列坐标为col1的元素是否原来非0*/ { if(row1==M->data[i+1].row&&col1==M->data[i+1].col) j=i+1; } if(j!=-1) M->data[j].e=y; else { M->len++; M->data[M->len].row=row1; M->data[M->len].col=col1; M->data[M->len].e=y; } return 1; } } int TransposeTSMatrix(TSMatrix A,TSMatrix *B) /*将稀疏距阵的三元组A进行转置操作,转置结果保存到三元组B中,即得到稀疏距阵A的转置距阵。*/ { int p,q,r; B->m=A.n; B->n=A.m; B->len=A.len; if(A.len==0) /*如果非0元素个数为0*/ return 0; else /*如果非0元素个数不为0*/ { { r=1; /*结果三元组T的工作存储下标*/ for(q=1;q<=A.n;q++) /*第q列等列标的元素作为结果距阵的第row行的元素*/ for(p=1;p<=A.len;p++) /*依次在A中寻找等列的元素*/ if(A.data[p].col==q) /*找到目标元素进行转置运算*/ { B->data[r].row=A.data[p].col; B->data[r].col=A.data[p].row; B->data[r].e=A.data[p].e; r++; } } } return 1; } int FastTransposeTSMatrix(TSMatrix A,TSMatrix *B) /* 对稀疏距阵A进行快速转置操作结果存储在B中*/ { /*num[i]:表示稀疏距阵中第i列非0元素的个数,cpot[i]:表示M中第i列在结果三元组T中第一个元素的位置*/ int i,k,p,q,t,col; int num[MAX]; int cpot[MAX]; B->m=A.n; B->n=A.m; B->len=A.len; if(A.len==0) /*如果非0元素个数为0*/ return 0; else { for(col=1;col<=A.n;col++) /*num数组初始化*/ num[col]=0; for(i=1;i<=A.len;i++) /*统计每列非0元的个数*/ num[A.data[i].col]++; cpot[1]=1; for(t=1;t<=A.n;t++) /*计算每列开头元素在T中位置*/ cpot[t]=cpot[t-1]+num[t-1]; for(p=1;p<=A.len;p++) /*依次对每一个三元组M中进行转置*/ { k=A.data[p].col; q=cpot[k]; B->data[q].row=A.data[p].col; B->data[q].col=A.data[p].row; B->data[q].e=A.data[p].e; cpot[k]++; /*k列的起始位置加1*/ } return 1; } } void main() { TSMatrix M,N; int row1,col1,x,y; CreatTSMatrix(&M); PrintTSMatrix(M); printf("\nInput row1 and col1 "); scanf("%d%d",&row1,&col1); x=GetValueTSMatrix(row1,col1,M); printf("%d\n",x); printf("\nInput row1 and col1 and value "); scanf("%d%d%d",&row1,&col1,&y); ChangValueTSMatrix(row1,col1,y,&M); PrintTSMatrix(M); printf("\n"); TransposeTSMatrix(M,&N); PrintTSMatrix(N); printf("\n"); FastTransposeTSMatrix(N,&M); PrintTSMatrix(M); getch(); }
Powered by: 博客园 Copyright © 2024 little健健 Powered by .NET 9.0 on Kubernetes