單鏈表的建立 從零開始遞引用作引數的測試

2021-09-23 22:39:50 字數 2501 閱讀 3038

結構體定義部分:

struct node;

帶頭節點的煉表示意圖:

上圖就是鏈結後每個節點的狀態,單鏈表每個節點儲存下乙個節點的位址(struct node *next),環環相扣,因此稱之為鍊錶。知道這兩個知識點後,我們就可以開始寫鍊錶了。首先是定義結構體,struct node; 千萬不要忘了結構體定義後的分號!

關於typedef的問題:

typedef是用來為複雜的宣告定義簡單的別名,比如typedef struct node}lnode;

這句話的意思即使用lnode來代替struct node這句宣告。

好處是什麼?

我認為有如下:

首先: 在複雜的程式裡,很容易打錯一些字,比如把struct打成stuct,把struct node 打成struct ndoe blablabla~,用typedef可以避免這種錯誤發生。

其次: 簡單省事,struct node *head; 和 lnode *head;都是定義頭節點的作用,但顯然後者更加便捷。(當然不怕麻煩並且足夠自信的話用第乙個也完全沒問題)

關於建立單鏈表(createlink):

如果想使用乙個鍊錶,我們就需要知道他的頭在哪,因此在createlink()函式中,需要返回head(也就是這條鍊子的頭部),這樣順著頭我們就可以一直找到鍊錶的每乙個元素,直到尾部(p若為最後乙個鏈結的話,那麼p->next==null)。

因為需要返回head這個指標,因此需要這樣寫:

(可能有小夥伴會有疑問:都說通過傳遞指標給函式就可以改變實參的值,還有必要返回指標嗎?有興趣的讀者可以跳轉到我的這篇部落格:關於傳遞指標與傳遞引用作引數的測試)

struct node *createlink()12

345返回值型別搞定之後,我們便可以進入建立鍊錶的環節。

單鏈表分為兩種:

(1)不帶頭節點的鍊錶:此種鍊錶的head即儲存第乙個資料,訪問時從head開始。不利於刪除或者新增指定位置資料的操作。

(2)帶頭節點的鍊錶:此種鍊錶儲存資料是從head->next開始的,head中並未儲存有資料,訪問時自然head->next開始,優點就是方便操作。

這裡先以不帶頭節點的鍊錶的建立為例:

首先,我們需要有乙個結構體指標來儲存頭節點,方便於之後的使用,所以:struct node *head;

注意:這裡的head是不能變的,,不變的意思不是他的值不變,而是他永遠固定在鍊錶的首位,作為鍊錶的頭部,方便之後的索引。

因此,當我們每新加入乙個元素時,不是直接更新head的值。不妨用乙個結構體指標pnew來記錄新加入的值,通過舊節點pend與新節點的相連來構造乙個鍊錶,示意圖如下:

顯然,pend所指向的單位,實際就是上一次的pnew(可以理解為,pnew作為新元素被成功加入到鍊錶之後,它便變成了舊節點,兩個字概括為:更替)

欸?是不是還有乙個變數忘了宣告?沒錯,那就是整型n,用來表示新加入的值。這樣我們便可以通過輸入n並且給節點賦值,只要輸入不為-1,那麼繼續進行輸入,否則終止迴圈。

不帶頭節點單鏈表**的實現:

首先,我們定義head,最初的時候鍊錶還沒有新增元素,因此head=null;

然後,輸入乙個元素代表將要新增的值。判斷元素是否符合條件(這裡以元素》=0為條件),如果滿足,就進入新增環節。

scanf("%d",&num);

while(num>=0)12

3456

在迴圈中,因為要新增值,所以要先為pnew分配記憶體,這樣才能對pnew進行賦值操作。

pnew=(struct node*)malloc(sizeof(struct node));

pnew->num=num;

pnew->next=null; //新建立的指標的下乙個位置還沒有定12

3因為我們想要建立不帶頭節點的單鏈表,因此如果是第一次新增值(第一次新增的判斷是,如果head指向null,證明還未加入元素),那麼head就應該指向pnew的位置,然後pnew變為舊位置pend。

if(head==null)12

345如果不是第一次新增了,那麼此時存放舊位址的就應該是pend,觀察上圖,只需要如下操作進行連線就可以了:

else12

345這樣,便成功建立了不帶頭節點的單鏈表。

完整**:

scanf("%d",&num);

while(num>=0)

else

scanf("%d",&num);}1

2345

6789

1011

1213

1415

1617

18帶頭節點單鏈表**的實現:

帶有頭節點的單鏈表創立,只需稍微改變**即可。

既然是帶有頭節點,那麼頭節點裡肯定是不需要賦值的,因此在建立時,我們直接最開始就讓頭節點作為舊節點,這樣頭節點就可以不用被賦值了。

head=(struct node*)malloc(sizeof(struct node));

head->next=null;

pend=head;

scanf("%d",&n);

while(n!=-1)

單鏈表的建立 從零開始

上學期臨近期末的時候用word寫了一篇鍊錶詳解,今天突然想到自己一直在搞演算法題,很長時間沒有用鍊錶了。試著在紙上寫了幾步,發現回想起來竟然有些吃力,這裡把上學期寫的鍊錶詳解貼上來mark一下,順便以此作為資料結構筆記的第一篇。首先,想要熟練使用鍊錶,就要知道兩大類基本知識點 1.指標 2.結構體結...

單鏈表的建立測長列印

define crt secure no warnings include include include include using namespace std typedef struct student node node creat else cycle 0 head head next p...

單鏈表的建立 測長和列印

面試寶典中第13章,實現單鏈表的建立測長和列印 include include include includeusing namespace std 單鏈表結構體 typedef struct student node 建立單鏈表 node create else head head next p ...