LX稀疏矩阵的十字链表表示
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct OLNode
{
int i,j; //该非零元的行下标和列下标
ElemType e;
struct OLNode *right,*down; //该非零元所在行表和列表的后继链域
}OLNode,*OLink;
typedef struct
{
OLink *rhead,*chead; //行链表和列链表头指针向量基地址由CrossSMatrix分配
int mu,nu,tu; //稀疏矩阵的行数、列数和非零元的个数
}CrossList;
Status CreateSMtrix(CrossList &M)//建立稀疏矩阵
{
int x;
int i,j,e;
OLink p,q;
printf("请输入稀疏矩阵的行数、列数和非零元个数:\n");
scanf("%d%d%d",&M.mu,&M.nu,&M.tu );
printf("请输入稀疏矩:\n");
if(!(M.rhead=(OLink*)malloc((M.mu +1)*sizeof(OLink)))) exit(OVERFLOW);
if(!(M.chead=(OLink*)malloc((M.nu +1)*sizeof(OLink)))) exit(OVERFLOW);
for(x=0;x<=M.mu;x++)
{
M.rhead[x]=NULL; // 初始化各行,列头指针,分别为NULL
}
for(x=0;x<=M.nu;x++)
{
M.chead[x]=NULL;
}
while(scanf("%d%d%d",&i,&j,&e)&&i!=0)
//for(int k=1;k<=M.tu;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;
}//完成行插入
p->down =NULL;
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;
}//完成列插入
p->right = NULL;
}
return OK;
}
Status PrintSMatrix(CrossList &M)//输出矩阵
{
OLink p;
int i,j;
if((M.mu<=0)||(M.nu<=0)||(M.tu<=0)) return ERROR;
printf("原矩阵: \n");
for(i=1;i<=M.mu;i++)
{
p=M.rhead[i];
for(j=1;j<=M.nu;j++)
{
if((p)&&(j==p->j))
{
printf("%d ",p->e );
p=p->right;
}
else
printf("0 ");
}
printf("\n");
}
return OK;
}
int main()
{
CrossList M,N;
CreateSMtrix(M);
PrintSMatrix(M);
return OK;
}