線性表是n個資料元素的有限序列。表中的元素是乙個挨著乙個放的。表中有乙個開始的節點,有乙個結束的節點,並且中間的每乙個節點有且只有乙個前驅和後繼。
線性表的抽象資料型別的定義如下:
data:
線性表中的每資料物件集合,每個資料元素的型別均為datatype(自己定義的,可以是基本型別,也可以是複雜的型別)。其中,除了第乙個元素a1
外,每乙個元素都有且只有乙個直接前驅元素,除了最後乙個元素an
線性表的儲存結構,指的是用一段位址連續的儲存單元依次儲存線性表的資料元素。
當然對於現在的高階語言來說也就是陣列了。一般來說,陣列的零號位置不儲存,會有其它用途。
線性表的順序儲存的描述為:
#include
#define maxsize 100 // 儲存空間的分配
typedef
int elemtype; // 可以根據實際需要定義
typedef
struct sqlist;
在這之前有一些定義
#include
#define maxsize 100 // 儲存空間的分配
#define true 1
#define false 0
#define error 0
typedef int elemtype; // 可以根據實際需要定義
typedef struct sqlist;
對於初始化操作來講是很簡單的,就是順序表中的長度制為0。
void initlist(sqlist *l)
順序表的插入指的是在第i個位置插入乙個值為x的新元素,當然在插入後表的長度也就要+1了。如果是在表的最後乙個新增還比較簡單,但是插在表中間的某個位置是,就以為著表的後面的元素全部要移動,就像在食堂排隊買飯,突然有乙個人插隊,假如插在了第二個位置,那麼久意味著後面的人全部要後移。(所以,不提倡插隊)。
插入演算法的設計思路如下:
+ 如果插入的位置不合理,則返回error
+ 如果線性表的長度大於登入陣列長度,則返回error,或者動態增加長度。當然一般是返回error。
+ 從最後乙個向前遍歷到底i個位置,分別將他們向後移動乙個位置
+ 將要插入的元素插在位置i出。
+ 表的長度+1
// 插入操作
// 插入操作
int listinsert(sqlist *l, int i, elemtype x)
// 如果i不在資料元素所在的範圍,返回error
// length+1的原因是可能插入的位置是表尾
if (i < 1 || i > l->length + 1)
// 如果不在表尾
if (i < l->length)
}l->data[i] = x;
l->length++;
return true;
}
刪除操作:就是將順序表中的某乙個元素刪除掉。
刪除就好比現在在食堂排隊買飯,突然隊伍中的某個人不想吃這個飯了,然後離開了,那麼後面的人全部就得向前移動,將哪個位置補上。
刪除演算法的設計思路:
+ 如果刪除位置不對,返回error
+ 將元素取出
+ 然後從刪除的位置開始到最有乙個元素,分別將它們向前移動乙個位置。
+ 表的長度減1
// 刪除操作
int listdelete(sqlist *l, int i, elemtype *e)
l->length--;
return true;
}
順序表的查詢就是遍歷整個序列整個序列來對比查詢。
如果沒找到返回false,找到了返回true
int locationelem(sqlist l,elemtype x)
return false;
}
順序表的其他操作可以通過可以直接或者間接的實現,比如線性表的長度,可以直接通過l.length得知。
缺點:插入、刪除時需要進行大量的資料交換,時間複雜度高。
優點:可以直接獲得到某個位置上的元素,查詢時方便。
原始碼鏈結
線性表之順序表
資料結構草草學過,不過沒有認真運用過。雖然知道一些最為基本的抽象型別及一些常用操作,不過叫我把這些基本的演算法寫出來我也 是寫不出來的。因為常說資料結構 演算法是乙個程式設計師最基本的素質,所以這次認真加以複習。在複習的同時我盡量將自己學習的其他的 一些基本知識比如c 中的物件導向思想也引入進來,同...
線性表之順序表
線性表 我們都知道是一種常用的資料結構,也是歷來各種考試的重點。今天抽了一些時間把線性表做了總結。線性表是n個資料元素的乙個有限序列。用公式表示為 l a1,a2,a3,a4,an 因為線性表是乙個有限的序列,所以也如上面公式所示,它的各個元素是相繼排放的。那麼它的每個相連的兩項之間都是有乙個邏輯關...
線性表之順序表
線性表的操作 initlist l 初始化操作,建立乙個空的線性表l。listempty l 判斷線性表是否為空表,空返回true,否則返回false。clearlist l 將線性表清空。getelem l,i,e 將線性表l中的第i個位置元素值返回給e。listdelete l,i,e 刪除線性...