?? 算法5.5.txt
字號:
MLink AddMat (Ha,Hb)
MLink Ha,Hb;
{ Mnode *p,*q,*pa,*pb,*ca,*cb,*qa;
if (Ha->row!=Hb->row || Ha->col!=Hb->col) return NULL;
ca=Ha->v_next.next; /*ca初始指向A矩陣中第一行表頭結點*/
cb=Hb->v_next.next; /*cb初始指向B矩陣中第一行表頭結點*/
do { pa=ca->right; /*pa指向A矩陣當前行中第一個結點*/
qa=ca; /*qa是pa的前驅*/
pb=cb->right; /*pb指向B矩陣當前行中第一個結點*/
while (pb->col!=0) /*當前行沒有處理完*/
{
if (pa->col < pb->col && pa->col !=0 ) /*第三種情況*/
{ qa=pa;
pa=pa->right;
}
else
if (pa->col > pb->col || pa->col ==0 ) /*第四種情況*/
{p=malloc(sizeof(MNode));
p->row=pb->row; p->col=pb->col; p->v=pb->v;
p->right=pa;qa->right=p; /* 新結點插入*pa的前面*/
pa=p;
/*新結點還要插到列鏈表的合適位置,先找位置,再插入*/
q=Find_JH(Ha,p->col); /*從列鏈表的頭結點找起*/
while(q->down->row!=0 && q->down->row<p->row)
q=q->down;
p->down=q->down; /*插在*q的后面*/
q->down=p;
pb=pb->right;
} /* if */
else /*第一、二種情況*/
{x= pa->v_next.v+ pb->v_next.v;
if (x==0) /*第二種情況*/
{ qa->right=pa->right; ./*從行鏈中刪除*/
/*還要從列鏈中刪除,找*pa的列前驅結點*/
q= Find_JH (Ha,pa->col); /*從列鏈表的頭結點找起*/
while ( q->down->row < pa->row )
q=q->down;
q->down=pa->down;
free (pa);
pa=qa;
} /*if (x==0)*/
else /*第一種情況*/
{ pa->v_next.v=x;
qa=pa;
}
pa=pa->right;
pb=pb->right;
}
} /*while*/
ca=ca->v_next.next; /*ca指向A中下一行的表頭結點*/
cb=cb->v_next.next; /*cb指向B中下一行的表頭結點*/
} while (ca->row==0) /*當還有未處理完的行則繼續*/
return Ha;
}
算法5.5 十字鏈表表示的稀疏矩陣相加
為了保持算法的層次,在上面的算法,用到了一個函數findjH。
函數Mlink Find_JH(MLink H, int j)的功能是:返回十字鏈表 H 中第j列鏈表的
頭結點指針
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -