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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

十字链表存储

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 十字链表存储 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(耿《數據結構》原文)為避免大量移動元素,采用稀疏矩陣的鏈式存儲法——十字鏈表。

它的好處是能靈活地插入因運算而產生的非零元素,刪除因運算而產生的新的零元素,實現矩陣的各種運算。

1.十字鏈表的存儲表示(五要素)

矩陣的每一個非零元素用一個結點表示,該結點除了(row,col,value)以外,還要添加兩個鏈域:

right:用于鏈接同一行中的下一個非零元素

down:用于鏈接同一列中的下一個非零元素

在十字鏈表的儲存結構中,可以看成是兩個單鏈表的組合溝通。可以類比行指針,列指針。

同一行的非零元素通過right域鏈接成一個單鏈表,

同一列的非零元素通過down域鏈接成一個單鏈表。

相應的,需要附設一個存放所有行鏈表頭指針的一維數組和一個存放所有列鏈表的頭指針的一維數組。

2.十字鏈表的類型定義

一個結點的定義;

typedef struct OLNode { int row,col; ElementType value; struct OLNode *right,*down;//指向的下一個結點也是同樣的結構 }OLNode;*OLink;

十字鏈表存儲結構

typedef struct { OLink *row_head,*col_head;//頭指針 int m,n,len;//行,列,非零元素個數 }CrossList;

3.十字鏈表的算法實現

步驟:

①讀入稀疏矩陣的行數,列數,非零元素個數;

②申請行,列鏈表的頭指針空間;

③逐個讀入非零元素,分別插入行鏈表,列鏈表。

算法(建立稀疏矩陣的十字鏈表,實質是在兩個單鏈表中完成插入)

CreateCrossList(CrossList *M) { scanf("%d %d %d",&m,&n,&t); M->m=m; M->n=n; M->len=t; if(!(M->row_head=(OLink*)malloc((m+1)sizeof(OLink)))) exit(OVERFLOW); if(!(M->col_head=(OLink*)malloc((n+1)sizeof(OLink)))) exit(OVERFLOW); M->row_head[]=M->col_head[]=NULL;//初始化 for(scanf(&i,&j,&e);i!=0;scanf(&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; else { //尋找插入的位置 q=M->row_head[i];//用來指向這一行的插入點的前一個結點,一開始指向行表頭 while(q->right!=NULL&&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; else { //尋找插入位置 q=M->col_head[j]; while(q->down!=NULL&&q->down->row<i) q=q->down; p->down=q->down; q->down=p; } } }

總結

以上是生活随笔為你收集整理的十字链表存储的全部內容,希望文章能夠幫你解決所遇到的問題。

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