课程设计报告—稀疏矩阵的完全链表表示及其运算(4)

2019-08-26 18:06

for(k=0;k!=M.nu;k++) {

p=M.chead[k]; while(p) {

array[p->i][p->j]=p->e;//将非零元存入数组中 p=p->down; } }

for(i=0;i!=M.mu;i++) {

for(j=0;j!=M.nu;j++) {

if(j==M.nu-1)

cout<

cout<

return OK; }

int Add(CrossList M,CrossList N,CrossList &Q) {

int i,k;

OLink p,pq,pm,pn; OLink *col;

Q.mu=M.mu;//初始化Q Q.nu=M.nu; Q.tu=0;

Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink)); if(!Q.rhead)

exit(OVERFLOW);

Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink)); if(!Q.chead)

exit(OVERFLOW);

for(k=0;k!=Q.mu;k++)//初始化行 Q.rhead[k]=NULL;

for(k=0;k!=Q.nu;k++)//初始化列 Q.chead[k]=NULL;

col=(OLink*)malloc((Q.nu+1)*sizeof(OLink));//生成指向列的最后节点的数组 if(!col)

exit(OVERFLOW);

for(k=0;k!=Q.nu;k++)//赋初始值

col[k]=NULL;

for(i=0;i!=M.mu;i++)//按行序相加 {

pm=M.rhead[i]; pn=N.rhead[i]; while(pm&&pn) {

if(pm->jj)//矩阵M当情前结点的列小于矩阵N当前结点的列 {

p=(OLink)malloc(sizeof(OLNode));//生成Q的结点 if(!p)

exit(OVERFLOW); Q.tu++; //非零元个数+1 p->i=i; //赋值 p->j=pm->j; p->e=pm->e; p->right=NULL;

pm=pm->right; //pm右移 }

else if(pm->j>pn->j) {

p=(OLink)malloc(sizeof(OLNode)); if(!p)

exit(OVERFLOW); Q.tu++; p->i=i; p->j=pn->j; p->e=pn->e; p->right=NULL; pn=pn->right; }

else if(pm->e+pn->e)//M,N当前结点的列相同并且两元素之和非零 {

p=(OLink)malloc(sizeof(OLNode)); if(!p)

exit(OVERFLOW); Q.tu++; p->i=i; p->j=pn->j;

p->e=pm->e+pn->e; p->right=NULL;

pm=pm->right;//pm右移 pn=pn->right;//pn右移 }

else//两元素相加为零 {

pm=pm->right; pn=pn->right; continue; }

if(Q.rhead[i]==NULL) Q.rhead[i]=pq=p; else {

pq->right=p;//完成行插入 pq=pq->right; }

if(Q.chead[p->j]==NULL) Q.chead[p->j]=col[p->j]=p; else {

col[p->j]->down=p;//完成列插入 col[p->j]=col[p->j]->down; } }

while(pm)//将矩阵M该行的剩余元素插入矩阵Q {

p=(OLink)malloc(sizeof(OLNode)); if(!p)

exit(OVERFLOW); Q.tu++; p->i=i;

p->j=pm->j; p->e=pm->e; p->right=NULL; pm=pm->right;

if(Q.rhead[i]==NULL) Q.rhead[i]=pq=p; else {

pq->right=p; pq=pq->right; }

if(Q.chead[p->j]==NULL) Q.chead[p->j]=col[p->j]=p; else {

col[p->j]->down=p;

col[p->j]=col[p->j]->down; } }

while(pn)//将矩阵N该行的剩余元素插入矩阵Q {

p=(OLink)malloc(sizeof(OLNode)); if(!p)

exit(OVERFLOW); Q.tu++; p->i=i; p->j=pn->j; p->e=pn->e; p->right=NULL; pn=pn->right;

if(Q.rhead[i]==NULL) Q.rhead[i]=pq=p; else {

pq->right=p; pq=pq->right; }

if(Q.chead[p->j]==NULL) Q.chead[p->j]=col[p->j]=p; else {

col[p->j]->down=p;

col[p->j]=col[p->j]->down; } } }

for(k=0;k!=Q.nu;k++) if(col[k])

col[k]->down=NULL; free(col); return OK; }

CrossList Negative(CrossList M) {

OLink p;

for(int j=0;j!=M.mu;j++) {

p=M.rhead[j]; while(p)

{

p->e=-p->e;//将非零元的值反号 p=p->right; } }

return (M); }

int Mult(CrossList M,CrossList N,CrossList &Q) {

int i,j,e;

OLink q,p0,q0,q1,q2; if(M.nu!=N.mu) {

printf(\你输入的两个距阵不能进行此操作\\n\ exit(OVERFLOW); } else {

Q.mu=M.mu; Q.nu=N.nu; Q.tu=0;

Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink)); if(!Q.rhead)

exit(OVERFLOW);

Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink)); if(!Q.chead)

exit(OVERFLOW);

for(i=0;i!=Q.mu;i++)//初始化行 Q.rhead[i]=NULL;

for(i=0;i!=Q.nu;i++)//初始化列 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->ij)

q0=q0->down;//列后移 else if(q0->i>p0->j)


课程设计报告—稀疏矩阵的完全链表表示及其运算(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:菱角山站拨接开通方案

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

马上注册会员

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