线性表的顺序表示
--------順序表的定義
?????? 線性表的順序存儲又稱為順序表。它是用一組地址連續的存儲單元,依次存儲線性表中的數據元素,
從而使得邏輯上相鄰的兩個元素在物理位置上也相鄰。第 1 個元素存儲在線性表的起始位置,第 i 個元素
元素的存儲位置后面緊接著存儲的是第? i + 1 個元素。因此,順序表的特點是表中元素的邏輯順序與其物理
順序相同。
? ? ? 假設線性表 L 存儲的起始位置為 LOC(A) ,sizeof(ElemType) 是每個數據元素所占用存儲空間的大小,
則表 L 所對應的順序存儲如下圖:
? ? ? ?
????? 注意:線性表中的位序是從 1 開始的,而數組中元素的下標是從 0 開始的。
????? -----------------------------------------------------------------------------------------------------
????? 假定線性表的元素類型為 ElemType ,線性表的順序存儲類型描述為:
?????? # define MaxSize 50?????????????????????? // 定義線性表的最大長度
?????? typedef struct{
??????????????? ElemType??? data[MaxSize] ; ?? // 順序表的元素
??????????????? int?? length ;?????????????????????????? // 順序表的當前長度
??? ? } SqList ;???????????????????????????????????????? // 順序表的類型定義
???? ----------------------------------------------------------------------------------------------------
?????? 一維數組可以是靜態分配的,也可以是動態分配的。在靜態分配時,由于數組大小和空間
?事先已經固定,一旦空間占滿,再加入新的數據將產生溢出,就會導致程序崩潰。
??????? 而動態分配時,存儲數據的空間是在程序執行過程中通過動態分配語句分配的,一旦數據
?空間占滿,可以另外開辟一塊更大的存儲空間,用以替換原來的存儲空間,從而達到擴充存儲
?數組空間的目的,而不需要一次性地劃分所有所需要空間給線性表。
????? ----------------------------------------------------------------------------------------------------------
?????? #define InitSize 100
????? typedef struct {
?????????? ElemType?? *data ;???????????????????? // 指示動態分配數組的指針
?????????? int? MaxSize , length ;?????????????? // 數組的最大容量和當前個數
????? }SeqList;????????????????????????????????????? // 動態分配數組順序表的類型定義
????? -----------------------------------------------------------------------------------------------------------
???? C 的初始動態分配語句為:
???? L.data = (ElemType *)malloc( sizeof(ElemType) * InitSize );
??? C++ 的初始動態分配語句為:
??? L.data = new ElemType[InitSize] ;
??? 注意:動態分配并不是鏈式存儲,同樣還是屬于順序存儲結構,其物理結構沒有變化,依然是
? 隨機存取方式, 只是分配的空間大小可以在運行時決定。
?
???? 順序表最主要的特點是:隨機訪問,即通過首地址和元素序號可以再O(1) 時間內找到指定的元素。
???? 順序表的存儲密度高,每個結點只存儲數據元素。
??? 順序表邏輯上相鄰的元素物理上也相鄰,所以插入和刪除操作需要移動大量元素。
?
-------------順序表上基本操作的實現
?? 這里僅給出順序表的插入操作、刪除操作和按值查找的算法。
?? (1)、插入操作
??????? 在順序表 L 的第 i (1 <=? i <= L.length+1) 個位置插入新元素 e 。如果 i 的輸入不合法,則返回
false ,表示插入失敗;否則,將順序表的第 i 個元素以及其后的所有元素右移一個位置,騰出一個空位置
插入新元素 e ,順序表長度增加 1 ,插入成功,返回 true 。
??????? ----------------------------------------------------------------------------------------------------------------------------------------
??????? bool? ListInsert( SqList?? &L? , int i , ElemType e){
???????????? // 本算法實現將元素 e 插入到順序表 L 中第 i 個位置
???????????? if ( i < 1 || i > L.length +1 ){?????????? //? 判斷 i 的范圍是否有效
??????????????????? return? false;
??????????? }
??????????? if ( L.length >= MaxSize ){?????????? // 當前存儲空間已滿,不能插入
??????????????????? return? false;
?????????? }
????????? for( int j = L.length ; j >= i : j--){????? //將 第 i 個元素及之后的元素后移
?????????????? L.data[ j ] = L.data[ j-1 ] ;
????????? }
???????? L.data[ i -1 ] = e;?????????????????????????? // 在位置 i 處放入 e
???????? L.length++;????????????????????????????????? // 線性表的長度 加 1
???????? return true;
?????? }
----------------------------------------------------------------------------------------------------------------------------------------
????? 注意:區別順序表的位序和數組下標。理解為什么判斷插入位置是否合法時 if 語句中用 length +1 ,
???? 而移動元素的 for 語句只用 length ?
???? 《
???????? 最好情況:在表尾插入(即 i = n + 1 ),元素后移動語句將不執行,時間復雜度為 O(1) 。
???????? 最壞情況:在表頭插入(即 i = 1 ),元素后移動語句將執行 n 次,時間復雜度為 O( n ) 。
??????? 平均情況:假設 P(i)(P(i) = 1 / (n +1)) 是在第 i 個位置上插入一個結點的概率,則在長度為
??????????????????????? n 的線性表中插入一個結點時所需移動結點的平均次數為:
???????????????????????
???????? 因此,線性表插入算法的平均時間復雜度為 O( n )
???? 》
?
(2)、刪除操作
?? 刪除順序表 L 中第 i (1 <= i <= L.length)個為位置的元素,成功則返回 true ,并將被刪除的元素用引
?用變量 e 返回,否則返回 false 。
?? ----------------------------------------------------------------------------------------------------------------------------------------------
???? bool? ListDelete( SqList? &L , int i , int? &e ) {
??????? // 本算法實現刪除順序表 L 中第 i 個位置的元素
??????????? if( i < 1 || i > L.length ){???????????????????? // 判斷 i 的范圍是否有效
???????????????? return false ;?
???????????? }
?????????? e = L.data[ i -1 ] ;???????????????????????????? // 將被刪除的元素賦值給 e
?????????? for( int j = i ; j < L.length ; j++ ){???????? // 將第 i 個位置之后的元素前移
??????????????? L.data[ j -1 ] = L.data[ j ]
?????????? }
?????????? L.length--;?????????????????????????????????????? // 線性表的長度減 1
?????????? return true;
???? }
-----------------------------------------------------------------------------------------------------------------------------------------------
?? 《
?????? 最好情況:刪除表尾元素(即 i = n),無須移動元素,時間復雜度為 O(1)。
?????? 最壞情況:刪除表頭元素(即 i = 1),需要移動一個元素外的所有元素,時間復雜度為 O(n) 。
?????? 平均情況:假設 P(i) (P(i) = 1 / n) 是刪除第 i 個位置上結點的概率,則在長度為 n 的線性表中
?????????????????????? 刪除一個結點所需移動結點的平均次數為:
??????
? ? ? ? ?? 因此,線性表刪除算法的平均時間復雜度為 O( n ) 。 ?
》
?
(3)、按值查找(順序查找)
????????? 在順序表 L 中查找第一個元素值等于 e 的元素,并返回其位序。
?????? ----------------------------------------------------------------------------------------------------------------------------
????????? int? LocateElem( SqList? L? , ElemType e){
????????? // 本算法實現查找順序表中值為? e 的元素,如果查找成功,返回元素位序,否則返回 0
???????????????? int i ;
???????????????? for( i = 0 ; i < L.length ; i++){
?????????????????????? if( L.data[ i ] == e){
??????????????????????????? return? i +1 ;???????????????????? // 下標為 i 的元素值等于 e ,返回其位序 i + 1
????????????????????? }
???????????????????? return? 0;???????????????????????????????????? //退出循環,說明查找失敗
??????????????? }
???????? }
???? -----------------------------------------------------------------------------------------------------------------------------------
??? 《
??????????? 最好情況:查找的元素就在表頭,僅需比較一次,時間復雜度為 O(1) 。
??????????? 最壞情況:查找的元素在表尾(或不存在)時,需要比較 n 次,時間復雜度為 O(n)。
??????????? 平均情況:假設 P(i) (P(i) = 1 / n )是查找的元素在第 i (1 <= i <= L.length)額個位置上的
??????????????????????????? 概率,則在長度為 n 的線性表中查找值為 e 的元素所需比較的平均次數為:
?????????????
????????????? 因此,線性表按值查找算法的平均時間復雜度為 O(n) 。
????? 》
??
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
- 上一篇: python代码中的中文语法错误:Syn
- 下一篇: 项目管理十大流程,让你轻松管理项目