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;
}

posted @ 2013-05-13 11:06  梁红伟12138  阅读(285)  评论(0编辑  收藏  举报