十字鍊表

十字鍊表

十字鍊表(Orthogonal List)是有向圖的另一種鏈式存儲結構。該結構可以看成是將有向圖的鄰接表和逆鄰接表結合起來得到的。用十字鍊表來存儲有向圖,可以達到高效的存取效果。同時,代碼的可讀性也會得到提升。

基本介紹

  • 中文名:十字鍊表
  • 外文名:Orthogonal List
  • 屬於:有向圖的另一種鏈式存儲結構
  • 優點:達到高效的存取效果
十字鍊表的構成,十字鍊表,舉例,

十字鍊表的構成

鍊表模擬矩陣的行(或者列,這可以根據個人喜好來定),然後,再構造代表列(或者是行)的鍊表,將每一行中的元素節點插入到對應的列中去。十字鍊表的邏輯結構就像是一個圍棋盤(沒見過,你就想一下蒼蠅拍,這個總見過吧!),而非零元就好像是在棋盤上放的棋子,總共占的空間就是,確定那些線的表頭節點和那些棋子代表的非零元節點。最後,我們用一個指針指向這個棋盤,這個指針就代表了這個稀疏矩陣

十字鍊表

十字鍊表(Orthogonal List)是有向圖的另一種鏈式存儲結構。可以看成是將有向圖的鄰接表和逆鄰接表結合起來得到的一種鍊表。在十字鍊表中,對應於有向圖中每一條弧都有一個結點,對應於每個定頂點也有一個結點。
十字鍊表之於有向圖,類似於鄰接表之於無向圖。
也可以理解為 將行的單鍊表和列的單鍊表結合起來存儲稀疏矩陣稱為十字鍊表, 每個節點表示一個非零元素。

舉例

#include <malloc.h>#include <stdio.h>/*十字鍊表的結構類型定義如下:*/typedef struct OLNode{    int row,col; /*非零元素的行和列下標*/    int value;    struct OLNode *right; /*非零元素所在行表、列表的後繼鏈域*/    struct OLNode *down;} OLNode, *OLink;typedef struct{    OLink *row_head; /*行、列鍊表的頭指針向量*/    OLink *col_head;    int m,n,len; /*稀疏矩陣的行數、列數、非零元素的個數*/} CrossList;/*建立稀疏矩陣的十字鍊表的算法*/void CreateCrossList(CrossList *M){    int m, n, t, i, j, e;    OLNode* p;    OLNode* q;    /*採用十字鍊表存儲結構,創建稀疏矩陣M*/    scanf("%d%d%d", &m,&n,&t); /*輸入M的行數,列數和非零元素的個數*/    M->m=m;    M->n=n;    M->len=t;    if(!(M->row_head=(OLink *)malloc(m*sizeof(OLink))))        exit(OVERFLOW);    if(!(M->col_head=(OLink * )malloc(n*sizeof(OLink))))        exit(OVERFLOW);    /*初始化行、列,頭指針指向量,各行、列鍊表為空的鍊表*/    for(int h=0; h<m+1; h++)    {        M->row_head[h] = NULL;    }    for(int t=0; t<n+1; t++)    {        M->col_head[t] = NULL;    }    for(scanf("%d%d%d", &i,&j,&e); e!=0; scanf("%d%d%d", &i,&j,&e))    {        if(!(p=(OLNode *)malloc(sizeof(OLNode))))            exit(OVERFLOW);        p->row=i;        p->col=j;        p->value=e; /*生成結點*/        if(M->row_head[i]==NULL)            M->row_head[i]=p;        p->right=NULL;        else        {            /*尋找行表中的插入位置*/            for(q=M->row_head[i]; q->right&&q->right->col<j; q=q->right); /*空循環體*/            p->right=q->right;            q->right=p; /*完成插入*/        }        if(M->col_head[j]==NULL)            M->col_head[j]=p;        p->down=NULL;        else        {            /*尋找列表中的插入位置*/            for(q=M->col_head[j]; q->down&&q->down->row<i; q=q->down); /*空循環體*/            p->down=q->down;            q->down=p; /*完成插入*/        }    }}

相關詞條

熱門詞條

聯絡我們