線性表(Linear List)是由同一類型元素構成的有序序列的線性結構。線性表中元素的個數稱爲線性表的長度;線性表內沒有元素(長度爲0)時,稱爲空表;表的起始位置稱爲表頭,表的結束位置稱爲表尾。數組
線性表的抽象數據類型描述爲:spa
類型名稱:線性表(List)設計
數據對象集:線性表是由n個元素構成的有序序列(a1到an),其中a1是表的第一個元素(表頭),an是表的最後一個元素(表尾)。ai+1稱爲ai的直接後繼,ai稱爲ai+1的直接前驅,直接後繼和直接前驅反映了元素之間一對一的鄰接邏輯關係。指針
操做集:對於一個具體的線性表L,其內部有表示位序的整數i以及和其對應的元素x。code
線性表的順序存儲是指在內存中用地址連續的一塊存儲空間順序存放線性表的各元素。在程序設計語言中,一維數組在內存中佔用的存儲空間就是一組連續的存儲區域,所以,用一維數組來表示順序存儲的數據區域是再適合不過了。對象
考慮到線性表的操做有插入、刪除等,及表的長度是動態可變的,所以,數組的容量需設計得足夠大。假設用Data[MAXSIZE]表示,其中MAXSIZE是一個根據實際問題定義的足夠大的整數,線性表中的數據從Data[0]開始順序存放。因爲當前線性表中的實際元素可能未達到MAXSIZE多個,所以須要用一個變量Last來記錄當前線性表中最後一個元素在數組中的位置。即Last起一個指針(實際是數組下標)的做用,始終指向線性表的最後一個元素。表空時Last = -1。blog
以下圖所示,若當前表長爲Last +1,數據元素a0,a1......an分別存儲在Data[0]到Data[Last]之間。內存
typedef struct LNode* List; struct LNode { int Data[20]; int lastPosition;//最後一個元素下標值 };
//建立線性表並初始化爲空 List MakeEmpty() { List L; L = (List)malloc(sizeof(struct LNode));//申請內存空間 L->lastPosition = -1;//lastPosition置爲-1,說明表空 return L; }
//返回指定位置的元素值 int FindKth(List L, int P) { if (P > L->lastPosition) return -1; else return L->Data[P]; }
//尋找線性表中第一個X的下標 int Find(List L, int X) { for (int i = 0; i <= L->lastPosition+1; i++) { if (i == L->lastPosition+1) return -1;//未找到 else if (L->Data[i] == X) return i;//返回對應下標 } }
插入元素時,先將線性表長度向後擴展1個元素長,以後將要插入位置及其後面的全部元素均向後移動一位,空出位置後再將新元素插入。it
//在下標爲P的位置插入X bool Insert(List L, int P, int X) { if (L->lastPosition == 20 || P > L->lastPosition)//若是線性表已滿或所插位置不在線性表內,返回false return false; L->lastPosition++;//若能插入,線性表長度加1 //從P位置到最後,全部元素均向後移一位 for (int i = L->lastPosition; i > P; i--) { L->Data[i] = L->Data[i-1]; } L->Data[P] = X;//在空出的P位置插入新的元素 return true; }
將相應位置元素刪除後,原來在其後面的元素均向前移動一位,空出最後一個位置,最後將線性表長度減去1個元素長,刪去線性表空餘的位置。io
//刪除下標爲P的元素 bool Delete(List L, int P) { if (P > L->lastPosition)//若是所刪元素位置不在線性表內,返回false return false; //將位置P後的元素均向前移一位 for (int i = P; i < L->lastPosition; i++) { L->Data[i] = L->Data[i + 1]; } L->lastPosition--;//成功刪除原位置爲P的元素,線性表長度減1 return true; }
//返回線性表L長度 int Length(List L) { return L->lastPosition + 1; }