稀疏矩阵的十字链表存储表示

typedef struct OLNode{

     int  i,j;                 //该非零元的行列下标

     ElemType    e;   

     struct  OLNode    *right  ,*down;      //该非零元所在行表、列表的后继链域

}  OLNode;   *OLink;

typedef  struct {

       OLink  *rhead ,   *chead;     //行和列 链表头指针向量基址 由CreateSMatrix分配

        int     mu,nu,tu;                  //稀疏矩阵的行数列数及非零元个数

} CrossList;

 

 

Status CreateSMatrix_OL(CrossList  &M)

{         //创建稀疏矩阵M    采用十字链表存储表示

     if(M)
  free(M);
  scanf(&m,&n,&t); //输入M的行数列数和非零元个数
  M.mu = m; M.nu= n;  m.tu = t;
  if(!(M.rhead = (OLink *)malloc(sizeof(OLink)*(m+1))))  exit(OVERFLOW);
  if(!(M.chead = (OLink *)malloc(sizeof(OLink)*(n+1))))  exit(OVERFLOW);
  M.rhead[] = M.chead[] = NULL;         //初始化行列头指针向量,各行列链表为空链表
  for(scanf(&i,&j,&e); i != 0 ; scanf(&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.rhead[j]->i >i)
   {
    p->dowm = M.chead[j];
    M.chead[j] = p;
   }
   else{
      for(q = M.ched[j]; (q->down) && q->down->i < i; q= q->down);
   p->down = q->down ; q->down = p;      //完成列插入
   }
  }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值