陣列作為存放同類資料的集合

2022-12-13 02:27:05 字數 2920 閱讀 4381

陣列作為存放同類資料的集合,給我們在程式設計時帶來很多的方便,增加了靈活性。但陣列也同樣存在一些弊病。如陣列的大小在定義時要事先規定,不能在程式中進行調整,這樣一來,在程式設計中針對不同問題有時需要3 0個大小的陣列,有時需要5 0個陣列的大小,

難於統一。我們只能夠根據可能的最大需求來定義陣列,經常會造成一定儲存空間的浪費。

我們希望構造動態的陣列,隨時可以調整陣列的大小,以滿足不同問題的需要。鍊錶就是我們需要的動態陣列。它是在程式的執行過程中根據需要有資料儲存就向系統要求申請儲存空間,決不構成對儲存區的浪費。

鍊錶是一種複雜的資料結構,其資料之間的相互關係使鍊錶分成三種:單鏈表、迴圈鍊錶、雙向鍊錶,下面將逐一介紹。

7.4.1 單鏈表

圖7 - 3是單鏈表的結構。

單鏈表有乙個頭節點h e a d,指向鍊錶在記憶體的首位址。鍊錶中的每乙個節點的資料型別為結構體型別,節點有兩個成員:整型成員(實際需要儲存的資料)和指向下乙個結構體型別節點的指標即下乙個節點的位址(事實上,此單鏈表是用於存放整型資料的動態陣列)。

鍊錶按此結構對各節點的訪問需從鍊錶的頭找起,後續節點的位址由當前節點給出。無論在表中訪問那乙個節點,都需要從鍊錶的頭開始,順序向後查詢。鍊錶的尾節點由於無後續節點,其指標域為空,寫作為n u l l。

圖7 - 3還給出這樣一層含義,鍊錶中的各節點在記憶體的儲存位址不是連續的,其各節點的位址是在需要時向系統申請分配的,系統根據記憶體的當前情況,既可以連續分配位址,也可以跳躍式分配位址。

看一下鍊錶節點的資料結構定義:

struct node

;在鍊錶節點的定義中,除乙個整型的成員外,成員p是指向與節點型別完全相同的指標。

在鍊錶節點的資料結構中,非常非凡的一點就是結構體內的指標域的資料型別使用了未定義成功的資料型別。這是在c中唯一規定可以先使用後定義的資料結構。

單鏈表的建立過程有以下幾步:

1 ) 定義鍊錶的資料結構。

2 ) 建立乙個空表。

3 ) 利用m a l l o c ( )函式向系統申請分配乙個節點。

4 ) 將新節點的指標成員賦值為空。若是空表,將新節點連線到表頭;若是非空表,將新

節點接到表尾。

5 ) 判定一下是否有後續節點要接入鍊錶,若有轉到3 ),否則結束。

單鏈表的輸出過程有以下幾步

1) 找到表頭。

2) 若是非空表,輸出節點的值成員,是空表則退出。

3 ) 跟蹤鍊錶的增長,即找到下乙個節點的位址。

4) 轉到2 )。

[例7-5] 建立乙個存放正整數(輸入- 9 9 9做結束標誌)的單鏈表,並列印輸出。

#include <> /包*含ma l l o c ( ) 的標頭檔案*/

#include <>

struct node /*鍊錶節點的結構* /

;m a i n ( )

struct node*creat(structnode*head)函/數*返回的是與節點相同型別的指標*/

return head;/*返回鍊錶的頭指標*/

}void print(struct node*head)輸/*出以head為頭的鍊錶各節點的值*/

}在鍊錶的建立過程中,鍊錶的頭指標是非常重要的引數。因為對鍊錶的輸出和查詢都要從鍊錶的頭開始,所以鍊錶建立成功後,要返回乙個煉表頭節點的位址,即頭指標。

7.4.2 單鏈表的插入與刪除

