【問題描述】兩個相同行數和列數的稀疏矩陣用十字鍊錶實現加法運算
【資料描述】
typedef struct ele elenode;
【演算法描述】
(1) 若q->j>v->j,則需要在c矩陣的鍊錶中插入乙個值為bij的結點,,修改v=v->right。
(2) 如q->jj,則需要在c矩陣的鍊錶中插入乙個值為aij的結點,修改q=q->right。
(3) 若q->j = = v->j且q->e + v->e ! = 0,則需要在c矩陣的鍊錶中插入乙個值為aij+bij的結點,修改q=q->right,v=v->right。
重複(1)--(3)完成一行的操作。修改p=p->down,u=u->down後,再繼續下一行。【c源程式】
#include
#include
typedef struct ele elenode;
/*建立乙個元素全為零的稀疏矩陣的十字鍊錶*/
elenode *createnullmat(int m,int n) / * m行n列 */
for(p=h->right,k=0;krow=1000; / * 設矩陣不會超過1000行 * /
p->down = p; / * 每個列煉表是乙個環 * /
p->right = k<n-1 ? p+1 : h->right; / *使全部列煉表頭結點構成環 * /
}return h;
}//
int insertnode(elenode *a ,int row,int col,double val)
if(q->col==col) return -1; / * 該行已有col列元素 * /
u=a->right+col;v=u->down;
while(v->rowdown;}
if(v->row==row) return -1; / * 該列已有row行元素 * /
p->right = r; r->right = q; / * 插入到行鏈中 * /
u->down = r; r->down = v; / * 插入到列鏈中 * /
a->val=val;
return 0; / * 插入成功 * /
}elenode *readmat()
printf("輸入下一行有非零元素的行號(-1表示輸入結束)");
scanf("%d",&i);
}return h;
}void showmat(elenode *a)
else
printf("0 ");
}printf("/n");}}
elenode *matadd(elenode *a,elenode *b)
else if(q->colcol)
else
p=p->down;u=u->down;
}while(p!=a->down);
return r;
}void main()
【測試資料】
輸入a 矩陣: 4 0 0 0 輸入b矩陣: 0 1 0 1 輸出:4 1 0 1
0 5 0 9 0 –5 0 0 0 0 0 9
0 0 1 0 1 0 9 0 1 0 10 0
輸入資料注意事項:
(1)如上面a矩陣,應輸入3行4列
(2)若某行有非零元素,則按下列格式(三元組格式)輸入:
行號 列號 值 列號 值 … 列號 值 -1,如a矩陣的第0行,應輸入0 0 4 -1,最後 的-1表示該行的一組資料輸入結束。
(3)按以上格式逐行地輸入資料,直到輸入的行號的值為-1時,表示稀疏矩陣的全部資料輸入結束。
【說明】
從乙個結點來看,進行比較、修改指標所需的時間是乙個常數;整個運算過程在於對a和b的十字鍊錶逐行掃瞄,其迴圈次數主要取決於a和b矩陣中非零元素的個數ta和tb;由此演算法的時間複雜度為o(ta+tb)。
稀疏矩陣十字鍊錶表示法
稀疏矩陣十字鍊錶表示法和基本運算 include include define m 3 矩陣行 define n 3 矩陣列 define max m n m n 矩陣行列較大者 typedef int elemtype typedef struct mtxn tag matnode 十字鍊錶型別定...
用十字鍊錶表示的稀疏矩陣類
總結 一 在用十字鍊錶結構表示稀疏矩陣時,矩陣中的每乙個非零元素對應乙個結點,每個結點五個域 行域,列域,值域,向下域和向右域,行域和列域分別存放非零元素所在的行號和列號,值域存放非零元素的值,向下域指示同一列中下乙個非零元素的儲存結點序號,向右域指示同一行中下乙個非零元素的儲存結點序號。二 十字鍊...
十字鍊錶 稀疏矩陣
include includetypedef struct olnode olnode,olink typedef struct 行和列煉表頭指標向量基址,由creatsmatrix ol 分配 crosslist 初始化m crosslist型別的變數必須初始化,否則建立 複製矩陣將出錯 bool...