1. 程式人生 > >資料結構(二):線性表的使用原則以及連結串列的應用-稀疏矩陣的三元組表示

資料結構(二):線性表的使用原則以及連結串列的應用-稀疏矩陣的三元組表示

下面先對沒有介紹的連結串列中的雙鏈表進行介紹,並通過稀疏矩陣的三元組的鏈式結構來深入理解較為複雜的連結串列儲存結構。最後對三次博文所講述的內容進行梳理,以幫助在實際應用中選擇最合適的儲存結構:順序表和連結串列,來組織實現自己的演算法和功能。

雙向連結串列

下面用示意圖對比一下幾種連結串列的表示:

單向連結串列表頭

單向連結串列的結構如下:

迴圈連結串列的結構如下:


在迴圈單鏈表中,從任意一個結點出發,沿著向後鏈能夠訪問到表中的所有元素;
對迴圈連結串列的操作與普通單鏈表基本相同,只是判表空和判斷表尾元素的條件有所不同

判斷表尾:p->next == head
判斷表空:head->next == head

雙向連結串列

指在前驅和後繼方向都能遍歷的線性連結串列,每個結點結構如下圖所示:

雙向連結串列結構如下:


雙向連結串列的優點是:實現雙向查詢(單鏈表不容易做到),缺點是:空間開銷大。

雙向連結串列通常採用帶表頭結點的迴圈連結串列形式,結構如下:


雙向連結串列結點CDNode的抽象資料型別:

typedef struct CDNode
{
DataType m_dData;
CDNode *m_pNext, *m_pPrev;
}

CDNode的基本操作如下:

void SetDNode(DNode *front);
DNode *GetPrev(DNode *ptr);
 DNode *GetNext(DNode *ptr);
void InsertPrev(DNode *pNode);
void InsertNext(DNode *pNode);
Void DeleteDNode(DNode *ptr);

雙向連結串列CDList的實現:

typedef CDList
{
CDNode *m_pHead;
int Size;
}

CDList的基本操作:

Void SetDLList();//構造 
Void FreeDLList();//析構
int DLListSize (); 
int DLListIsEmpty();//
int DLListLocate();
 DataType DLListGetData();
 void DLListInsert();
 void DLListDelete();

針對幾個比較抽象的操作進行圖例說明:




********************************************************************************************

注:在連結串列的操作中要注意修改指標的順序

********************************************************************************************

有序表

有序表的插入

在有順序表L中插入新的結點,使得L仍然有序

void  OrderInsert( SqList  L, ElemType x )   {  
 //L非遞減有序的順序表,插入新元素x,使L仍然有序
   i=L.length-1; //i指向表尾元素
   while(i>=0 && x<L.elem[i]) {  
    L.elem[i+1]=L.elem[i]; //大於x的元素右移
i--;
   } //while
   L.elem[i+1]=x; L.length++;
} //OrderInser

