十字链表

来源:互联网 发布:mac口红怎么涂 编辑:程序博客网 时间:2024/04/27 16:08

十字链表的构成

用链表模拟矩阵的行(或者列,这可以根据个人喜好来定),然后,再构造代表列的链表,将每一行中的元素节点插入到对应的列中去。十字链表的逻辑结构就像是一个围棋盘(没见过,你就想一下苍蝇拍,这个总见过吧),而非零元就好像是在棋盘上放的棋子,总共占的空间就是,确定那些线的表头节点和那些棋子代表的非零元节点。最后,我们用一个指针指向这个棋盘,这个指针就代表了这个稀疏矩阵。

十字链表

十字链表(Orthogonal List)是有向图的另一种链式存储结构。可以看成是将有向图的邻接表和逆邻接表结合起来得到的一种链表。在十字链表中,对应于有向图中每一条弧都有一个结点,对应于每个定顶点也有一个结点。

  十字链表之于有向图,类似于邻接表之于无向图。十字链表主要在两个地方应用:稀疏矩阵的存储, 有向图的存储。

 

实现

 

C代码如下:

C代码  收藏代码
  1. #include <malloc.h>  
  2. #include <stdio.h>  
  3.   
  4. //十字链表的节点定义  
  5. typedef struct OLNode  
  6. {  
  7.   //非零元素的行和列下标  
  8.   int row, col;  
  9.   int value;  
  10.   //右边节点指针  
  11.   struct OLNode *right;  
  12.   //下方节点指针  
  13.   struct OLNode *down;        
  14. }OLNode,*OLink;  
  15.   
  16. //十字链表  
  17. typedef struct  
  18. {  
  19.    //十字行链表的头指针  
  20.    OLink *row_head;  
  21.    //十字列链表的头指针  
  22.    OLink *col_head;  
  23.    //稀疏矩阵的行数、列数和非零元素的个数  
  24.    int m, n, len;          
  25. }CrossList;  
  26.   
  27. //建立十字链表  
  28. void CreateCrossList(CrossList *M)  
  29. {  
  30.    int m, n, t;  
  31.    int i, j, e;  
  32.    OLNode* p;  
  33.    OLNode* q;  
  34.   
  35.    //采用十字链表存储结构,创建稀疏矩阵M  
  36.    scanf("%d%d%d", &m, &n, &t);  
  37.    M->m = m;  
  38.    M->n = n;  
  39.    M->len = t;  
  40.      
  41.    if(!(M->row_head=(OLink*)malloc((m+1)*sizeof(OLink))))  
  42.    {  
  43.       printf("Error\n");           
  44.    }  
  45.    if(!(M->col_head=(OLink*)malloc((n+1)*sizeof(OLink))))  
  46.    {  
  47.       printf("Error\n");                                              
  48.    }  
  49.      
  50.    //初始化行头指针向量,各行链表为空的链表  
  51.    for(int h=0; h<m+1; h++)  
  52.    {  
  53.       M->row_head[h] = NULL;          
  54.    }  
  55.    //初始化列头指针向量,各列链表为空的链表  
  56.    for(int t=0; t<n+1; t++)  
  57.    {  
  58.       M->col_head[t] = NULL;          
  59.    }  
  60.      
  61.    for(scanf("%d%d%d", &i, &j, &e); i!=0; scanf("%d%d%d",&i, &j, &e))  
  62.    {  
  63.       if(!(p = (OLNode*)malloc(sizeof(OLNode))))  
  64.       {  
  65.          printf("Error\n");    
  66.       }                
  67.       //生成节点  
  68.       p->row = i;  
  69.       p->col = j;  
  70.       p->value = e;  
  71.       if(M->row_head[i] == NULL)  
  72.       {  
  73.          M->row_head[i] = p;                 
  74.       }   
  75.       else   
  76.       {  
  77.          //寻找行表中的插入位置  
  78.          for(q=M->row_head[i]; q->right && q->right->col < j; q=q->right);  
  79.            
  80.          p->right = q->right;  
  81.          q->right = p;  
  82.       }  
  83.         
  84.       if(M->col_head[j] == NULL)  
  85.       {  
  86.          M->col_head[j] = p;                    
  87.       }  
  88.       else   
  89.       {  
  90.          //寻找列表中的插入位置  
  91.          for(q=M->col_head[j]; q->down && q->down->row < i; q=q->down);    
  92.            
  93.          p->down = q->down;  
  94.          q->down = p;  
  95.       }  
  96.    }  
  97. }  
0 0