1、線性表的定義和特點
(1)定義:有n(n>=0)個數據特性相同的數據元素構成的有限序列稱爲線性表。
(2)特點:【1】存在唯一的被稱爲“第一個”的數據元素。
【2】存在唯一的被稱作“最後一個”的數據元素。
【3】除了第一個之外,其他的數據元素均只有一個前驅。
【4】除了最後一個外,結構中的每個元素均只有一個後繼。
2、線性表的抽象數據類型
ADT List{
數據對象:D={ai | ai∈ElemSet,i=1,2,。。。。n}
數據關係:R={ <ai-1, ai > | ai-1, ai∈D, i = 2, ..., n }
基本操作:
InitList ( &L )
操作結果:構造一個空的線性表 L 。 等
}ADT List
4、順序表
線性表的順序表示是指用一組地址連續的存儲單元依次存儲線性表中的數據元素,這種表示稱爲線性表的順序存儲結構或者順序映像。
稱這種存儲結構的線性表爲順序表。
順序表的特點:以物理位置相鄰表示邏輯關係。
順序表的優點:任意元素均隨機存取。
順序表的缺點:進行插入和刪除操作時,需要移動大量數據元素。
一般來說,順序表第i個元素ai的存儲位置爲:LOC(ai)=LOC(ai-1)+(i-1)*l;
通常用數組來描述數據結構中的順序存儲結構。
順序表的存儲結構:
#define MAXSIZE 100
typedef struct{
ElemType *elem;
int length;
}Sqlist;
順序表的初始化:
算法思想:(1)、爲順序表動態分配一個預定義大小的數組空間,使elem指向這段空間的的基地址。(2)、將標的當前長度設爲0;
構造一個空的順序表。
Status InitList_Sq(Sqlist &L){
L.elem=new ElemType[MAXSIZE];
if(!L.elem) exit(OVERFLOW);
L.length=0;
return OK;
}
查找:
查找可以包括兩種情況,一是給定元素的序號進行查找,二是根據給定的數據值進行查找。
對於前者,由於順序存儲結構的隨機存取的特點,可以直接通過數組下標定位得到。
算法思想:(1)從第一個元素起,依次和e比較。(2)若第i個元素等於e,則查找成功,返回鈣元素的位序i+1;
(3)若查遍整個順序表都沒有找到,則查找失敗,返回0;
int LocateElem_Sq(Sqlist L,ElemType e){
for(i=0;i<L.length;i++)
if(L.elem[i]==e) return i+1;
return 0;
}
查找算法的時間複雜度爲O(N);
插入:
線性表的插入運算是指在表的第 i (1 =< i =< n +1) 個位置上,
插入一個新結點 b,使長度爲 n 的線性表 (a1, …, ai –1, ai, …, an)
變成長度爲 n + 1 的線性表 (a1, …, ai –1, b, ai, …, an)
算法思想: 1)檢查 i 值是否超出所允許的範圍 (1 =< i =< n +1) ,若超出,
則進行“超出範圍”錯誤處理; 2)將線性表的第 i 個元素和它後面所有元素均後移一個位置; 3)將新元素寫入到空出的第 i 個位置上; 4)使線性表的長度增 1。
Status ListInsert_Sq(Sqlist &L,int i,ElemType e){
if(i<1||i>L.length +1)return ERROR;
if(L.length==MAXSIZE)return ERROR;
for(j=L.length-1;j>=i-1;j--)
{
L.elem[j+1]=L.elem[j];
}
L.elem[i-1]=e;
++L.length;
return OK;
}
插入算法的時間複雜度爲O(n);
刪除:
線性表的刪除運算是指將線性表的第 i (1 =< i =< n) 個結點
刪除,使長度爲 n 的線性表 (a1, …, ai –1, ai, ai +1, …, an)
變成長度爲 n -1 的線性表 (a1, …, ai –1, ai +1, …, an);
算法描述: 1) 檢查 i 值是否超出所允許的範圍 (1 i n),若超出,則進
行“超出範圍”錯誤處理; 2) 將線性表的第 i 個元素後面的所有元素均前移一個位置; 3) 使線性表的長度減 1。
Status ListDelete_Sq(SqList &L, int i, ElemType &e) {
if(i<1||i>L.length)return ERROR;
e=L.elem[i-1];
for(j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];
--L.length;
return OK;
}
刪除算法的時間複雜度爲O(N);