這篇部落格主要是帶助教,好多學生提問了,就參考一篇部落格稍微修改了一下
這裡我只用乙個簡單的例子——線性單向鍊錶為例,說明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....