資料結構複習二 線性表

2021-10-01 21:57:24 字數 4163 閱讀 5076

寫在前面:考完離散就剩兩天覆習資料結構,還有七章,我可能要沒了……衝衝衝!

定義是:由n(>=0)個資料特性相同的元素構成的有限序列n=0時為空表

非空線性結構的特點:

1、「第乙個」元素唯一

2、「最後乙個」元素唯一

3、除第乙個之外,資料結構中的每個資料元素均只有乙個前驅

4、除最後乙個之外,每個資料元素均只有乙個後繼

定義不再詳述,顧名思義。儲存結構有隨機訪問的特點。

用動態分配的一維陣列表示順序表(一般表示),**如下:

typedef structsqlist;
用動態分配的一維陣列表示順序表(以一元多項式的順序儲存結構為例),**如下:

typedef structpolynomial;

typedef structsqlist;

**實現:

l.elem=new elemtype[maxn];       //為順序表分配乙個大小為maxn的空間

if(!l.elem) exit(overflow); //儲存分配失敗退出

特別注意程式執行失敗的出口!演算法步驟:判斷指定位置序號i值是否合理,若i值合理,則將對應資料元素l.elem[i-1]賦給引數e,通過e返回第i個資料元素的值,否則返回error。

注意演算法步驟的邏輯!先判斷後執行

**不再給出。

時間複雜度顯然是o(1)。

查詢的演算法會在以後的內容專門作為一部分詳細說明,這裡的查詢只有順序遍歷,時間複雜度為o(n)。

演算法步驟:

1、判斷位置i是否合法

2、判斷順序表儲存空間是否合法

3、將n至第i個元素依次向後移動乙個位置,空出第i個位置

4、將要插入的新元素e放入第i個位置

5、length++

同樣注意演算法的邏輯!

**不再給出,下面進行時間複雜度分析:

在第i個元素之前插入的概率是

那麼在長度為n的線性表中插入乙個元素時所需移動元素次數的期望值是:

由此可見平均時間複雜度為o(n)。

演算法步驟:

1、判斷刪除位置i是否合法

2、將第i+1個至第n個位置的元素依次向前移動乙個位置

3、length--

時間複雜度分析同上:

即線性表的鏈式儲存結構,特點是用一組任意的儲存單元儲存線性表的資料元素(連續或不連續)

儲存內容包括本身的資訊以及直接後繼的儲存位置,分別稱為資料域指標域

根據鍊錶結點所含指標個數、指標指向和指標連線方式,可將鍊錶分為單鏈表、迴圈鍊錶、雙向鍊錶、二叉鍊錶、十字鍊錶、鄰接表、鄰接多重表等。

頭結點可加可不加,增加後操作較為便利。

單鏈錶可由頭指標唯一確定,非隨機訪問,儲存結構**如下:

typedef struct lnodelnode,*linklist;               //linklist為lnode的指標型別,定義時lnode *p與linklist p完全相同
l=new lnode;                //生成新結點作為i頭節點,用頭指標l指向頭結點

l->next=null; //頭結點指標域置空

p=p->next遍歷操作,比較簡單,不再詳述。

平均查詢長度

時間複雜度為o(n)。

也是遍歷,時間複雜度同上

也比較簡單,主要是找到位置,建立新結點並插入,關鍵**:

s->next=p->next;        //兩個p->next可分別理解為乙個有值的結點

p->next=s; //一片待賦值的空間

主要**:

q=p->next;

p->next=q->next; //將待刪除結點的前驅結點的後繼指向待刪除結點的後繼

delete q;

這裡是個小小的重點

前插法建立單鏈表

演算法步驟:

1、建立乙個只有頭結點的空鍊錶

2、根據帶建立鍊錶包括的元素個數n,迴圈n次執行以下操作:

(1)生成乙個新結點*p

(2)輸入元素值賦給新結點*p的資料域

(3)將新結點*p插入到頭結點之後

**實現:

void createlist_h(linklist &l, int n)

}

時間複雜度顯然為o(n)。

