C 動態單鏈表基礎

2021-10-01 06:49:29 字數 4062 閱讀 2154

這篇部落格主要是帶助教,好多學生提問了,就參考一篇部落格稍微修改了一下

這裡我只用乙個簡單的例子——線性單向鍊錶為例,說明c語言是如何實現該結構的。

鍊錶的元素是由結構體來實現struct student *p。結構體中有乙個成員是結構體指標struct student *next,而這個結構體指標的型別和此結構體型別相同。除鍊錶最後乙個元素外,每乙個結構體的指標都指向鍊錶中下乙個元素的結構體,最後乙個元素的結構體指標為空(null)。儲存鍊錶時,只需要記錄下鍊錶的頭指標,即鍊錶中第乙個結構體的位址即可。新增乙個鍊錶元素時,都需要單獨申請一段記憶體;刪除時則將其釋放掉。在查詢鍊錶時,只需要順著結構體指標的順序乙個乙個往下查詢,直到查詢的結構體中的成員指標。

鍊錶的操作分為——建立表、插入元素、刪除元素、清空表、查詢表、列印表。其中插入/刪除的元素可以是乙個也可以說多個。鍊錶從儲存型別上來分可以分為靜態鍊錶和動態鍊錶,靜態鍊錶是事先編寫好的鍊錶,占用的記憶體是靜態儲存區的記憶體,使用時不可以對其中的元素進行刪減,只能查詢;動態鍊錶是按照程式要求生成的鍊錶,存放於動態儲存區,結構比較靈活,每乙個元素都佔據一部分儲存空間,如果要刪除元素,則釋放該位置的記憶體;如果要新增元素,則申請乙個結構體內存區的記憶體。

建立鍊錶需要兩個指標,乙個作為先行指標(*p1),開闢記憶體並儲存結構體的值;乙個作為快取指標(*p2),保留先行指標的所有值並且將它的next指向先行指標。構建鍊錶時,先行指標賦乙個值,後行指標儲存乙個值並且後行指標的next指向先行指標。賦值終止時,先行指標的next指向null,同時將先行指標賦值給後行指標,鍊錶即構建完畢

刪除元素鍊錶的第n個元素只需要將第n-1個元素的next指標指向第n+1個元素,再將第n個元素的記憶體釋放即可,我這裡是寫的其中乙個例子,根據關鍵字學號(int stdid)刪除表中的某個元素,同時返回刪除後的鍊錶首位址(如果刪的是第乙個元素,則鍊錶首位址會變)

插入元素的原理是,假設要在第n個元素前插入乙個元素。首先判斷它是不是首元素,如果是,則修改頭指標指向該元素,並將該元素的next指向原來的頭指標。如果不是首元素,是第k個元素之前插入乙個元素,則將第k-1個元素的next指標指向插入元素(或者子表)的位址(或者頭指標),將插入元素的next指標(或尾指標)指向第k個元素。本示例**是根據乙個學號(主要關鍵字)插入乙個元素(或者子表)的函式,返回鍊錶的首位址(因為如果在第乙個元素前面插入,可能改變鍊錶的首位址)。

在整個鍊錶中通過學號id查詢,查詢到了則返回,這裡學號是唯一的沒有相同的學號。

從煉表頭開始遍歷

插入元素是指在某個元素之前插入,這裡通過學號判斷

續表是指在當前鍊錶末尾輸入元素,和前面的插入不一樣

**如下:

#include

#include

#include

#define len sizeof(struct student)

//定義結構體變數的大小為符號常量len

using

namespace std;

struct student

;struct student *

input()

;//輸入函式

void

output

(struct student * head)

;//輸出函式

struct student *

deletee

(struct student *head,

int stdid)

;//刪除乙個元素,返回刪除後表的頭指標

struct student *

insertt

(struct student *head,

int stdid,

struct student *insertstd)

;//返回插入元素(子表)後的頭指標

int(

struct student *head)

;//插入乙個鍊錶,從input函式輸入

struct student *

i***ist

(struct student *head,

int stdid)

;int

main()

present=

insertt

(present,stdid,

input()

);printf

("插入元素後的鍊錶為:\n");

output

(present)

;break

;case2:

printf

("請輸入刪除元素的學號: ");

scanf

("%d"

,&stdid);if

(i***ist

(present,stdid)

==null

) present=

deletee

(present,stdid)

;printf

("刪除後的鍊錶為:\n");

output

(present)

;break

;case3:

(present)

;printf

("續表後的鍊錶為:\n");

output

(present)

;break

;case4:

printf

("當前鍊錶為:\n");

output

(present)

;break;}

printf

("是否繼續(yes:1,no:0): ");

scanf

("%d"

,&next)

;fflush

(stdin);

}while

(next)

;return0;

}struct student *

input()

p2->next=

null

;return

(head)

;//返回煉表頭指標

}void

output

(struct student *head)

}struct student *

deletee

(struct student *head,

int stdid)

//如果刪除的是第乙個元素,比較特殊,需要修改頭指標,其餘不動

//剩餘幾種情況都是修改next結構體指標

for(p1=head;p1!=

null

;p2=p1,p1=p1-

>next)

//p1指標和p2指標同時查詢,p1指向當前的學生,p2保指向了上乙個學生

}return

null

;//返回null代表沒找到

}struct student *

insertt

(struct student *head,

int stdid,

struct student *insertstd)

for(p1=head;p1!=

null

;p2=p1,p1=p1-

>next)

}return

null;}

int(

struct student *head)

//插入乙個鍊錶,從input函式輸入

struct student *

i***ist

(struct student *head,

int stdid)

}return

null

;}

c 單鏈表基礎操作

最近開始刷leetcode,感覺自己的基礎太差,基本的鍊錶部分的問題都得想很久,今天花了乙個晚上的時間將鍊錶的基礎操作都實現了一遍,記錄一下自己的收穫 最大的是收穫的一句話 鍊錶的操作使用替身 替身其實就是類似指標的東西,但是我之前一直沒有想到這一點,導致思路堵塞 舉個例子 我要操作first,如遍...

單鏈表基礎 C語言

題目 1 4 include include define elemtype char typedef struct node node typedef node linklist void initlist linklist l void createfromtail linklist l r n...

2 1 動態單鏈表

2.1 動態單鏈表 單鏈表 每個結點只包含乙個指標域的鍊錶 main.c include include include sequentialstorage.h include linkstorage.h intmain int argc,const char ar common.h common....