單鏈表的學習

2021-07-13 21:47:45 字數 2688 閱讀 7346

鍊錶是一種很重要的資料結構,它由兩部分組成,第乙個部分是我們要儲存的資料,第二個部分是指向下乙個儲存單元的指標。鍊錶在使用中有順序表無法比擬的靈活性,免去了儲存空間不夠,又有可能浪費的尷尬。

單鏈表有乙個頭指標phead,當我們沒有資料要儲存的時候它指向null,當我們有資料的時候它指向第一塊儲存單元。儲存單元裡面有兩個部分,前面的部分是我們要儲存的資料data,後面的部分是指向下乙個儲存單元的指標pnext,當後面沒有儲存單元的時候就指向null。那麼我們儲存的資料在記憶體中並不是連續儲存的,而是在記憶體中跳躍式儲存的。要使用的時候再直接申請一塊空間。

下面是鍊錶的定義

typedef struct listnode

slistnode, *pslistnode;

可以看到單鏈表的兩個成員。為了使用方便我們直接typedef重新命名。

單鏈表有幾種基本操作,比如插入資料,刪除資料,那我下面實現了一下。

首先,我寫了乙個申請新單元的函式

pslistnode byenode(datatype data)

return pnewnode;

}

它可以為我們直接在記憶體中申請一塊新的空間並且返回它的位址。

第乙個實現就是我們從尾部插入資料

void pushback(pslistnode* phead, datatype data)

else

pnewnode = byenode(data);

pnode->pnext = pnewnode;

}}

這裡我們傳的引數是二級指標,因為我們是要改變它指標的指向。假如我們直接傳遞一級指標,那麼我們並不能改變它的指向,相當於我們函式中操作了半天,其實都是在操作乙個臨時的指標變數,只不過他跟我們的頭指標的指向是一樣的,最後什麼也沒有返回,頭指標什麼變化都沒有。

接下來就是我們從尾部刪除資料的實現

void popback(pslistnode* phead)

else

if (pcurnode==ppernode)

else

}*/pslistnode ppernode = *phead;

pslistnode pcurnode = *phead;

assert(phead);

if (null == *phead)

else

else

ppernode->pnext = null;

free(pcurnode);

pcurnode = null;

} }}

注釋中的**是我剛開始的時候寫的,我發現他的邏輯不是很清晰,在第二個部分中我把鍊錶中只有乙個節點的情況單列了出來,邏輯比之前清晰了很多。

那我們也可以在鍊錶的頭部插入資料

void pushfront(pslistnode* phead, datatype data)

else

else

}}

思路有了之前的兩個函式做鋪墊想起來並不難。申請一塊新的空間之後,讓它的pnext指向我們之前的第一塊空間。然後改變我們的頭指標的指向,讓它指向我們的新空間。這裡注意我們申請空間是有可能失敗的,所以要判斷一下。

當然還有從頭部刪除

void popfront(pslistnode* phead)

else

}

千萬不要忘記free空間之後要給指標賦空,否則會形成野指標。

還有就是尋找我們鍊錶中的元素

pslistnode find(pslistnode phead, datatype data)

else

pnode = pnode->pnext;

} return pnode;*/

while (null != pnode)

return null;

}}

注釋掉的**是我第一次寫的,後來我發現它的邏輯有點問題,我可以更簡單的實現它的功能。

最後返回我要找的資料的位置,假如沒有找到那麼就返回空。

列印我鍊錶中的元素

void printlist(pslistnode phead)

printf("\n");

}

刪除我的任意位置的節點

void  erase(pslistnode* phead, pslistnode pos)

else

ppernode->pnext = pcurnode->pnext;

free(pcurnode);

pcurnode = null;

}}

在我的鍊錶的任意位置插入乙個節點

void  insert(pslistnode* phead, pslistnode pos, datatype data)

else

pnode = pnode->pnext;

} ptmpnode = pnode->pnext;

pnode->pnext = byenode(data);

pnode = pnode->pnext;

pnode->pnext = ptmpnode;

}}

單鏈表學習

include stdafx.h include struct node 建立乙個結構體 void insertnode struct node head,int value ne struct node malloc sizeof struct node 申請堆空間 if ne null ne v...

2020 10 20單鏈表學習

單鏈表的整表建立 順序結構 陣列的初始化 單鏈表 資料是分散的,占用空間根據需求即時生產 宣告一節點p和計數器變數i 初始化一空鍊錶 讓l的頭節點指向null,迴圈插入 頭插法建立單鏈表 把新元素放在表頭後的第乙個位置 將新節點指向頭節點之後 讓表頭的next指向新節點 頭插法會導致資料倒置 始終讓...

單鏈表(合併單鏈表)

單鏈表遍歷 單鏈表遍歷是從單鏈表頭指標head開始訪問,沿著next指標所指示的方向依次訪問每乙個結點,且每個結點只能訪問依次,直到最後乙個結點為止。遍歷時注意,不要改變head指標的指向。因此一般設定另外的乙個指標變數如p,p從head開始依次訪問乙個結點,直到鍊錶結束,此時p null,完成依次...