數據結構-線性表(2)
線性表定義:
線性表是最基本、最簡單、也是最經常使用的一種數據結構。
線性表中數據元素之間的關系是一對一的關系,即除了第一個和最後一個數據元素之外,其他數據元素都是首尾相接的。
線性表的邏輯結構簡單,便於實現和操作。因此,線性表這樣的數據結構在實際應用中是廣泛採用的一種數據結構。
存儲空間是否連續:
一、順序表的特點是邏輯上相鄰的數據元素,物理存儲位置也相鄰。而且。順序表的存儲空間須要預先分配。
長處:
(1)方法簡單,各種高級語言中都有數組。easy實現。
(2)不用為表示節點間的邏輯關系而添加額外的存儲開銷。
(3)順序表具有按元素序號隨機訪問的特點。
缺點:
(1)在順序表中做插入、刪除操作時,平均移動表中的一半元素,因此對n較大的順序表效率低。
(2)須要預先分配足夠大的存儲空間,預計過大,可能會導致順序表後部大量閑置;預先分配過小。又會造成溢出。
二、在鏈表中邏輯上相鄰的數據元素,物理存儲位置不一定相鄰,它使用指針實現元素之間的邏輯關系。而且。鏈表的存儲空間是動態分配的。
長處:插入、刪除運算方便。
缺點:
(1)要占用額外的存儲空間存儲元素之間的關系,存儲密度減少。存儲密度是指一個節點中數據元素所占的存儲單元和整個節點所占的存儲單元之比。
(2)鏈表不是一種隨機存儲結構。不能隨機存取元素
鏈表的操作:
針對雙向鏈表來說,如圖:
刪除結點:
代碼:
p->prior->next=p->next;//p的前驅結點的後鏈指向p的後繼結點
p->next->prior=p->prior;//p後繼結點的前鏈指向P的前驅結點
Free(p)
插入結點:
代碼:
q->prior=p;//q的前鏈指向p
q->next=p->next;//q的後鏈指向p的後繼結點
p->next->prior=q;//p
p->next=q;//p的後鏈指向q
對於插入操作來說,要先連線再拆線!
並且前鏈和後鏈指向的均為數據域!
順序表與鏈表對照
棧,隊列,數組
棧是限制在表的一端進行插入和刪除的線性表。
同意插入、刪除的這一端稱為棧頂,還有一個固定端稱為棧底。
當表中沒有元素時稱為空棧。--先進後出
隊列(Queue)是限定僅僅能在表的一端進行插入和在還有一端進行刪除操作的線性表。--先進先出
循環隊列:
由來:
如圖:
假設數組的最大下標為5,元素J6已占用了該單元,假設還要有元素入隊列。則將超出數組的下標範圍,從而使將要入隊的新元素無法進入隊列,而此時數組中下標底端還有空位置,即數組的實際空間並沒有占滿。這樣的現象稱為“假溢出”。
若要插入新元素,應將隊列中現有元素向隊首方向移動,以便在隊尾騰出空間。
為了避免元素的移動。能夠將存儲隊列元素的一維數組首尾相接。形成一個環狀,這種隊列稱為循環隊列--克服假上溢
循環隊列如圖:
總結:
線性表依據存儲空間是否連續分為順序表和鏈表,棧和隊列都是特殊的線性表,它們二者的差別在於出棧的順序不同。
而數組是線性表的變化形式,一般在敲代碼時線性表都用數組來表示。它們都是軟件設計中經常使用的數據結構。能夠說,棧和隊列是操作受限的線性表。
數據結構-線性表(2)