删除第一个_学习数据结构--第二章:线性表(顺序存储、插入、删除)
第二章:線性表(順序表示)
1.線性表的定義和基本操作
線性表是具有相同數據類型的n(n≥0)個數據元素的有限序列
線性表中第一個元素稱為表頭元素;最后一個元素稱為表尾元素。
除第一個元素外,每個元素有且僅有一個直接前驅。除最后一個元素外,每個元素有且僅有一個直接后繼。
2.線性表的順序存儲結構
線性表的順序存儲是用一組地址連續的存儲單元(比如C語言里面的數組),依次存儲線性表中的數據元素。順序存儲的線性表也叫順序表。
地址連續:存儲器每個存儲單元都有編號,這個編號就是地址
Loc(a2)=Loc(a1)+d d是元素占據的存儲單元數
Loc(ai)=Loca(a1)+(i-1)*d
通過這個公式,可以計算出順序表中任一個元素的位置,而且所需要的時間都是相同的,即時間復雜度為O(1),即隨機存取
2.1如何建立線性表的順序存儲結構
靜態建表
首先我們要在存儲器中“找塊地”,而且是連續的,那么這塊存儲空間必然有首地址和大小;最后我們要將表中各個元素對號入座,那就要知道有多少元素,也就是表的長度。
順序表需要的三個部分
- 1.存儲空間的起始位置
- 2.順序表最大存儲容量
- 3.順序表當前的長度
數組是靜態分配的(大小固定)
動態建表
其實存儲空間(數組)還可以動態分配,也就是存儲數組的空間是在程序執行過程中通過動態分配語句來分配。
typedef int Elemtype;typedef struct{ ElemType *data; //指示動態分配數組的指針 int MaxSize,length; //數組的最大容量和當前個數}SeqList;//動態分配語句(c語言) #define initSize 100 SeqList L;L.data(ElemType*)malloc(sizeof(ElemType)*initSize);注意:動態分配并不是鏈式存儲,同樣還是屬于順序存儲結構,只是分配的空間大小可以在運行時決定.
3.總結
在這里插入圖片描述
4.順序表的操作
4.1插入
a5的位置在a1和a2之間。
算法流程:在順序表L的第 i (1<= i<=L.length+1)個位置插入新元素e。如果 i 輸入的不合法,則返回false,表示插入失敗;否則,將順序表的第 i 個元素以及其后的所有元素右移一個位置,騰出一個空位置插入新元素 e ,順序表長度增加 1 ,插入成功,返回true。
bool是布爾類型它只有true和 false兩種值,分別表示真和假
算法思路:
- 1.判斷的值是否正確
- 2.判斷表長是否超過數組長度
- 3.從后向前到第個位置,分別將這些元素都向后移動一位
- 4.將元素插入位置 i ,修改表長
順序存儲插入操作的性能
最好情況:在表尾插入(即i=n+1),元素后移語句將不執行,時間復雜度為O(1)。最壞情況:在表頭插入(即i=1),元素后移語句將執行n次,時間復雜度為O(n)平均情況:假設 p i( pi=1/(n+1) [1/(n+1)是因為總共有n+1一個位置可以被插入]) 是在第 i 個位置上插入一個結點的概率,則在長度為n的線性表中插入一個結點時所需移動結點的平均次數為:
順序表插入算法的平均時間復雜度為O(n)
4.1刪除
算法流程:刪除順序表L中第 i (1≤ i ≤ L.length)個位置的元素,成功則返回true,并將被刪除的元素用引用變量e返回,否則返回 false。
算法思路
- 1.判斷的值是否正確
- 2.取刪除的元素
- 3.將被刪元素后面的所有元素都依次向前移動一位
- 4.修改表長
順序存儲刪除操作的性能
最好情況:刪除表尾元素(即i=n),無須移動元素,時間復雜度為O(1) 最壞情況:刪除表頭元素(即i=1)需要移動除第一個元素外的所有元素,時間復雜度為O(n)平均情況:假設pi(pi=1/n [1/n是因為總共有n個位置可以被刪除])是刪除第 i 個位置上結點的概率,則在長度為n的線性表中刪除一個結點時所需移動結點的平均次數為
在這里插入圖片描述
5.總結
順序存儲優點
- 存儲密度大:不需要為表中元素之間的邏輯關系增加額外存儲空間。
- 隨機存取:可以快速存取表中任一位置的元素
順序存儲缺點
- 插入和刪除操作需要移動大量元素
- 對存儲空間要求高,會產生存儲空間的“碎片”
關于數據結構的知識,持續更新中,歡迎關注公眾號理木客
總結
以上是生活随笔為你收集整理的删除第一个_学习数据结构--第二章:线性表(顺序存储、插入、删除)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 包r语言_R语言代码共享:制作R包
- 下一篇: 示波器1m和50欧姆示阻抗匹配_为什么示