讀《數據結構(C語言版)》(4)

從本節開始討論線性表,這次先討論線性表的順序實現。

一提到線性表,我們腦子很可能會出現數組、鏈表這樣的概念。沒錯,數組和鏈表都是線性表,但它們只是線性表的兩種實現,強調的是線性表的物理結構。我們研究一個數據結構時,一般先從它的邏輯結構入手,等研究清楚了邏輯結構再考慮具體的物理實現。在寫程序時,思路也是一樣的,先要分清哪些問題是邏輯的,哪些問題是物理的,先邏輯後物理是計算機解題的一般步驟。如果開始不想清楚邏輯,而一頭扎到物理細節中,就容易理不清思路或者作出有缺陷的設計。當然這不是絕對的,很多情況下物理結構也會影響邏輯結構的設計。

簡單來說,一個線性表是n個相同特性的數據元素的有限序列。這裏“n個相同特性的數據元素”指的是數據對象,“序列”指的是數據關係,每個數據元素都有一個確定的位置。從數據對象和數據關係入手,就很容易看清一個數據結構的本質。就線性表來說,只要某些數據存在次序關係,並且各個元素特性相同,就可以認爲是一個線性表。

下面我們來考慮線性表的順序實現。在很多人包括我自己的眼裏,線性表的順序實現已經和數組畫上了等號。雖然用數組實現線性表的順序存儲結構天經地義,但不應該把順序實現侷限在數組上。如果有一天你必須用彙編語言實現一個順序存儲的線性表,沒有了數組你豈不是哭了。如作者所說,線性表的順序表示指的是用一組地址連續的存儲單元依次存儲線性表的數據元素。用C語言實現時,由於線性表的長度可變,且所需最大存儲空間隨問題不同而不同,所以通常用動態分配的一維數組來實現。

#define LIST_INIT_SIZE 100  // 初始長度
#define LISTINCREMENT  10   // 分配增量

typedef struct {
    ElemType *elem;         // 存儲基址
    int length;             // 當前長度
    int listsize;           // 存儲容量
} SqList;

用上述結構在分配存儲空間時,初始分配可以用malloc,空間不夠再分配時可以用realloc,這個函數保證在原分配基礎上擴大容量時不影響其內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章