void  OrderInsert( LinkList *L, ElemType e )   { 

 //L是帶頭結點且非遞減有序的單鏈表,插入新元素e,使L仍然有序

   p=L;

   while(p->next!=NULL &&p->next->data<e)  

       p=p->next; //找插入位置

   s=(LNode*)malloc(sizeof(LNode));

   s->next=p->next; s->data=e;

   p->next=s;

//OrderInsert  O(n)

有序表的合併

使得合併後的表仍然有序:

void  MergeList( LinkList *La,  LinkList *Lb )   { 

 //LaLb是帶頭結點且非遞減有序的單鏈表,將他們歸併成Lc

   pa=La->next;  pb=Lb->next;

   Lc=pc=La;  //La的頭結點作為Lc的頭結點

   while(pa&& pb)

   if(pa->data<=pb>data)

                   {

            pc->next=pa; pc=pa; pa=pa->next;

                   }

           else {

  pc->next=pb; pc=pb; pb=pb->next;

                    }

   pc->next = pa? pa : pb;

   delete Lb;

}   

連結串列應用:稀疏矩陣

稀疏矩陣:只有少數非 0 矩陣元素
順序結構:

三元組順序表: (i,j,data)
Typedef struct{
Int I,j;
DataType item;
}Triple;


Typedef struct{
Triple  data[MaxSize+1];
Int mu,nu,tu;
}TSMatrix;

在矩陣操作時矩陣非零元素會發生動態變化,用稀疏矩陣的連結表示可適應這種情況
稀疏矩陣的連結表示採用正交連結串列:行連結串列列連結串列十字交叉
行連結串列與列連結串列都是帶表頭結點的迴圈連結串列用表頭結點表徵是第幾行,第幾列。


稀疏矩陣的行列表頭結點結構:0行0列表頭結點共用一個表頭結點。

列表頭:next: 給出下一個列表頭結點地址;down:給出本列中第一個非0矩陣元素結點地址

行表頭:right:給出本行中第一個非0矩陣元素結點地址


給出稀疏矩陣的正交連結串列表示的圖示:


資料結構的實現:

type struct OLNode
{
          int i,j;//row,col
          DataType e;
          struct OLNode *rnext,*cnext;
}OLNode,OLink


typedef struct{
OLink *rhead,*chead;
int m,n,t;
}

線性表總結

以下幾個綱要是線性表的最主要的內容:

<1>  線性表的邏輯結構和各種儲存表示方法

<2>  定義在邏輯結構上的各種基本運算(操作)

<3>  在各種儲存結構上如何實現這些基本運算

<4>  各種基本運算的時間複雜性

<5>  線性表的長度能否預先確定?處理過程中變化範圍如何? 

長度確定、變化小時用順序表
長度變化大、難以估計最大長度時宜採用連結串列

<6>  對線性表的操作形式如何? 

查詢操作多、刪除和插入操作少時使用順序表
頻繁插入和刪除操作宜採用連結串列 

*************************************************************************************************************************************

相關推薦

資料結構:線性的使用原則以及連結串列應用-稀疏矩陣三元表示

下面先對沒有介紹的連結串列中的雙鏈表進行介紹,並通過稀疏矩陣的三元組的鏈式結構來深入理解較為複雜的連結串列儲存結構。最後對三次博文所講述的內容進行梳理,以幫助在實際應用中選擇最合適的儲存結構:順序表

數據結構:線性的使用原則以及應用-稀疏矩陣三元表示

查找 triple 表的操作 結構 循環鏈表 循環 大於 ria 幫助 上一篇博文中主要總結線性表中的鏈式存儲結構實現,比方單向鏈表、循環鏈表。還通過對照鏈表和順序表的多項式的存儲表示。說明鏈表的長處。能夠參看上篇博文http://blog.csdn.net/lg125

資料結構線性

Status GetElem(SqList L, int i, ElemType *e) { if(L.length == 0 || i < 1 || i > L.length)

數據結構線性——鏈

erro urn 找到 頭結點 tee 存在 結構 strong 函數 通常情況下,鏈接可分為單鏈表、雙向鏈表和循環鏈表三種常用類型。 一、單鏈表基本操作的實現 使用鏈式存儲結構來實現的線性表稱為鏈表。首元結點、頭結點、頭指針、空指針。 1.單鏈表的類型定義 typede

數據結構——線性簡介

pen 線性 virtual spa 多個 集合 mes index esp 數據結構(二)——線性表簡介 一、線性表簡介 1、線性表簡介 線性表是具有相同類型的n個數據元素的有限序列A0,A1,A2,...,An-1。Ai是表項,n是表的長度。 2、線性表的表現形式 線性

大話資料結構——線性順序儲存結構的java實現

    在看《大話資料結構》的時候,裡面詼諧的語言和講解吸引了我,但是這本書是用C來實現的,但是作為一個手擼java的人就想著用java來實現一下這些資料結構,於是就有了這些大話資料結構之java實現。哈哈,感覺這樣會讓自己的理解加深不少。 &n

資料結構與演算法-線性之靜態連結串列

前言:前面介紹的線性表的順序儲存結構和鏈式儲存結構中,都有對物件地引用或指向,也就是程式語言中有引用或者指標,那麼在沒有引用或指標的語言中,該怎麼實現這個的資料結構呢? 一、簡介   定義:用陣列代替指標或引用來描述單鏈表,即用陣列描述的連結串列叫做靜態連結串列,這種描述方法叫做遊標實現法;  

資料結構與演算法-線性之雙向連結串列與雙向迴圈連結串列

前言:前面介紹了迴圈連結串列,雖然迴圈連結串列可以解決單鏈表每次遍歷只能從頭結點開始,但是對於查詢某一節點的上一節點,還是頗為複雜繁瑣,所以可以在結點中加入前一個節點的引用,即雙向連結串列 一、簡介   雙向連結串列:在連結串列中,每一個節點都有對上一個節點和下一個節點的引用或指標,即從一個節點出發可以有

資料結構線性

特徵性質   線性結構 (1)唯一一個第一,唯一一個最後 (2)除第一個外均有唯一後繼,除最後一個均有唯一前驅 分為: 順序儲存線性表 優點 查詢快       缺點 插入刪除慢  可以陣列實現   資料的擴容  動態陣列 無序陣列的應用: 排序 氣泡

資料結構5線性連結串列C++實現帶頭結點的單鏈合併

題目 如何將有序連結串列合併成有序連結串列 假設頭指標為La和Lb的單鏈表分別為線性表LA和LB的儲存結構,現要歸併La和Lb得到單鏈表Lc。 思路點撥 按照第三篇文章的思想,需要設立三個指標pa,pb和pc,其中pa和

【python】python資料結構——線性:順序的實現

前言 這一系列文章將介紹基於python語言的資料結構,主要涉及線性表、字串、棧和佇列、二叉樹和樹、圖、字典和集合、排序等。 線性表及分類 線性表是一類元素序列的抽象,是某類元素的集合,記錄著元素之間的順序關係。python中的list和tuple都支援線性表的需要,只是t

資料結構14線性之C++實現一元多項式相乘

導言 原始碼實現 結果展示 導言 兩個一元多項式相乘的演算法,可以利用兩個一元多項式相加的演算法來實現,因為乘法可以分解為一系列的加法運算。 原始碼實現 #define OK 1 #defin

資料結構12線性之C++實現一元多項式相加

導言 上篇文章,我們說明了一元多項式相加採取了什麼形式和抽象定義資料型別定義以及實現一元多項式相加的方法,本節將用具體程式碼來實現一元多項式相加。 一元多項式表現形式 typedef struct{//項的表示,多項式的項作為LinkLi

“設圖紙”的資料結構和演算法 線性

線性表的定義:由零個或多個數據元素組成的有限序列(n=0時為空表) 注意:線性關係的條件是如果存在多個元素,則“第一個元素無前驅,而最後一個元素無後繼,其他元素都有且僅有一個前驅和後繼” 資料型別:是指一組性質相同的值的集合及定義在此集合上的一些操作的總稱 線性表有

資料結構與演算法-線性之單鏈順序儲存和鏈式儲存

前言:前面已經介紹過資料結構和演算法的基本概念,下面就開始總結一下資料結構中邏輯結構下的分支——線性結構線性表 一、簡介 1、線性表定義   線性表(List):由零個或多個數據元素組成的有限序列;   這裡有需要注意的幾個關鍵地方:     1.首先他是一個序列,也就是說元素之間是有個先來後到的。

資料結構筆記——線性Linear List

個人學習筆記,不喜勿噴。 一開始寫程式碼時糾結於在C++中是用struct還是用class。 C++可以使用struct和class,並且C++中與C中的struct不一樣,它更像class。 用struct實現資料結構,class用於物件。 線性表:由同類型

數據結構學習筆記 線性的順序存儲和鏈式存儲

出錯 初始化 node != test span 輸入 des val 線性表:由同類型數據元素構成有序序列的線性結構  --》表中元素的個數稱為線性表的長度  --》沒有元素時,成為空表  --》表起始位置稱表頭,表結束位置稱表尾 順序存儲:    1 package

線性結構----單鏈

  單鏈表:     通過class建立物件,為物件給予特殊屬性成為節點,多個節點形成連結串列     1 public class Node { 2 3 //節點內容 4 int data; 5 //下一個節點 6 No

資料結構概述、線性

資料結構 本文大部分內容整理自程傑老師的《大話資料結構》 一、資料結構概述 分類: ①邏輯結構:面向問題的結構,主要是思維上的認知 1.集合結構 唯一的關係是大家都在一個集合內 2.線性結構 一對一 3.樹形結構 一對多 4.圖

數據結構

形式 時間 資源 結構 實現 線性 插入 一個數 簡單 一、表的常見操作 對於一個鏈表,某個元素有其前驅和後繼。對表的操作:find返回關鍵字首次出現的位置;insert和delete插入和刪除某個元素;findkth返回某個位置上的元素;二、表的簡單數組實現 定