logo资料库

采用十字链表表示稀疏矩阵,并实现矩阵的加法运算.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
课程设计 所抽题目:采用十字链表表示稀疏矩阵,并实现矩阵的加法运算。 要求:要检查有关运算的条件,并对错误的条件产生 报警。 问题分析和建立模型:本题目主要是运用所学知识,用十字链 表的方法去表示稀疏矩阵,并使之可以在两矩阵间进行相加。而后, 若有错误,则对错误进行警报。 框架搭建: 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 {
struct lnode *next; datatype v; }uval; }link; int flag=0; 建立十字链表头结点 head=(link *)malloc(sizeof(link)); 建立头结点循环链表 for(i=1;i<=s;i++) (3)插入结点函数 p=(link *)malloc(sizeof(link)); p->i=0;p->j=0; p->rptr=p;p->cptr=p; cp[i]=p; cp[i-1]->uval.next=p; } cp[s]->uval.next=head; for(k=1;k<=t;k++) { printf("\t 第%d 个元素(行号 i 列号 j 值 v,数字间用空格分隔):",k); scanf("%d%d%d",&i,&j,&v); p=(link *)malloc(sizeof(link)); p->i=i;p->j=j;p->uval.v=v; q=cp[i]; while((q->rptr!=cp[i])&&(q->rptr->jrptr; p->rptr=q->rptr; q->rptr=p; q=cp[j]; while((q->cptr!=cp[j])&&(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=cp[i];
while((q->rptr!=cp[i])&&(q->rptr->jrptr; p->rptr=q->rptr; q->rptr=p; q=cp[j]; while((q->cptr!=cp[j])&&(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) { } } link *add(link *a,link *b) { link *p,*q,*u,*v,*r,*cp[smax],*c; int s,i; 0"); for(k=1;kj-(r->j);k++) printf(" printf("%3d",q->uval.v); q=q->rptr; r=r->rptr; } k=r->j; for(t=k;tuval.next; 0");
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->i>c->j)s=c->i; else s=c->j; cp[0]=c; for(i=1;i<=s;i++) { r=(link *)malloc(sizeof(link)); r->i=0;r->j=0; r->rptr=r;r->cptr=r; cp[i]=r; cp[i-1]->uval.next=r; } cp[s]->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->j>v->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)
{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
分享到:
收藏