順序 存儲
順序存儲定義:把邏輯上相鄰的數據元素存儲在物理上相鄰的存儲單元中的存儲結構。
順序表由於其存儲結構的特點,特別適合查找,更新,替換(其時間復雜度為O(1)),不適合頻繁插入和刪除(每一次插入和刪除的時間復雜度都是O(n))
順序表的優點:
存儲密度大(結點本身所占存儲量/結點結構所占存儲量)
可以隨機存取表中任一元素
順序表的缺點:
在插入、刪除某一元素時,需要移動大量元素
浪費存儲空間
屬於靜態存儲形式,數據元素的個數不能自由擴充
為克服着一缺點—->鏈表

1 ADT Sqlist{ 2 數據對象:D={是Elemset,Elemset的下標大於0} 3 數據關系:R1={一對一關系} 4 基本操作 5 6 //0.構造順序表類型 7 struct sqlist 8 9 //1.初始化順序表 10 Initialization(sqlist *L); 11 12 //2.刪除順序表 13 DestroyList(sqlist *L); 14 15 //3.清空順序表 16 ClearList(sqlist *L); 17 18 //4.返回順序表長度 19 ListLength(sqlist L); 20 21 //5.判斷順序表是否為空! 22 ListEmpty(sqlist L); 23 24 25 //6.插入數據 26 ListInsert(sqlist *L, int i, Book e); 27 28 //7.取值 29 GetElem(sqlist L,int i,Book *e); 30 31 //8.更新數據 32 UpdateList(sqlist *L,int i,Book e); 33 34 //9.查找 35 LocateElem(sqlist L, Book e); 36 37 //10.刪除數據 38 ListDelete(sqlist *L, int i, Book e); 39 40 //11.遍歷 41 TravelList(sqlist L); 42 }
實際應用 :圖書存儲
1.順序表因為是連續空間存儲,所以要提前設置表的最大長度

1 #define MAXSIZE 50 //最大長度 2 typedef struct{ //圖書結構,元素里面放(圖書SBIN號,名稱) 3 int id; 4 char name[50]; 5 }Book;
2.順序表類型

1 typedef struct{ 2 Book *elem; //存放基數地址 3 int length; //長度 4 }sqlist;
基本操作
1.初始化順序表

1 void Initialization(sqlist *L){ //初始化順序表 2 L->elem = (Book *)malloc(MAXSIZE*sizeof(Book)); //申請空間 3 if(!L->elem) 4 exit(-1); 5 L->length=0; 6 printf("初始化成功!\n"); 7 }
2.銷毀順序表 時間復雜度:O(1)

1 void DestroyList(sqlist *L){ //刪除順序表 2 free(L->elem); 3 L->length=0; 4 printf("順序表刪除成功!"); 5 }
3.清空順序表 時間復雜度:O(1)

1 void ClearList(sqlist *L){ //清空順序表 2 L->length=0; 3 }
4.返回順序表長度 時間復雜度:O(1)

1 int ListLength(sqlist L){ //返回順序表長度 2 return L.length; 3 }
5.判斷順序表是否為空 時間復雜度:O(1)

1 int ListEmpty(sqlist L){ //判斷順序表是否為空! 2 if(L.length==0) 3 return 1; 4 else 5 return 0; 6 }
6.插入數據 時間復雜度:O(n) 平均復雜度:n/2

1 void ListInsert(sqlist *L, int i, Book e){ //插入數據 2 if(i<1 || i>L->length+1){ 3 printf("插入位置不合理.\n"); 4 exit(-1); 5 } 6 if(L->length==MAXSIZE){ 7 printf("表已滿!"); 8 exit(-1); 9 } 10 int j; 11 for(j=L->length-1;j>=i-1;j--) 12 L->elem[j+1]=L->elem[j]; 13 L->elem[i-1]=e; 14 L->length++; 15 16 }
7.取值 時間復雜度:O(1)

1 int GetElem(sqlist L,int i,Book *e){//1<= i <=L.length 2 if (i<1 || i>L.length){ 3 printf("取值位置不正確。\n"); 4 return 0; 5 } 6 *e=L.elem[i-1]; 7 return 0; 8 }
8.更新 時間復雜度:O(1)

1 int UpdateList(sqlist *L,int i,Book e){ 2 if (i<1 || i>L->length){ 3 printf("更新位置不正確。\n"); 4 return 0; 5 } 6 L->elem[i-1]=e; 7 return 0; 8 }
9.查找 時間復雜度:O(n) 平均復雜度:n/2

1 int LocateElem(sqlist L, Book e){ //查找 2 int i,a=0; 3 for(i=0; i<L.length; i++){ 4 if(L.elem[i].id==e.id && strcmp(L.elem[i].name,e.name)==0){ 5 printf("找到值為{%d:%s}的元素,其位置為%d\n",e.id,e.name, i+1); 6 return 0; 7 } 8 } 9 printf("沒有找到元素!"); 10 return 0; 11 }
10.遍歷 時間復雜度:O(n)

1 void TravelList(sqlist L){ // 遍歷 2 int i; 3 for (i=0; i<L.length; i++){ 4 printf("第%d個元素為:%d,%s\n", i+1,L.elem[i].id,L.elem[i].name); 5 } 6 }
11.刪除 時間復雜度:O(n) 平均復雜度:n-1/2

1 void ListDelete(sqlist *L, int i, Book e){ //刪除數據 2 if(i<1 || i>L->length+1){ 3 printf("刪除位置不合理.\n"); 4 exit(-1); 5 } 6 if(L->length==MAXSIZE){ 7 printf("表已滿!"); 8 exit(-1); 9 } 10 int j; 11 for(j=i;j<L->length;j++) 12 L->elem[j-1]=L->elem[j]; 13 //L->elem[i-1]=e; 14 L->length--; 15 16 }
12.使用

1 int main(){ 2 sqlist a; 3 Book b={2,"xiaochunzhang"}; 4 Book c={3,"yuming"}; 5 Book d={4,"xiaoming"}; 6 Initialization(&a); 7 int i; 8 for(i=1;i<=5;i++){ 9 ListInsert(&a,i,b); 10 } 11 //DestroyList(&a); 12 ListInsert(&a,2,c); 13 //ListDelete(&a,2,c); 14 TravelList(a); 15 LocateElem(a,d); 16 return 0; 17 }