2022年采用十字链表表示稀疏矩阵,并实现矩阵的加法运算 .pdf
课程设计所抽题目:采用十字链表表示稀疏矩阵, 并实现矩阵的加法运算。要求:要检查有关运算的条件,并对错误的条件产生报警。问题分析和建立模型:本题目主要是运用所学知识,用十字链表的方法去表示稀疏矩阵,并使之可以在两矩阵间进行相加。而后,若有错误,则对错误进行警报。框架搭建:1选择 File|New 菜单项,弹出New 对话框,选择Files 标签,选中C+ Source File项,在 File 编辑器中输入项目名称 “十字链表表示稀疏矩阵实现加法”,在 Location 编辑框中输入项目所在目录, 按下 OK按钮即可。2在操作界面中输入,程序代码。(1)结构体和共用体的定义#include #include #define smax 45 typedef int datatype; typedef struct lnode (2)建立稀疏矩阵的函数,返回十字链表头指针int i,j; struct lnode *cptr,*rptr; union 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - struct lnode *next; datatype v; uval; link; int flag=0; 建立十字链表头结点head=(link *)malloc(sizeof(link); 建立头结点循环链表for(i=1;ii=0;p-j=0; p-rptr=p;p-cptr=p; cpi=p; cpi-1-uval.next=p; cps-uval.next=head; for(k=1;ki=i;p-j=j;p-uval.v=v; q=cpi; while(q-rptr!=cpi)&(q-rptr-jrptr; p-rptr=q-rptr; q-rptr=p; q=cpj; while(q-cptr!=cpj)&(q-cptr-icptr; p-cptr=q-cptr; q-cptr=p; return head; (4)输出十字链表的函数link *p,*q; p=(link *)malloc(sizeof(link); p-i=i;p-j=j;p-uval.v=v; q=cpi; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - while(q-rptr!=cpi)&(q-rptr-jrptr; p-rptr=q-rptr; q-rptr=p; q=cpj; while(q-cptr!=cpj)&(q-cptr-icptr ; p-cptr=q-cptr; q-cptr=p; (5)定义两个矩阵的非零元素,及两个矩阵的行和列数。然后输入非零元素。将两个用十字链表表示的稀疏矩阵显示出来。void print(link *a) link *p,*q,*r; int k,col,t,row; col=a-j; printf( 矩阵为: n); p=a-uval.next; while(p!=a) q=p-rptr; if(q=a-cptr)break; r=p; while(q!=p) for(k=1;kj-(r-j);k+) printf( 0); printf(%3d,q-uval.v); q=q-rptr; r=r-rptr; k=r-j; for(t=k;tuval.next; link *add(link *a,link *b) link *p,*q,*u,*v ,*r,*cpsmax,*c; int s,i; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - if(a-i!=b-i|a-j!=b-j) flag=1;return NULL; (5)建立相加矩阵 c 的表头环链c=(link *)malloc(sizeof(link); c-i=a-i;c-j=a-j; if(c-ic-j)s=c-i; else s=c-j; cp0=c; for(i=1;ii=0;r-j=0; r-rptr=r;r-cptr=r; cpi=r; cpi-1-uval.next=r; cps-uval.next =c; 考虑复杂问题,实现矩阵相加。p=a-uval.next;u=b-uval.next; while(p!=a&u!=b) q=p-rptr;v=u-rptr; if(q=p&v!=u) while(v!=u) insert(v-i,v-j,v-uval.v ,cp);v=v-rptr; else if(v=u&q!=p) while(q!=p) insert(q-i,q-j,q-uval.v ,cp);q=q-rptr; else if(q!=p&v!=u) while(q!=p&v!=u) if(q-jj) insert(q-i,q-j,q-uval.v ,cp);q=q-rptr; else if(q-jv-j) insert(v-i,v-j,v-uval.v ,cp);v=v-rptr; else if(q-uval.v+v-uval.v!=0)insert(q-i,q-j,(q-uval.v+v-uval.v),cp); q=q-rptr;v=v-rptr; if(q=p&v!=u) while(v!=u) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - insert(v-i,v-j,v-uval.v ,cp);v=v-rptr; else if(v=u&q!=p) while(q!=p) insert(q-i,q-j,q-uval.v ,cp);q=q-rptr; else; else ; p=p-uval.next;u=u-uval.next; return c; (6)编写主函数void main() link *a,*b,*c; a=creatlinkmat();print(a); b=creatlinkmat();print(b); c=add(a,b); if(flag=1)printf( 矩阵 a、b 不能相加 !); else printf(和矩阵 c 为: n);print(c); 实验总结:应掌握稀疏矩阵的各种表示方法。学会实现两个稀疏矩阵的加法运算。对十字链表法应熟练掌握。考虑矩阵相加时,情况要考虑全面。在输入出错时, 要及时提示提醒操作者,该行为不能再继续运行该程序。07 级 信 息 与 计 算 科 学2班张雨辰20074694 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -