黑馬程式設計師 學習筆記 資料結構 順序表

2021-07-04 08:25:56 字數 2649 閱讀 7495

一、儲存

線性表的順序儲存是指在記憶體中用位址連續的一塊儲存空間順序存放線性表的各元素,用這種儲存形式儲存的線性表稱其為順序表。因為記憶體中的位址空間是線性的,因此,用物理上的相鄰實現資料元素之間的邏輯相鄰關係是既簡單,又自然的。如圖2.1 所示。

設a1的儲存位址為loc(a1),每個資料元素佔d個儲存位址,則第i個資料元素的地為:

loc(ai)=loc(a1)+(i-1)*d 1<=i<=n

這就是說只要知道順序表首位址和每個資料元素所佔位址單元的個數就可求出第i個資料元素的位址來,這也是順序表具有按資料元素的序號隨機訪問的特點。

在程式語言中,一維陣列在記憶體中占用的儲存空間就是一組連續的儲存區域,因此,用一維陣列來表示順序表的資料儲存區域是再合適不過的。考慮到線性表的運算有插入、刪除等運算,即表長是可變的,因此,陣列的容量需設計的足夠大,設用:data[maxsize]來表示,其中maxsize是乙個根據實際問題定義的足夠大的整數,線性表中的資料從data[0] 開始依次順序存放,但當前線性表中的實際元素個數可能未達到maxsize多個,因此需用乙個變數last 記錄當前線性表中最後乙個元素在陣列中的位置,即last 起乙個指標的作用,始終指向線性表中最後乙個元素,因此,表空時last=-1。這種儲存思想的具體描述可以是多樣的。如可以是:

datatype data[maxsize];

int last;

這樣表示的順序表如圖2.1 所示。表長為last+1,資料元素分別存放在data[0]到data[last]中。這樣使用簡單方便,但有時不便管理。

從結構性上考慮,通常將data 和last 封裝成乙個結構作為順序表的型別:

typedef struct

seqlist;

定義乙個順序表:seqlist l ;

這樣表示的線性表如圖2.2(a) 所示。表長=l.last+1,線性表中的資料元素a1至an分別存放在l.data[0]至l.data[l.last]中。由於我們後面的演算法用c語言描述,根據c語言中的一些規則,有時定義乙個指向seqlist 型別的指標更為方便:

seqlist *l ;

l是乙個指標變數,線性表的儲存空間通過l=malloc(sizeof(seqlist)) 操作來獲得。l中存放的是順序表的位址,這樣表示的線性表如圖2.2(b)所示。表長表示為(*l).last或l->last+1,線性表的儲存區域為l->data ,線性表中資料元素的儲存空間為:

l->data[0] ~ l->data[l->last]。

在以後的演算法中多用這種方法表示,讀者在讀演算法時注意相關資料結構的型別說明。

二、基本運算

順序表的初始化即構造乙個空表,這對表是乙個加工型的運算,因此,將l設為指標引數,首先動態分配儲存空間,然後,將表中last 指標置為-1,表示表中沒有資料元素。演算法如下:

seqlist *init_seqlist( )

設呼叫函式為主函式,主函式對初始化函式的呼叫如下:

main()

演算法如下:

int insert_seqlist(seqlist *l,int i,datatype x)

/*表空間已滿,不能插入*/

if (i<1 || i>l->last+2) /*檢查插入位置的正確性*/

for(j=l->last;j>=i-1;j--)

l->data[j+1]=l->data[j]; /* 結點移動*/

l->data[i-1]=x; /*新元素插入*/

l->last++; /*last仍指向最後元素*/

return (1); /*插入成功,返回*/

}演算法如下:

int delete_seqlist(seqlist *l;int i)

for(j=i;j<=l->last;j++)

l->data[j-1]=l->data[j]; /*向上移動*/

l->last--;

return(1); /*刪除成功*/

}演算法如下:

int location_seqlist(seqlist *l, datatype x)

三、單鏈表

存放資料元素資訊的稱為資料域,存放其後繼位址的稱為指標域。因此n個元素的線性表通過每個結點的指標域拉成了乙個「鍊子」,稱之為鍊錶。因為每個結點中只有乙個指向後繼的指標,所以稱其為單鏈表。

鍊錶是由乙個個結點構成的,結點定義如下:

typedef struct node

lnode,*linklist;

定義頭指標變數:

對兩個單迴圈鍊錶h1 、h2 的連線操作,是將h2 的第乙個資料結點接到h1 的尾結點,如用頭指標標識,則需要找到第乙個鍊錶的尾結點,其時間複雜性為o(n),而鍊錶若用尾指標r1 、r2 來標識,則時間效能為o(1)。操作如下:

p= r1 –>next; /*儲存r1 的頭結點指標*/

r1->next=r2->next->next; /*頭尾連線*/

free(r2->next); /*釋放第二個表的頭結點*/

r2->next=p; /*組成迴圈鍊錶*/

這一過程可見圖2.17。

黑馬程式設計師 學習筆記 資料結構 概念

資料結構與數學 計算機硬體和軟體有十分密切的關係。資料結構是介於數學 計算機硬體和計算機軟體之間的一門電腦科學與技術專業的核心課程,是高階程式語言 編譯原理 作業系統 資料庫 人工智慧等課程的基礎。同時,資料結構技術也廣泛應用於資訊科學 系統工程 應用數學以及各種工程技術領域。資料結構課程集中討論軟...

黑馬程式設計師 學習筆記 資料結構 棧與佇列

一 棧 棧是限制在表的一端進行插入和刪除的線性表。允許插入 刪除的這一端稱為棧頂,另乙個固定端稱為棧底。當表中沒有元素時稱為空棧。如圖3.1.1 所示棧中有三個元素,進棧的順序是a1 a2 a3,當需要出棧時其順序為a3 a2 a1,所以棧又稱為後進先出的線性表 last in first out ...

黑馬程式設計師 學習筆記

windows phone 7手機開發 net培訓 期待與您交流!filestream sqlconnection實現了idispose介面,用完需要被釋放掉 using sqlconnection conn new sqlconnection 用完被釋放掉了 當close後還可以再進行open,物...