1. 程式人生 > 其它 >線性表的順序儲存

線性表的順序儲存

順序表的基本操作

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 }