Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T) { // 算法5.2
// 采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
int col, t, p, q;
int num[20], cpot[20];
T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;
if (T.tu) {
for (col=1; col<=M.nu; ++col) num[col] = 0;
for (t=1; t<=M.tu; ++t) // 求 M 中每一列所含非零元的个数
++num[M.data[t].j];(这是什么意思啊)
cpot[1] = 1;
// 求 M 中每一列的第一个非零元在 b.data 中的序号
for (col=2; col<=M.nu; ++col) cpot[col] = cpot[col-1]+num[col-1];
for (p=1; p<=M.tu; ++p) {
col = M.data[p].j; q = cpot[col];
T.data[q].i =M.data[p].j; T.data[q].j =M.data[p].i;
T.data[q].e =M.data[p].e; ++cpot[col]; (这又是什么含义啊,为什么要++)
} // for
} // if
return OK;
} // FastTransposeSMatrix
还有
Status CreateSMatrix_OL (CrossList &M) { // 算法5.4
// 创建稀疏矩阵M。采用十字链表存储表示。
// if (M) free(M);
// scanf(&m, &n, &t ); // 输入M的行数、列数和非零元个数
OLNode *p,*q;
int i,j,e;
int m=random(4,6), n=random(4,6), t=random(4,5);
M.mu=m; M.nu=n; M.tu=t;
if (!(M.rhead = (OLink *)malloc((m+1)*sizeof(OLink)))) return ERROR;
if (!(M.chead = (OLink *)malloc((n+1)*sizeof(OLink)))) return ERROR;
for(int a=1;a<=m;a++) // 初始化行列头指针向量;各行列链表为空链表
M.rhead[a]=NULL;
for(int b=1;b<=n;b++) M.chead[b]=NULL;
for ( int c=1; c<=t; c++) { // 按任意次序输入非零元
scanf(&i,&j,&e);
if (!(p = (OLNode *)malloc(sizeof(OLNode)))) return ERROR;
p->i=i; p->j=j; p->e=e; p->down=NULL; p->right=NULL; // 新结点
if (M.rhead[i] == NULL || M.rhead[i]->j > j) {
p->right = M.rhead[i]; M.rhead[i]= p;
} else { // 寻查在行表中的插入位置
for (q=M.rhead[i]; (q->right) && (q->right->j<j); q=q->right);
p->right = q->right; q ->right = p;
} // 完成行插入
if (M.chead[j] == NULL || M.chead[j]->i > i) {
p->down = M.chead[j]; M.chead[j]= p;
} else { // 寻查在列表中的插入位置
for ( q=M.chead[j]; (q->down) && q->down->i <i; q = q->down );
p->down = q->down; q->down = p;
} // 完成列插入
} // for
return OK;
} // CreateSMatrix_OL
这里的 if (!(M.rhead = (OLink *)malloc((m+1)*sizeof(OLink)))) return ERROR;为什么有(m+1)啊什么意思啊??后面的指针M.chead[j] 怎么有【】呢??不懂啊。。
希望高手们给小弟指条明路走走,都困扰在下一天了。。。。。。
谢谢。。。。。。。。。
>> 本文固定链接: http://www.vcgood.com/archives/1867
>> 转载请注明: yipiantiannick 2007年10月13日 于 C语言帝国 发表