日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线性表的顺序表示

發布時間:2023/12/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性表的顺序表示 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

--------順序表的定義

?????? 線性表的順序存儲又稱為順序表。它是用一組地址連續的存儲單元,依次存儲線性表中的數據元素,

從而使得邏輯上相鄰的兩個元素在物理位置上也相鄰。第 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) 。

????? 》

??

?

?

?

?

?

?

?

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的线性表的顺序表示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。