Q.chead[i]=NULL; for(i=0;i!=Q.mu;i++) for(j=0;j!=Q.nu;j++) {
p0=M.rhead[i]; q0=N.chead[j]; e=0;
while(p0&&q0) {
if(q0->i
q0=q0->down;//列后移 else if(q0->i>p0->j)
p0=p0->right;//行后移 else {
e=e+p0->e*q0->e;//乘积累加 q0=q0->down;
p0=p0->right;//行列后移 } }
if(e)//e不为零则插入Q {
Q.tu++;
q=(OLink)malloc(sizeof(OLNode)); if(!q)
exit(OVERFLOW); q->i=i; q->j=j; q->e=e;
q->right=NULL; q->down=NULL; if(!Q.rhead[i]) Q.rhead[i]=q1=q; else
q1=q1->right=q; if(!Q.chead[j]) Q.chead[j]=q; else {
q2=Q.chead[j]; while(q2->down) q2=q2->down; q2->down=q; }
} }
return OK; } }
四、上机调试过程
1.调试过程中遇到的主要问题是如何解决的:
由于代码是仿照网上代码参照而写出来的,网上代码是c++编写的,所以部分代码需要改写成C语言,由于C++我们没学过,所以还要通过查询书籍和网络了解C++语言如何改写成C语言,1、cout endl;语句等价于printf 例:cout<<\你输入的是\等价于printf(\你输入的是\、cin;语句等价于scanf 例:cin>>Select;等价于scanf(\其中Select是int型 3、c语言中变量的定义必须在函数的首部:
像这种的要把int j;提出来
2.对设计和编码的回顾讨论和分析:
在设计方面,主要就是算法思想的设计,以及具体函数的设计运行。在这方面,主
要的算法设计思想倒不是特别的难想,主要是具体函数例如加法的函数的具体设计比较繁琐,耗费了较多时间。而在编码方面,由于c语言的学习还是在大一下学期,所以对于相关知识已经有所遗忘,所以在编码的过程遇到了不少问题需要查阅书籍,尤其涉及到具体代码的编写,更是花费了不少时间来修正调试。
五、测试结果及其分析
1、改进设想:
对于运算的界面可以更加精美有条理性一些;除此以外,可以给运算设计一个选择界
面,用户可以选择进行计算和退出;
由于部分代码是参考网上案列c++编码的,我想把它改成C语言代码,丹改过来后,他总是报错,调试也找不来原因,null指没有声明,但在头文件stdio.h中已有null值得申明,最后自定义个null值得声明,还是不行,所以导致我的部分代码有些不理解,这好似一部分遗憾,希望通过以后的学习和学习中明白这些原因。 2、经验和体会:
十字链表作为存储结构表示随机稀疏矩阵,进行两矩阵的相加运算,所以首先要定义一个十字链表作为存储结构。仅有此还是不够的,还需要定义指针来指向链表中的元素。在开始的时候,老是得不到想象中的结果,通过几次的检查才发现问题出在对矩阵中的元素指向没有弄清楚,所以即使是相位置上的元素也没有处理好它们的相加问题。这个实验从最初的设计到完成,出现了很多错误,通过最终的修正发现,其实犯的都是小错误,都是些指针的问题。因为指针是我比较薄弱的环节。我发现了这些问题,所以我就要进行弥补、查缺补漏。
通过这次课程设计,敦促我将过去学习过的知识进行了温习,知识只有多巩固,才能真正的理解与领悟。
六、用户使用说明
按提示进行相关操作。
1、先运行出来:出现主界面
2、先选择你将要运算的功能,列如1、相加,然后输入你第一个稀疏矩阵的行、列、非
零元的个数,接着输入非零元素的行、列和值;
输入第二个稀疏矩阵的行、列、非零元的个数,接着输入非零元素的行、列和值; 3、输入完成后,点击回车,它会显示出你所输入的第一个稀疏矩阵、第二个稀疏矩阵,
以及它们相加后得到的稀疏矩阵。
一、 源程序
#include
#define OVERFLOW -2 typedef int ElemType;
struct OLNode {
int i,j; //非零元所在行、列 ElemType e;//非零元值
OLNode *right,*down; };
typedef OLNode *OLink; struct CrossList {
OLink *rhead,*chead;//行、列表头的头节点 int mu,nu,tu;//矩阵的行、列和非零元个数 };
int Create(CrossList &M) {
int i,j,k,m,n,t; ElemType e; OLNode *p,*q;
printf(\请输入稀疏距阵的行数 列数 非零元的个数:\ scanf(\ M.mu=m; M.nu=n; M.tu=t;
M.rhead=(OLink*)malloc((m+1)*sizeof(OLink)); if(!M.rhead)
exit(OVERFLOW);
M.chead=(OLink*)malloc((n+1)*sizeof(OLink)); if(!M.chead)
exit(OVERFLOW);
for(k=0;k!=m;k++)//初始化行头指针 M.rhead[k]=NULL;
for(k=0;k!=n;k++)//初始化列头指针 M.chead[k]=NULL;
printf(\请按任意次序输入%d个非零元的行 列 元素值:\\n\ for(k=0;k scanf(\ if(i>m||j>n) { printf(\你输入的元素不在矩阵中 请检查重输:\\n\ exit(OVERFLOW); } else { p=(OLNode*)malloc(sizeof(OLNode)); if(!p) exit(OVERFLOW); p->i=i; p->j=j; p->e=e; if(M.rhead[i]==NULL||M.rhead[i]->j>j)//p插入该行第一节点处 { p->right=M.rhead[i]; M.rhead[i]=p; } else//寻找行表插入位置 { for(q=M.rhead[i];q->right&&q->right->j if(M.chead[j]==NULL||M.chead[j]->i>i)//p插入该列第一节点处 { p->down=M.chead[j]; M.chead[j]=p; } else//寻找列表插入位置 { for(q=M.chead[j];q->down&&q->down->idown); p->down=q->down;//完成列插入 q->down=p; } } } return OK; } int Print(CrossList M) { int i,j,k; OLink p; int array[100][100]; for(i=0;i!=M.mu;i++) { for(j=0;j!=M.nu;j++) { array[i][j]=0;//初始化数组所需部分 } }