第三章 線性表:零個或多個數據元素的有限序列。
線性表特點:(1)序列:元素之間有順序;(2)第一個無前驅;(3)最後一個無後繼;(4)其餘每個都有且只有一個前驅和後繼。(5)有限。
線性表的操作:(1)置空操作(2)查找操作(3)獲得線性表長度(4)插入和刪除操作
ADT List
Data
Operation
InitList (* L); //初始化操作,建立一個空的線性表
ListEmpty( L ); //判空操作,若線性表爲空,返回true,否則,返回false。
ClearList (*L); //將線性表清空
GetElem(L,i,*e); //將線性表L中的第i個位置元素值返回給e
LocateElem(L,e); //在線性表L中查找與給定值e相等的元素,如果查找成功,返回該元素在表中的序號;否則,返回0表示失敗。
ListInsert(*L,i,e); //在線性表L中的第i個位置插入新元素e
ListDelete(*L,i,*e); //刪除線性表L中第i個位置元素,並用e返回其值
ListLength(L); //返回線性表L的元素個數
集合A和集合B的並集運算:
void union(List *La,List Lb)
{
int La_len,Lb_len,i;
La_len=ListLength(La);
Lb_len=ListLength(Lb);
ElemType e;
for( i=1; i<=Lb_len;i++ )
{
GetElem(Lb,i,e);
if(!LocateElem(La,e,equal) )
ListInsert(La,++La_len,e);
}
}
線性表的順序存儲結構:指的是一段地址連續的存儲單元依次存儲線性表的數據元素。
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int length;
} SqList;在任意時刻,線性表的長度應小於等於數組的長度。注意區分線性表的長度和數組的長度。
GetElem,ListInsert,ListDelete函數的實現
線性表順序存儲的優缺點:
優點:
1)無需爲表示表中元素之間的邏輯關係而增加額外的存儲空間;
2)可以快速存取表中任一位置的元素。
缺點:
1)插入和刪除操作需要移動大量元素
2)當線性表長度變化較大時,難以確定存儲空間的容量;
3)造成存儲空間的“碎片”
線性表的鏈式存儲結構:
數據域和指針域
頭指針和頭結點的異同:
(1)頭指針:是指鏈表指向第一個結點的指針,若鏈表有頭結點,則是指向頭結點的指針。頭指針具有標識作用,所以常用頭指針冠以鏈表的名字。無論鏈表是否爲空,頭指針均不爲空,頭指針是鏈表的必要元素。
(2)頭結點:是爲了操作的統一和方便而設立的,放在第一元素的結點之前,其數據域一般無意義(也可存放鏈表的長度)。有了頭結點,對在第一元素結點前插入結點和刪除第一結點,其操作與其他結點的操作就統一了。頭結點不一定是鏈表的必須元素。
typedef struct Node
{
ElemType data;
struct Node *next;
} Node;
typedef struct Node *LinkList;
GetElem,ListInsert,ListDelete函數的實現
void CreateListTail(LinkList *L,int n) :尾插法
void CreateListHead(LinkList *L,int n) :頭插法
單鏈表結構與順序存儲結構優缺點:
(一)存儲分配方式:
順序存儲結構用一段連續的存儲單元依次存儲線性表的數據元素;單鏈表採用鏈式存儲結構,用一組任意的存儲單元存放線性表的元素
(二)時間性能:
查找:
順序結構O(1)
單鏈表O(n)
插入和刪除:
順序存儲結構需要平均移動表長一半的元素,時間爲O(n)
單鏈表在給出某位置的指針之後,插入和刪除的時間僅爲O(1)
(三)空間性能:
順序存儲結構需要預先分配存儲空間,分大了浪費;分小了容易上溢。
單鏈表不需要分配存儲空間,只要有就可以分配,元素個數也不受限制。
經驗性的結論:(1)若需頻繁查找,且很少插入和刪除,則宜使用順序存儲結構。(2)若需頻繁插入和刪除,宜使用單鏈表結構。(3)當線性表中的元素個數變化較大或者根本不知道有多大時,最好用單鏈表結構。(4)若事先知道線性表的大小,則考慮使用順序存儲結構。
靜態鏈表,也叫遊標實現法,它使用數組來描述單鏈表,其中,數組的元素由兩個數據域組成:數據(data)+遊標(cur)
通常會將數組建的大一些,以便有一些空閒空間可以便於插入時不至於溢出。
#define MAXSIZE
typedef struct{
ElemType data;
int cur;
} Component,StaticLinkList[MAXSIZE];
另外,對數組的第一個元素和最後一個元素作爲特殊元素處理,不存數據。將爲被使用的數組元素成爲備用鏈表。其中,數組的第一個元素,即下標爲0的元素的cur就存放備用鏈表的第一個結點的下標;而數組的最後一個元素的cur則存放備用鏈表的第一個結點的下標,相當於單鏈表中頭結點的作用。
靜態鏈表的插入、刪除操作
靜態鏈表的優點:在插入和刪除操作時,只需要修改遊標,不需要移動元素,從而改進了在順序存儲結構中的插入和刪除操作需要移動大量元素的缺點。
靜態鏈表的缺點:沒有解決連續存儲分配帶來的表長難以確定的問題;失去了順序存儲結構隨機存取的特性。
循環鏈表
雙向鏈表