1.1 線性表的順序存儲
1.1.0 緒論
預定義常量和類型
1 #define TRUE 1; 2 #define FALSE 0; 3 #define MAXSIZE 100; 4 #define OK 1; 5 #define ERROR 0;
1.1.1 順序表
順序存儲是指在內存中用一塊地址連續的存儲空間按順序存儲線性表的各個數據元素。采用順序存儲結構的線性表成為“順序表”。
設第一個元素存放地址為LOC(a1),每個元素占用的空間大小為d個字節,則元素ai的存放地址為:
LOC(ai)=LOC(a1)+d*(i-1)
只要確定了存儲線性表的起始位置,線性表中任意元素都可隨機存儲,既線性表示一種可隨機存儲結構。
常用一維數組來描述順序表的數據存儲,表長可變,為了運算方便,用整型變量length記錄當前線性表中元素的個數,線性順序表的順序存儲結構可描述如下:
1 #include<stdio.h> 2 #define MAXSIZE<線性表可能達到的最大長度> 3 typedef int MlemType: 4 typedef struct{ 5 ElemType elem[MAXSIZE]; 6 int length;//線性表長度 7 };
定義一個順序表:
SeqList *L;
順序表的長度為 L->Length,數據元素是 L->elem[1] ~ L->elem[length]
1.1.2 順序表的基本運算
順序表的初始化既構造一個空表,將表長length設為0,表示表中沒有數據。
1 //順序表的初始化 2 void Init_SeqList(SeqList *L){ 3 L->length=0; 4 }
調用方法:
Init_SeqList(&L)
順序表的插入操作如下:
- 將an ~ ai按從后向前的順序向下移動,為新元素讓出位置。
- x置入空出的第i個位置
- 修改表長
1 //順序表的插入 2 int Insert_SeqList(SeqList *L,int i,ElemType x){ 3 int j; 4 if(L->length==MAXSIZE-1){ 5 printf("表滿"); 6 return OVERFLOW; 7 } 8 if(i<i||L->Length<i){ 9 printf("位置滿"); 10 return ERROR; 11 } 12 for(j=L->length;j>=i;j--) 13 L->elem[j+1] = L->elem[j]; 14 L->elem[i] = x; 15 L->length++; 16 return TRUE; 17 }
順序表的刪除
- 將a i+1 ~a n 依次向上移動
- 將length值減一
1 //順序表的刪除 2 int Delete_SeqList(SeqList *L,int i,ElemType *e){ 3 int j; 4 if(i<1||i>L->Length){ 5 printf("不存在第i個元素"); 6 return ERROR; 7 } 8 *e = L->elem[i]; 9 for(j=i;j<=L->Length;j++) 10 L->elem[j] = L->elem[j+1]; 11 L->length--; 12 return TRUE; 13 }
順序表中按值查找
1 //順序表的按值查找 2 int Location_SeqList(SeqList *L,ElemType x){ 3 int i=1; 4 while(i<=L-Length&&L->elem[i]!=x){ 5 i++; 6 } 7 if(i>L->length) return FALISE; 8 else return i; 9 }
練習題
有兩個順序表A和B,其元素均按從小到大順序排序,編寫一個算法,將它們合並成一個順序表,要求元素表C中的元素也按升序排序。
1 //順序表的按值查找 2 void merge(SeqList *A,SeqList *B,SeqList *C){ 3 int i=1,j=1,k=1; 4 while(i<=A-Length&&j<B->Length){ 5 if(A->elem[i]<B->elem[j]){ 6 C->elem[k++] = A->elem[i++]; 7 } 8 else C->elem[k++] = B->elem[j++]; 9 } 10 while(<=A->length){ 11 C->elem[k++]=A->elem[i++]; 12 } 13 while(j<=B->length){ 14 C->elem[k++]=B->elem[j++]; 15 } 16 C->length = A->length+B->length; 17 }