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->j
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->i
q0=q0->down;//列后移 else if(q0->i>p0->j)