在鍊錶這種非凡的資料結構中,鍊錶的長短需要根據具體情況來設定,當需要儲存資料時向系統申請儲存空間,並將資料接入鍊錶中。對鍊錶而言,表中的資料可以依此接到表尾或鏈結到表頭,也可以視情況插入表中;對不再需要的資料,將其從表中刪除並釋放其所佔空間,但不能破壞鍊錶的結構。這就是下面將介紹的鍊錶的插入與刪除。

1. 鍊錶的刪除

在鍊錶中刪除乙個節點,用圖7 - 4描述如下:

[例7-6] 建立乙個學生學號及姓名的單鏈表,即節點包括學生學號、姓名及指向下乙個節點的指標,鍊錶按學生的學號排列。再從鍵盤輸入某一學生姓名,將其從鍊錶中刪除。

首先定義鍊錶的結構:

struct

從圖7 - 4中看到,從鍊錶中刪除乙個節點有三種情況,即刪除煉表頭節點、刪除鍊錶的中

間節點、刪除鍊錶的尾節點。題目給出的是學生姓名,則應在鍊錶中從頭到尾依此查詢各節

點,並與各節點的學生姓名比較,若相同,則查詢成功,否則,找不到節點。由於刪除的節

點可能在鍊錶的頭,會對鍊錶的頭指標造成丟失,所以定義刪除節點的函式的返回值定義為

返回結構體型別的指標。

struct node *delet(head,pstr)以/*he a d 為頭指標,刪除ps t r 所在節點*/

struct node *head;

char *pstr;

if(strcmp(temp->str,pstr)==0 ) / *找到字串* /

e l s e

}else printf("\nno find string!\n");沒/找* 到要刪除的字串*/

}r e t u r n ( h e a d ) ; / *返回表頭指標* /

}2. 鍊錶的插入

首先定義鍊錶的結構:

struct

;在建立的單鏈表中,插入節點有三種情況,如圖7 - 5所示。

插入的節點可以在表頭、表中或表尾。假定我們按照以學號為順序建立鍊錶,則插入的節點依次與表中節點相比較,找到插入位置。由於插入的節點可能在鍊錶的頭,會對鍊錶的頭指標造成修改,所以定義插入節點的函式的返回值定義為返回結構體型別的指標。

節點的插入函式如下:

struct node *insert(head,pstr,n) / *插入學號為n、姓名為p s t r 的節點* /

struct node *head; / *鍊錶的頭指標* /

char *pstr;

int n;

e l s e

if (n<=p2->num) / *找到插入位置* /

if (head==p2) / * 插入位置在表頭* /

資料結構實驗5陣列

一 實驗目的 深入研究陣列的儲存表示和實現技術,著重掌握對稀疏矩陣的表示方法及其運算的實現。二 問題描述 稀疏矩陣是指那些多數元素為零的矩陣。利用 稀疏 特點進行儲存和計算可以大大節省儲存空間,提高效率。通過對稀疏矩陣的儲存表示,實現矩陣的基本操作。3 演算法分析 矩陣可以通過二維陣列來實現儲存,而...

《資料結構》第5章陣列和廣義表

第 5 章陣列和廣義表 一 選擇題 1.設有乙個10階的對稱矩陣a,採用壓縮儲存方式,以行序為主儲存,a11為第一元素,其儲存位址為1,每個元素佔乙個位址空間,則a85的位址為 燕山大學 2001 一 2 2分 a.13b.33c.18d.40 2.有乙個二維陣列a 1 6,0 7 每個陣列元素用相...

EXCEL中如何讓不同型別資料用不同顏色顯示

在工資表中,如果想讓大於等於2000元的工資總額以 紅色 顯示,大於等於1500元的工資總額以 鮮綠色 顯示,低於1000元的工資總額以 藍色 顯示,其它以 黑色 顯示,我們可以這樣設定。1.開啟 工資表 工作簿,選中 工資總額 所在列 如圖一 執行 格式 條件格式 命令,開啟 條件格式 對話方塊。...