?錄
1. 課前準備
2. 順序表概念及結構
3. 順序表分類
4. 實現動態順序表
1. 課程?標
C語?語法基礎到數據結構與算法,前?已經掌握并具備了扎實的C語?基礎,為什么要學習數據結構
課程??通訊錄項?
2. 需要的儲備知識
簡單了解,通訊錄具備增加、刪除、修改、查找聯系?等操作。要想實現通訊錄項?有兩個技術關
鍵:
1)C語?語法基礎
2)數據結構 之 順序表/鏈表
3. 數據結構相關概念
?1、什么是數據結構
數據結構是由“數據”和“結構”兩詞組合?來。
什么是數據?常?的數值1、2、3、4.....、教務系統?保存的??信息(姓名、性別、年齡、學歷等
等)、????眼可以看到的信息(?字、圖?、視頻等等),這些都是數據
什么是結構?
當我們想要使??量使?同?類型的數據時,通過?動定義?量的獨?的變量對于程序來說,可讀性
?常差,我們可以借助數組這樣的數據結構將?量的數據組織在?起,結構也可以理解為組織數據的
?式。
想要找到草原上名叫“咩咩”的?很難,但是從?圈?找到1號?就很簡單,?圈這樣的結構有效將
?群組織起來 概念:數據結構是計算機存儲、組織數據的?式。數據結構是指相互之間存在?種或多種特定關系
的數據元素的集合。數據結構反 映數據的內部構成,即數據由那部分構成,以什么?式構成,以及數
據元素之間呈現的結構。
總結:
1)能夠存儲數據(如順序表、鏈表等結構)
2)存儲的數據能夠?便查找
2、為什么需要數據結構?

如圖中所?,不借助排隊的?式來管理客?,會導致客?就餐感受差、等餐時間?、餐廳營業混亂等
情況。同理,程序中如果不對數據進?管理,可能會導致數據丟失、操作數據困難、野指針等情況。
通過數據結構,能夠有效將數據組織和管理在?起。按照我們的?式任意對數據進?增刪改查等操
作。
最基礎的數據結構:數組。
【思考】有了數組,為什么還要學習其他的數據結構?
假定數組有10個空間,已經使?了5個,向數組中插?數據步驟:
求數組的?度,求數組的有效數據個數,向下標為數據有效個數的位置插?數據(注意:這?是
否要判斷數組是否滿了,滿了還能繼續插?嗎).....
假設數據量?常龐?,頻繁的獲取數組有效數據個數會影響程序執?效率。
結論:最基礎的數據結構能夠提供的操作已經不能完全滿?復雜算法實現。
順序表
1、順序表的概念及結構
1.1 線性表
線性表( linear list )是n個具有相同特性的數據元素的有限序列。 線性表是?種在實際中?泛使
?的數據結構,常?的線性表:順序表、鏈表、棧、隊列、字符串...
線性表在邏輯上是線性結構,也就說是連續的?條直線。但是在物理結構上并不?定是連續的,
線性表在物理上存儲時,通常以數組和鏈式結構的形式存儲。
案例:蔬菜分為綠葉類、?類、菌菇類。線性表指的是具有部分相同特性的?類數據結構的集合
如何理解邏輯結構和物理結構?
2、順序表分類?
順序表和數組的區別
? 順序表的底層結構是數組,對數組的封裝,實現了常?的增刪改查等接?
? 順序表分類
? 靜態順序表
概念:使?定?數組存儲元素
靜態順序表缺陷:空間給少了不夠?,給多了造成空間浪費?
? 動態順序表 ?
?3、靜態順序表
最簡答的可以這樣寫
?下面是優化后的代碼:
最好是一開始就養成好的習慣

4.動態順序表?

4.動態順序表和靜態順序表的優勢和劣勢


5 .動態順序表的簡單實現
5.1初始化順序表
這里需要創建3個文件

?
注意這里要放我們寫的結構的指針類型要不然沒辦法傳值,但這里太長太繁瑣了這里重命名一下
下面是優化后的代碼:
?寫一個簡單的來測試這個是否初始化成功

通過調試觀察初始化是否成功
?可以看到三個成員都已經初始化成功

5.2 順序表的插入
順序表的插入大致可以分成三種
頭插入,尾插,任意
5.3 擴容規則

第一種和第二種都存在一定的問題這里推進是第三種?
?
觀察上面通過觀察可以得出不管是頭插還是尾插只要是capacity(容量)和size(有效數據)相等的時候那么這個時候再插入這里就要擴容了,
5.4擴容代碼
5.5尾插
void SLPushBack(MySL* sl, SLdatatype x)//SLdatetype現在就是int
{SLcheckcapacity(sl);//SLcheckcapacity(&(sl->arr));sl->arr[sl->size] = x;sl->size++;
}

?這里通過調試可以看到已經插入成功
?5.6打印順序表的元素
為了方便這里給他封裝成一個函數打印


?在尾插這里插入一個空指針,這里直接給干出bug了,所以這里要在尾插這里判斷一下

這樣就可以避免空指針直接錯誤
還可以直接斷言
加上需要的頭文件
?
?這里斷言就會直接告訴我們錯哪里的這種方式比較粗暴
?5.7頭插

如果這里直接把100插入到0那里,那么0的那個數據就會直接丟失,所以應該先移動數據,把所以的數據往后移動一位,?所以我們循環要從后往前寫


5.8尾刪
?
?
?5.9頭刪????????

?
5.10指定位置?插入

假如在第3(按照從0開始)個插入四變成123456

?
?
?5.11指定位置刪除

這里刪除多余的2
?
?