繼前面演算法的引入後,大家對什麼是演算法及其複雜度有了一定了解。資料元素儲存主要形式有順序儲存結構、鏈式儲存結構 。本節將介紹線性表及線性表的順序儲存。因內容過多,鏈式儲存將單獨寫在後一篇文章裡。
前一篇在介紹複雜度時,我們舉出了多項式的例子,從多項式例子中可得一些啟發。
多項式表示問題的啟示:
1.同乙個問題可以有不同的表示(儲存)方法
2.有一類共性問題:有序線性序列的組織和管理
(1)線性表定義:由 同型別資料元素 構成 有序序列 的線性結構 (空格為斷句)
(2)相關概念:
線性表長度:表中元素個數
空表:線性表沒有元素
表頭:表起始位置
表尾:表結束位置
型別名稱:線性表 list
資料物件集:線性表是 n(>=0)個元素構成的有序序列 (a1,a2,…,an)
資料集:線性表 l∈list,整數 i表示位置,元素 x∈elementtype(任意型別)
其他複雜操作:
1.排序——按元素值或某個資料項值的遞增或遞減次序重新排練表中各元素的位置
2.合併——將有序表la和lb合併為有序lc
3.複製——將表la複製為表lb
void
union
(list &la,list&lb)
}
順序儲存結構、鏈式儲存結構 (這裡只介紹順序儲存)
順序儲存結構 :將線性表中資料元素依次存放至計算機儲存空間中,位址連續(稱為順序分配)
即順序上相鄰的兩個資料元素在物理儲存空間中也相鄰
(a1,a2,…,an)順序儲存結構的一般形式
序號 儲存狀態 儲存位址
1 a1 b
2 a2 b+p
...i ai b+(i-1)*p
...n an b+(n-1)*p
//maxleng // 自由區
// b+(maxleng-1)*p
假設:線性表的首位址為b,每個資料元素佔p個儲存單元,則表中任意元素ai(1<=i<=n)的儲存位址是:
loc(i)=loc(1)+(i-1)*p
=b+(i-1)*p (1<=i<=n)
(1)eg1:分別定義元素所佔空間、表長、尾元素的位置
#define maxleng 100
last與length存在關係,a1放在a[0],last = length-1 = n-1;a1放在a[1],last = length = n
結論:last和length變數,定義時二取一即可
(2)eg2:元素所在空間和表長合併為c語言的乙個結構型別:
#define maxleng 100
typedef
struct
//typedef:別名定義
sqlist;
//結構型別名
sqlist la;
//la:結構型別變數名
其中:la.length:表長
la.elem[0]:a1
la.elem[la.lengrh-1]:an
#define list_init_size 100
#define listincrement 10
typedef
struct
//typedef:別名定義
sqlist//結構型別名
sqlist lb //lb:結構型別變數名
其中:lb.length:表長
lb.elem[0]:a1
lb.elem[lb.lengrh-1]:an
status insert (sqlist *l,
int i,elemtype e)
(2)演算法2:動態分配線性表空間,用引用引數表示被操作的線性表
先附上前面那段**
線性表順序結構在c語言中的定義(動態分配):使用指標
#define list_init_size 100
#define listincrement 10
typedef
struct
//typedef:別名定義
sqlist//結構型別名
sqlist lb //lb:結構型別變數名
以下是插入函式的**:
注:realloc函式語法:指標名=(資料型別*)realloc(要改變記憶體大小的指標名,新的大小)
標頭檔案:#include
int insert (sqlist &l,
int i,elemtype e)
for(j=l.length-
1;j>=i-
1;j--
)//從線性表中最後乙個元素到插入位置的所有元素,依次往後移動,給待插入元素留出乙個空位置
l.elem[j+1]
= l.elem[j]
;//向後移動元素
l.elem[i-1]
=e;//插入新元素
l.length++
;//長度變數+1
return ok;
//插入成功
}
int delete (sqlist *l,
int i)
else
}
被刪除元素位置: i=1 2 ... i ... n n+1
需移動元素個數: n n-1 n-i+1 1 0
假設pi是在各位置插入元素的概率,且各位置概率相等,則pi=1/(n+1)
則插入乙個元素時移動元素的平均值是:
期望e=1/(n+1)*(0+1+2+...+n)= n/2,為線性表長度的一半
(2)刪除操作移動元素次數的分析:
被刪除元素位置: i=1 2 ... i ... n
需移動元素個數: n-1 n-2 n-i 0
假設pi是在各位置插入元素的概率,且各位置概率相等,則pi=1/n
則插入乙個元素時移動元素的平均值是:
期望e=1/n*(0+1+2+...+(n-1))= (n-1)/2
線性表定義 線性表順序儲存結構
線性表 由零個或多個資料元素組成的有限序列。簡單的說,就像排隊一樣,具有先一樣性質的結構。關鍵 資料元素的個數稱為線性表的長度,當線性表長度為零時,稱為空表。表起始位置稱表頭,表結束位置稱表尾。線性表有兩種物理儲存結構 順序儲存結構和鏈式儲存結構。物理上的儲存方式事實上就是在記憶體中找個初始位址,然...
線性表的順序儲存結構 順序表及其操作
2.線性表的順序儲存結構 順序表 線性表是乙個具有相同特徵的資料元素的有限序列,線性表的邏輯表示為 a1,a2,ai,ai 1,an 其中 ai 1 i n 表示第i i表示邏輯位序 個元素 線性表的順序儲存結構是把線性表中的所有元素按照順序儲存方法進行儲存,如下圖所示 先宣告線性表的順序儲存型別 ...
線性表順序儲存
線性表順序儲存結構的建立 插入結點 刪除結點 就地逆置。include stdio.h include malloc.h typedef struct slist,list void init list 線性表初始化 void insert list s,int p 線性表插入 void delet...