這裡每次從頭插入元素,所得鍊錶順序為原陣列逆序,所以實際寫**時一般用後插法

後插法建立單鏈表

演算法步驟:

1、建立乙個只有頭結點的空鍊錶

2、尾指標r初始化,指向頭結點

3、根據建立鍊錶包括的元素個數n,迴圈n次執行以下操作

(1)生成乙個新結點*p

(2)輸入元素值賦給新結點*p的資料域

(3)將新結點*p插入到尾結點*r之後

(4)尾指標指向新的尾結點*p

**實現:

void createlist_r(linklist &l, int n)

}

這裡如果把r看成乙個外部的東西會很難理解,就直接看成當前指標吧,比如剛開始時就把r看作跟l一樣的東西(實際上**裡也是這麼表現的),後面的r就是每一步的p。

時間複雜度也是n。

特點是表中最後乙個結點的指標域指向頭結點,整個鍊錶形成乙個環。

判斷當前指標是否指向表為結點的終止條件由p!=null或p->next!=null變為p!=l或p->next!=l。

有時迴圈鍊錶中只設立尾指標,這樣會簡化鍊錶的合併操作。

結點中由兩個指標域,乙個指向直接後繼,另乙個指向直接前驅

儲存結構:

typedef struct dulnodedulnode,*dulinklist;
雙向鍊錶的插入、刪除操作涉及兩個方向上的指標,與單鏈表有很大不同,其他操作與單鏈表沒有什麼不同

雙向鍊錶的插入,主要**:

s->prior=p->prior;

p->prior->next=s;

s->next=p;

p->prior=s;

刪除要簡單一些:

p->prior->next=p->next;

p->next->prior=p->prior;

兩者時間複雜度均為o(n)。

基於儲存空間的分配以及儲存密度的大小,當線性表的長度變化比較大,難以預估儲存規模時,宜採用鍊錶作為儲存結構

反之,當線性表長度變化不大,易於事先確定大小時,為了節約儲存空間,宜採用順序表作為儲存結構

附:儲存密度=資料元素本身占用的儲存量/結點結構占用的儲存量

基於訪問元素的效率以及插入和刪除操作的效率,若先行表的主要操作是和元素位置緊密相關的這類取值操作,很少做插入或刪除操作時,宜採用順序表作為儲存結構

反之,對於頻繁進行插入或刪除操作的先行表,宜採用鍊錶作為儲存結構

目錄

什麼是線性表

順序表順序表中基本操作的實現

1、初始化

2、取值

3、查詢

4、插入

5、刪除 鍊錶

單鏈表的定義及表示

單鏈表基本操作的實現

1、初始化

2、取值

3、查詢

4、插入

5、刪除

6、建立單鏈表

迴圈鍊錶

雙向鍊錶

順序表和煉表的比較

1、空間效能的比較

2、時間效能的比較

資料結構(二) 線性表

線性表是最簡單最常用的資料結構,是一種典型的線性儲存結構。定義 線性表是由n n 0 個資料元素 結點 a1 a 2 an 組成的有限序列。n為表的長度。當n 0,為 空表 n 0時,為 a1,a 2,an 邏輯特徵 非空的線性表只有乙個頭結點,也只有乙個終結點,頭結點只有乙個直接後繼結點,而沒有直...

資料結構複習(二)線性表(1)順序表

0.1 線性表定義 具有相同資料型別的n個資料元素的有限序列 一般表示為l a1,a2,a3 an 注意點 儲存資料型別都是相同的 是有限的 是乙個序列,即儲存的內容是有次序的 0.2前驅與後繼 除第乙個元素 表頭元素 外,每個元素都有且僅有乙個前驅。除最後乙個元素 表尾元素 外,每隔元素都有且僅有...

資料結構複習(二)線性表(2)單鏈表

單鏈表定義 實現typedef struct lnodelnode,linklist 優缺點 初始化不帶頭結點 帶頭結點 bool initlist linklist l 帶頭結點頭結點不儲存元素,頭結點之後的結點才開始儲存元素 bool initlist linklist l l next nul...