國小生放學都是要按順序排隊的,一個接一個,每個國小生的前後位置是固定的,這樣便于迅速清點。
其實這就是一個線性表,從這件事裡我們就可以找到很多關于線性表的特性,如
1、線性表是一個序列,它是有順序的(排隊)
2、第一個元素無前驅,最後一個無後繼,其他每個元素都有一個前驅和後繼(一個接一個)
3、元素是有限的(國小生的個數是有限的)
4、資料類型都相同(都是國小生在排隊)
說明白線性表示什麼,下面我們直接看線性表的實作
線性表的實作分順序存儲結構和鍊式存儲結構
順序存儲結構:
順序存儲結構
上述隻是順序存儲結構的一種寫法,最後我還會貼一個用數組實作的寫法,這不是主要的問題。
下面我們來看如何初始化一個線性表
初始化線性表
我上課用的課本是嚴蔚敏的《資料結構》(C語言版),在上課聽老師講初始化線性表的代碼的時候,當時沒看明白,後來才知道,原來課本省略了幾行宏定義的代碼就是西面這些
課本省略代碼
我覺得加上上述三行代碼,大家看起來就應該明白了。
到這裡我們會發現,咦,還有一個變量沒有使用,那就是配置設定增量LISTINCREMENT
,下面我們要介紹的操作就會用到它
這個操作就是線性表的插入
順序結構的插入就好像我們日常在學校體育鍛煉簽到,我們正在排隊,這時候舍友來了,隊伍特别長呀,你就悄悄地把他拉到你的前面了,這時候隊伍的位置就會發生改變,你和你身後的人都需要往後退一個人的位置。
特意用黑體标注出來的就是插入的重點,插入之後的元素要往後移動一個位置。
下面看具體的代碼實作
插入操作
既然說到了插入操作,那麼肯定要缺不了線性表的删除操作
這個的重點和插入的類似,不過恰好反了過來,删除之後的元素要往前移動一個位置。
下面看具體代碼的實作
删除操作
增删改查,4個操作,我們已經介紹了兩個,另外兩個我是在是不知道該講點什麼,就直接貼代碼了。
這兩個操作的代碼相對于增删個人感覺要簡單些
修改操作
查找方法
補充一點東西,就是兩個函數,分别是malloc函數和realloc函數
malloc不是一個單詞,而是一個縮寫,原型是memory allocation,翻譯過來意思就是動态配置設定記憶體的意思
它的原型應該是void *malloc(size)
void*表示未确定類型的指針,也就是這個函數我們在調用的時候一定要進行強轉
失敗的時候傳回null
realloc函數
作用是改變原有記憶體的大小
原型void *malloc(要改變的記憶體的指針名,改變的大小)
使用的時候也一定要強轉
失敗的時候也是傳回null
malloc 和realloc 使用的時候要記得加頭檔案 #include <stdib.h>
有的編譯器是加别的,請百度 - -#
到這裡,線性表的順序存儲結構就算是講完了
最後我們總結下它的優缺點
優:
可以快速的存取表中的任一位置的元素
缺:
插入和删除操作需要移動大量元素
如果線性表的長度變化較大的話,存儲空間的容量的大小設定難以确定,同時也有可能造成一定的空間碎片
第一次這樣系統的寫一個知識點的部落格,存在不少問題,大家多多見諒,若發現有問題,請第一時間幫忙給指出,謝謝。
解析來會貼線性表的鍊式存儲結構。