日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

十字链表[通俗易懂](欧洲有多少种十字架)

發布時間:2023/12/24 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 十字链表[通俗易懂](欧洲有多少种十字架) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

~~~~ 有需求才有供應,很多東西,都是為了解決實際問題才出現的,項目中出現了很多稀疏矩陣,而且需要對他們進行運算,而十字鏈表就是為了解決稀疏矩陣而出現的一種數據結構。

稀疏矩陣

~~~~ 稀疏矩陣(英語:sparse matrix),在數值分析中,是其元素大部分為零的矩陣。反之,如果大部分元素都非零,則這個矩陣是稠密的,通常這個系數被認為是5%。在科學與工程領域中求解線性模型時經常出現大型的稀疏矩陣。
~~~~ 在使用計算機存儲和操作稀疏矩陣時,經常需要修改標準算法以利用矩陣的稀疏結構。由于其自身的稀疏特性,通過壓縮可以大大節省稀疏矩陣的內存代價。更為重要的是,由于過大的尺寸,標準的算法經常無法操作這些稀疏矩陣。

三元組

~~~~ 對于矩陣,我們第一想法就是使用二維數組來存儲,但是稀疏矩陣的元素大部分都是零,而且稀疏矩陣的尺寸一般都比較大,這個時候我們如果直接使用二維數組,會浪費很多的空間,所有通常我們需要對稀疏矩陣進行壓縮,三元組就是一種稀疏矩陣壓縮保存的方法。
~~~~ 三元組是指形如 ( ( x , y ) , z ) ((x,y),z) ((x,y),z)的集合(這就是說,三元組是這樣的偶,其第一個射影亦是一個偶),常簡記為 ( x , y , z ) (x,y,z) (x,y,z)。
~~~~ 三元組是計算機專業的一門公共基礎課程——數據結構里的概念。主要是用來存儲稀疏矩陣的一種壓縮方式,也叫三元組表。
~~~~ 三元組有不同的實現方法,假設以順序表存儲結構來表示三元組,稱為三元組順序表。
結構如下

#defube NAXSIZE 2500
typedef struct{ 
   
    int i, j; //該非零元的行下標和列下標
    ElemType e;
}Triple;
typedef struct{ 
   
    Triple data[MAXSIZE + 1];//非零三元數組標,data[0]沒有使用
    int mu, nu, tu;//矩陣的行數,列數,非零元個數
}TSMatrix;

~~~~ 注意,data域中表示非零元的三元組是以行序為主序順序排列的,如果不排序,你會發現你操作和訪問數據時,時間基本都花在查詢數據上了。對于三元組,我們可以進行一些運算,都是很容易實現的,比如轉置,相加,相減。
~~~~ 三元組相比十字鏈表的缺點(暫時只能想到這些)

  • 1、增加或減少矩陣中的非零元素,都需要進行數據的移動
  • 2、大小固定,非零數據很少時,會浪費很多的空間,過多時無法保存
  • 3、查找元素比較慢(時間復雜度)
  • 4、矩陣的運算數據較慢(時間復雜度)

十字鏈表

~~~~ 十字鏈表(英語:Orthogonal linked list)是計算機科學中的一種高級數據結構,在Linux內核中應用廣泛。具體說,一個二維十字鏈表是鏈表的元素同時鏈接左右水平鄰結點與上下垂直鄰結點。
~~~~ 當稀疏矩陣的非零元個數和位置在操作過程中變化較大時,就不宜使用順序表存儲結構的三元組來保存稀疏矩陣;這個時候我們采用的時十字鏈表。
十字鏈表節點結構

typedef struct OLNode { 
       
     int  LineNumber, ColumneNumber;          //行號與列號 
     ElemType value;        //值 
     struct OLNode *right, *down;  //同行、同列下一個元素的指針 
}OLNode, *OList;
typedef struct{ 
   
    OList *rhead, *chead;    //行和列鏈表頭指針向量基址
    int mu,nu,tu;            //稀疏矩陣的行數,列數和非零元個數
}CrossList;

~~~~ 每一個非零元可用一個含5個域的節點表示,其中i,j和e這3個域分別表示該非零元所在的行、列和非零元的值,向右域right用以鏈接同一行中下一個非零元,向下域down用來鏈接同一列下一個非零元,同一行的非零元通過right鏈接形成一個線性鏈表,同一列的非零元通過down鏈接形成一個線性表,每個非零元既是某個行鏈表中的節點,也是某一個列鏈表中的節點,整個矩陣構成了一個十字交叉的鏈表,而樣的鏈表存儲結構稱為十字鏈表。

附上十字鏈表實現(百度抄的)

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

總結

以上是生活随笔為你收集整理的十字链表[通俗易懂](欧洲有多少种十字架)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。