天天看點

資料結構之線性表(順序存儲結構)

國小生放學都是要按順序排隊的,一個接一個,每個國小生的前後位置是固定的,這樣便于迅速清點。

其實這就是一個線性表,從這件事裡我們就可以找到很多關于線性表的特性,如

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>

有的編譯器是加别的,請百度 - -#

到這裡,線性表的順序存儲結構就算是講完了

最後我們總結下它的優缺點

優:

可以快速的存取表中的任一位置的元素 

缺:

插入和删除操作需要移動大量元素

如果線性表的長度變化較大的話,存儲空間的容量的大小設定難以确定,同時也有可能造成一定的空間碎片

第一次這樣系統的寫一個知識點的部落格,存在不少問題,大家多多見諒,若發現有問題,請第一時間幫忙給指出,謝謝。

解析來會貼線性表的鍊式存儲結構。