//CrossList.cpp
#include"predefined.h"
#include"CrossList.h"
Status InitSMatrix(CrossList *M) /* 加 */
{ /* 初始化M(CrossList类型的变量必须初始化,否则创建、复制矩阵将出错) */
(*M).rhead=(*M).chead=NULL;
(*M).mu=(*M).nu=(*M).tu=0;
return OK;
}
Status CreateSMatrix_OL(CrossList *M)
//算法5.4:创建稀疏矩阵,采用十字链表存储表示
{
int m,n,t,i,j,k;
ElemType e;
OLink p,q;
printf("请输入行,列,非零元个数:");
scanf("%d,%d,%d",&m,&n,&t);
(*M).mu=m;
(*M).nu=n;
(*M).tu=t;
if(!((*M).rhead=(OLink *)malloc((m+1)*sizeof(OLink))))
exit(OVERFLOW);
if(!((*M).chead=(OLink*)malloc((n+1)*sizeof(OLink))))
exit(OVERFLOW);
for(i=0;i<=m;i++)
(*M).rhead[i]=NULL;
for(j=0;j<=n;j++)
(*M).chead[j]=NULL;
printf("请按任意次序输入%d个非零元的行,列,元素值:\n",(*M).tu);
for(k=0;k<t;k++)
{
scanf("%d,%d,%d",&i,&j,&e);
if(!(p=(OLNode *)malloc(sizeof(OLNode))))
exit(OVERFLOW);
(*p).i=i;
(*p).j=j;
(*p).e=e;
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;
}
}
return OK;
}
Status PrintSMatrix(CrossList M)
{ /* 初始条件: 稀疏矩阵M存在。操作结果: 按行或按列输出稀疏矩阵M */
int i,j;
OLink p;
printf("%d行%d列%d个非零元素\n",M.mu,M.nu,M.tu);
printf("请输入选择(1.按行输出 2.按列输出): ");
scanf("%d",&i);
switch(i)
{
case 1: for(j=1;j<=M.mu;j++)
{
p=M.rhead[j];
while(p)
{
printf("%d行%d列值为%d\n",p->i,p->j,p->e);
p=p->right;
}
}
break;
case 2: for(j=1;j<=M.nu;j++)
{
p=M.chead[j];
while(p)
{
printf("%d行%d列值为%d\n",p->i,p->j,p->e);
p=p->down;
}
}
}
return OK;
}
//CrossList.h
typedef int ElemType;
typedef struct OLNode
{
int i,j;
ElemType e;
struct OLNode *right,*down;
}OLNode,*OLink;
typedef struct
{
OLink *rhead,*chead;
int mu,nu,tu;
}CrossList;
Status InitSMatrix(CrossList *M);
Status CreateSMatrix_OL(CrossList *M);
Status PrintSMatrix(CrossList M);