图2输入第二个矩阵B 两个矩阵的和
图3矩阵A的转置矩阵D
9.心得体会
通过一周的课程设计使我对数据结构有了更深的理解,对以前学习中不明白的,不理解的都有了进一步的理解。在实际操作中遇到了很多困难,但通过找资料,请教同学和老师,使我的动手能力和沟通能力都有了提高。在整个课程设计中总是在编写程序中发生错误,有时会很没耐性,但都被我一一克服了,编程一定要有耐心,同时还有认真仔细,尽量保证不出现错误。编程要有条理,不仅使自己要看懂 ,别人也能看懂,这样有利于程序的改正。
在做完这个课程设计时,心里有种说不出来的高兴,自己动手完成的设计有一种成就感,增强了自己的自信心,我相信在今后的学习中,我会保持这种良好的心情投入到各科的学习中,使我的成绩不断提高。
10.参考文献
[1] 严蔚敏 吴伟名 编著,《数据结构》[M]., 清华大学出版社, 2001年1月20-25 [2] 张颖江 胡燕 主编,《C语言程序设计》[M]., 科学出版社 ,1998年7月46-80 [3] 殷人昆, 《数据结构》[M].,清华大学出版社, 2001年3月 120-169 [4] 徐孝凯 ,《数据结构实用教程》[M].,清华大学出版社,1999年12月 47-80 [5] Adam Drozdek(美),《数据结构与算法》[M]., 机械工业出版社 ,2003年7月 69-89
11.附录源程序清单
#include
#define MAXSIZE 100 /* 非零元个数的最大值 */ typedef struct triple {
int i,j; /* 行下标,列下标 */ int e; /* 非零元素值 */ }triple;
typedef struct tsmatrix
{
triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用 */ int mu,nu,tu; /* 矩阵的行数、列数和非零元个数 */ /* 各列第一个非零元的位置表rpos[0]未用 */ }rlsmatrix;
createsmatrix(rlsmatrix *M) { /* 创建稀疏矩阵M */
int e,i,m,n;
M->data[0].i=0; /* 为以下比较顺序做准备 */
printf(\请输入矩阵的行数,列数,和非零元素的个数:\ scanf(\
for(i=1;i<=M->tu;i++) {
printf(\请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:\ scanf(\
if(m<1||m>M->mu||n<1||n>M->nu) /*行或列超出范围 */ {printf(\行或列超出范围\
if(m
void transposesmatrix(rlsmatrix M,rlsmatrix *T)
{ /* cpos存放每列的第一个非零元素的地址,temp中间变量 */ int i,m,*cpos,*temp,k=0; T->mu=M.nu; T->nu=M.mu; T->tu=M.tu;
cpos=(int *)malloc(M.mu*sizeof(int)); if(cpos==NULL)exit();
temp=(int *)malloc(M.mu*sizeof(int)); if(temp==NULL)exit();
/* 对cpos对初始化,初值为0 */ *(cpos+1)=0;
for(i=1;i<=M.nu;i++) {
for(m=1;m<=M.tu;m++) {
if(M.data[m].j==i) k++; } temp[i]=k;
if(i==1&&k!=0)
*(cpos+i)=1;/* 为cpos赋值 */ if(i>1)
*(cpos+i)=*(temp+i-1)+1;
}
free(temp);
for(i=1;i<=M.tu;i++)/* 进行转置 */ {T->data[*(cpos+M.data[i].j)].i=M.data[i].j; T->data[*(cpos+M.data[i].j)].j=M.data[i].i; T->data[*(cpos+M.data[i].j)].e=M.data[i].e; (*(cpos+M.data[i].j))++;}
free(cpos); }
HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) {//矩阵求和函数
if((*M).mu!=(*N).mu||(*M).nu!=(*N).nu) {printf(\不满足矩阵相加的条件!\ 元
p=&(*M).data[1];
q=&(*N).data[1];
while(p<(*M).data+(*M).tu+1&&q<(*N).data+(*N).tu+1)
if((*p).i<=(*q).i) if((*p).i<(*q).i){
(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; }
int k=1;
Triple *p,*q;
//设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相加后的新矩阵非零
else if((*p).j<=(*q).j) if((*p).j<(*q).j){
(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; } {
(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e+(*q).e; k++;p++;q++; }
else
else { (*Q).data[k].i=(*q).i;
(*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; }
else
{
(*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; }
if(p<=(*M).data+(*M).tu)
while(p<=(*M).data+(*M).tu){
(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; }
if(q<=(*N).data+(*N).tu)
while(q<=(*N).data+(*N).tu){
(*Q).mu=(*M).mu;(*Q).nu=(*M).nu;(*Q).tu=k-1;
//计算各行第一个非零元素在存储数组中的位置 //若该行无非零元,则rpos[]值为零
(*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; }
for(k=1;k<=(*Q).tu;k++) ++num[(*Q).data[k].i];
for(row=2;row<=(*Q).mu;row++)
cpot[row]=cpot[row-1]+num[row-1];
int num[(*Q).mu+1],row,cpot[(*Q).mu+1]; cpot[1]=1;
for(k=1;k<=(*Q).mu;k++) num[k]=0;
for(row=1;row<=(*Q).mu;row++){ }
if(cpot[row]<=(*Q).tu)
if((*Q).data[cpot[row]].i==row){
(*Q).rpos[row]=cpot[row]; }
else (*Q).rpos[row]=0; else
(*Q).rpos[row]=0;
}
ChaRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) {//矩阵求差函数
if((*M).mu!=(*N).mu||(*M).nu!=(*N).nu) {printf(\不满足矩阵相减的条件!\ }
multsmatrix(rlsmatrix M,rlsmatrix N,rlsmatrix *T) {
int i,j,Qn=0; int *Qe;
if(M.nu!=N.mu)
{printf(\两矩阵无法相乘\
T->mu=M.mu; T->nu=N.nu;
Qe=(int *)malloc(M.mu*N.nu*sizeof(int)); /* Qe为矩阵Q的临时数组*/ int i;
for(i=1;i<=(*N).nu;i++)
(*N).data[i].e*=-1;
HeRLSMatrix(&(*M),&(*N),&(*Q));