数据结构+课程设计+稀疏矩阵的操作(3)

2018-12-19 21:42

图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(mdata[i-1].i||m==M->data[i-1].i&&n<=M->data[i-1].j) /*行或列的顺序有错*/ {printf(\行或列的顺序有错\ M->data[i].i=m; M->data[i].j=n; M->data[i].e=e; } }

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));


数据结构+课程设计+稀疏矩阵的操作(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:电大《公共政策概论》(新版)形成性考核册参考答案4(新)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: