順序表
結點的概念
結點 :結點是內存中一片由用戶分配的儲存空間,只有一個地址來表示它的存在,沒有顯式名稱。
在學習順序表時,一般不會去特別強調結點的概念,此概念往往在鏈表學習中涉及,但並不代表結點與順序表無關,所以我特意把結點的概念放在此處以加深對順序表的理解。
順序表的概念
定義:把邏輯上相鄰的結點儲存在物理位置上的相鄰儲存單元中,結點的邏輯關系由儲存單元的鄰接關系來體現
通俗來講,順序表就是把線性表中的所有元素按照其邏輯順序,依次儲存到從指定的儲存位置開始的一塊連續的儲存空間中。
第一個元素的儲存位置就是指定的儲存位置,第 i+1 個元素的儲存位置在第 i 個元素后面
順序表的特性
- 占用連續的儲存空間:由定義可知順序表的儲存空間必然連續,並且存儲分配只能預先進行,一旦分配完畢,在操作過程中始終不變。
- 隨機訪問特性:因為儲存空間是連續的,知道第一個元素的地址(即儲存空間的首地址)可以輕松訪問儲存的所有數據。每一個結點對應一個序號,由該序號可以直接算出結點的儲存地址。
順序表三要素
- 順序表基地址
- 順序表長度
- 順序表總空間大小
順序表結構體定義
typedef struct _Sqlist Sqlist;
struct _Sqlist {
int *elems; //順序表基地址
int length; //順序表長度
int size; //順序表總空間大小
};
當然C語言提供了一種簡單的寫法(如下,以后以簡單寫法為例)。
typedef struct{
int *elems; //順序表基地址
int length; //順序表長度
int size; //順序表總空間大小
}Sqlist;
在某些書籍上,有這樣定義順序表的
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE]; //存放順序表元素的數組
int length; //存放順序表的長度
}Sqlist;
- 實際上這種定義已經為順序表開辟了一部分內存空間,而前者需要使用函數來順序表初始化。
- 但實際上兩種代碼本質上是一樣的,因為前者在順序表的操作——初始化順序表中的函數定義中,我們仍需要分配一片儲存空間並且定義一個存放順序表元素的數組;而后者相當於把這一步合並到了定義中。
- 在學習過程而非實際開發中,我更傾向於前者,因為這更能反應順序表的三要素,並且與鏈表代碼書寫風格相似,有利於感受線性表思想的共性。
結束
我們現在已經成功定義順序表了,但更重要的是它的操作,所以下一篇文章就來寫這部分內容。