數據結構:鏈表和隊列

參考書籍:嚴蔚敏《數據結構》 清華大學出版社

數據:所有能輸入計算機的符號總稱,如圖像、聲音均可通過編碼而歸之於數據的範疇

數據元素:數據的基本單位,如圖中的一個○

數據項:一個數據元素可由若干個數據項組成,如一本書的數目爲一個數據元素,而數目中的每一項爲一個數據項。數據項是不可分的最小單位

數據對象:性質相同的數據元素的集合,數據的一個子集

數據結構:數據元素之間的相互關係。也即邏輯結構

物理結構(存儲結構):數據結構在計算機中的表示(又稱映像),分爲順序映像(順序存儲結構)和非順序映像(鏈式存儲結構)


鏈表:

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;


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