參考書籍:嚴蔚敏《數據結構》 清華大學出版社
數據:所有能輸入計算機的符號總稱,如圖像、聲音均可通過編碼而歸之於數據的範疇
數據元素:數據的基本單位,如圖中的一個○
數據項:一個數據元素可由若干個數據項組成,如一本書的數目爲一個數據元素,而數目中的每一項爲一個數據項。數據項是不可分的最小單位
數據對象:性質相同的數據元素的集合,數據的一個子集
數據結構:數據元素之間的相互關係。也即邏輯結構
物理結構(存儲結構):數據結構在計算機中的表示(又稱映像),分爲順序映像(順序存儲結構)和非順序映像(鏈式存儲結構)
鏈表:
ai的後繼元素爲ai+1,爲了表示兩者的邏輯關係,對數據元素ai來說,不僅要存儲其本身的信息,還要存儲其後繼元素ai+1的信息,即需要存儲ai+1的存儲位置,這兩部分信息組成數據元素ai的存儲映像,成爲結點(node),它包含兩個域——數據域和指針域,指針域中存儲的信息稱爲指針或鏈。n個結點鏈結成一個鏈表。
----------線性鏈表的單鏈表(單向)存儲結構------------
struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList
ps: ADT(abstract data type,抽象數據類型)是指一個數學模型以及定義在該模型上的一組操作。抽象數據類型與數據類型實際上是一個概念,如整形int ,棧stack.
棧(Stack):後進先出(LIFO)的線性表。
ADT Stack的基本操作Stack->InitStack(&S)........Push(&S,e) Pop(&S,&e)
棧中元素按照a1,a2...an順序進棧,表尾端稱爲棧頂(an爲棧頂元素),表頭端稱爲棧底(a1爲棧底元素)。
由於棧在使用過程中所需最大空間的大小很難估計,因此,在初始化設空棧時不應限定棧的最大容量。一個較合理的做法是:先爲棧分配一個基本容量,然後在應用過程中,當棧的空間不夠使用時再逐段擴大。爲此,可設兩個常量:STACK_INIT_SIZE(存儲空間的初始分配量)和STACKINCREMENT(存儲空間分配增量)—應用實例見p47.
//---------------棧的順序存儲表示--------
struct {
ElemType *base;//棧底指針
ElemType *top;//站頂指針
int stacksize;//當前已分配的存儲空間,以元素爲單位
}SqStack;
隊列(queue):先進先出(FIFO)的線性表。
只允許在表的一端(隊尾rear)插入元素,在另一端(對頭front)刪除元素。
隊列在程序設計中經常出現,最典型的例子是操作系統中的作業排隊。
用鏈表表示的
------單鏈隊列---隊列的鏈式存儲結構---------
struct QueueNode{
ElemType data;
struct QueueNode *next;
}QueueNode, *QueuePtr;
typedef struct{
QueuePtr front;//隊頭指針
QueuePtr rear;//隊尾指針
}LinkQueue;
循環隊列
出現原因:從隊頭取出元素,從隊尾添加元素,加入當前爲隊列分配的最大空間爲6,有可能到一定時間段,隊頭前面有一段空的內存,而隊尾又不能再繼續插入新的隊尾元素。另外,此時又不能如順序棧那樣,進行存儲再分配擴大數組空間,因爲隊列的實際可用空間並沒有滿。因此,可將順序隊列臆造爲一個環狀空間,成爲“循環隊列”。
在C語言中不能用動態分配的一維數組來實現循環隊列。如果應用程序中設有循環隊列,則必須爲它設定一個最大隊列長度,若無法估計隊列最大長度,則宜採用鏈隊列。
//---------循環隊列——隊列的順序存儲結構---------
#define MAXQSIZE 100 //最大隊列長度
typedef struct{
ElemType *base; //初始化的動態分配存儲空間
int front;//頭指針
int rear;//尾指針
}SqQueue;