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

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 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;      //完成列插入
   }
  }

}

 

你可能感兴趣的:(Android网络)