鍊錶(一) 單鏈表1

2021-07-04 15:08:21 字數 2044 閱讀 7825

在使用順序結構儲存資料時,經常會有類似空間不足導致資料溢位,空間過大帶來記憶體浪費等情況。最常見的應該就是我們的陣列這種順序儲存結構。

c語言中,有沒有辦法解決這個問題呢?答案是有的,可以用鍊錶這種資料結構來解決動態擴容的問題。

使用鍊錶結構可以克服陣列鍊錶需要預先知道資料大小的缺點,鍊錶結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。但是鍊錶失去了陣列隨機讀

取的優點,同時鍊錶由於增加了結點的指標域,空間開銷比較大。鍊錶最明顯的好處就是,常規陣列排列關聯專案的方式可能不同於這些資料專案在記憶體或磁碟上

順序,資料的訪問往往要在不同的排列順序中轉換。鍊錶允許插入和移除表上任意位置上的節點,但是不允許隨機訪問。鍊錶有很多種不同的型別:單向鍊錶,雙向

鍊錶以及迴圈鍊錶。

今天我們來談一下關於單鏈表的問題,也就是上文中的單向鍊錶。

首先定義一下鍊錶的元素,也就是接下來要說的節點:

typedef int elemtype;

typedef struct

node;

typedef node* linklist;

我們用乙個結構體來表示乙個節點,其中data是節點存放的資料,next是乙個指標,指向下乙個節點的位址。

其餘兩個typedef只是為了方便修改才定義的。

好,接下來要說一下我們得鍊錶結構比起順序結構好在**。如下圖所示,鍊錶一般都存在乙個頭結點(頭結點不是必要的,但有頭結點,就能較快捷地訪問第乙個節點,以後會說到),頭結點不存放任何資料,或者可以存放當前鍊錶的資料個數。頭結點的next指標指向第乙個節點。第乙個節點的data存放資料,next指標指向第二個節點,以此類推,最後乙個節點的data同樣也是儲存資料,但是next指標卻是為空(即null),因為是單向鍊錶,所以最後乙個節點意味著資料的終結。

以上就是關於單鏈表的整體描述,說了這麼多,到底它跟順序結構相比好在**呢? 對,就是差在那個next指標上!我們大家都知道,申請陣列的時候,比如乙個int[100]的陣列,它佔據的記憶體空間是 100 * sizeof(int) 的容量,而且這些記憶體一定

有了以上的認識,我們很快的就可以進行乙個空鍊錶的初始化工作:

void creatlistinit(linklist *l)

這樣就建立了乙個空的鍊錶,因為要修改資料,所以傳進來的引數是linklist *型別。

接下來,就要開始往煉表裡加資料了。初始化乙個鍊錶的方法一般有頭插法和尾插法兩種,頭插法就是每次把新的元素都放在頭結點之後,也就是第乙個元素所在的地方,剩下的其他元素都排在它後面。而尾插法,對,就是插在後面,沒錯,跟大家想的一樣,我就不囉嗦了。

如上圖所示,頭插法只要把頭指標的next指標指向p,然後把p的指標指向之前的第乙個節點(如果有的話)

而尾插法就更簡單了。只要將最末尾的next指向p,再把p的next指標指向null。具體的實現步驟得自己好好想想,一般想通了,那你就已經學會單鏈表了!~

實現如下

頭插法:

/*  隨機產生n個元素的值,建立帶表頭結點的單鏈線性表l(頭插法) */int creatlisthead(linklist *l , int n)   //頭插法建立單鏈表

return 1;

}

尾插法:

void creatlisttail(linklist *l ,int n)     //尾插法建立單鏈表

r->next = null;

}

這樣一來,初始化空鍊錶和單鏈表的工作就結束了。單鏈表接下來的任務就是資料的插入和刪除(不是從頭或者尾),和資料的查詢。

說這麼多好累~估計以後就寫簡潔一些

鍊錶 一 單鏈表

單鏈表 1.概念 為了表示每個資料元素a i 與它下乙個元素a i 1 之間的邏輯關係,對資料元素a i 來說除了儲儲存本身的資訊之外,還需儲存乙個表示它下乙個元素的資訊。這兩部分資訊組成資料元素a i 的儲存映像,稱為節點,它包括兩個域 存本身資訊的叫資料域,存直接後繼位置的叫指標域。n個節點鏈結...

資料結構 鍊錶1(單鏈表)

資料結構 單鏈表 單鏈表的定義 單鏈表是用一組任意的儲存單元存放線性表的元素,這組儲存單元可以連續也可以不連續,甚至可以零散分布在記憶體中的任意位置。每個儲存單元在儲存資料元素的同時,還必須儲存其後記元素的位址資訊,這個位址資訊稱為指標。這兩部分組成了資料元素的儲存映像,稱為結點。結點node分為資...

單鏈表 鍊錶倒置

鍊錶屬於動態資料結構,可以模擬成一 環 接一 環 的鏈條,這裡每一 環 視作乙個結點,結點串在一起形成鍊錶。這種資料結構非常靈活,結點數目無須事先指定,可以臨時生成。每個結點有自己的儲存空間,結點間的儲存空間也無需連線,結點之間的串連由指標來完成,指標的操作又極為靈活方便,無須移動大批資料,只需修改...