C語言實現(xiàn)單鏈表的基本功能詳解
1.首先簡單了解一下鏈表的概念:

要注意的是鏈表是一個結(jié)構(gòu)體實現(xiàn)的一種線性表,它只能從前往后,不可以從后往前(因為next只保存下一個節(jié)點的地址).在實現(xiàn)單鏈表的操作時,需要用指針來操作.很簡單,注釋寫的很詳細,歡迎大家指正哈哈哈哈~之前寫的太爛了重新寫了一下.....
2.代碼展示:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef struct linklist {
int data;
struct linklist* next;
}node;
//目錄
//1.動態(tài)申請節(jié)點
node* Creatnode(int x);
//2.單鏈表的尾插
void PushBack(node** plist, int x);
//3.單鏈表的打印
void Printlist(node** plist);
//4.單鏈表尾刪
void Popback(node** plist);
//5.單鏈表的頭插
void PushFront(node** plist, int x);
//6.單鏈表的頭刪
void PopFrount(node** plist);
//7.單鏈表的查找
node* Findpos(node* plist, int x);
//8.單鏈表在pos位置之后插入x
void Insertlinstafter(node* pos, int x);
//9.單鏈表刪除pos位置之后的元素
void PopPosAfter(node* pos);
//10.單鏈表的銷毀
void Destorylist(node** plist);
//1.動態(tài)申請節(jié)點
node* Creatnode(int x) {
node* t = (node*)malloc(sizeof(node));
if (t == NULL) {
assert(0);
return NULL;
}
else {
t->next = NULL;
t->data = x;
return t;
}
}
//2.單鏈表的尾插
void PushBack(node** plist, int x) {
assert(plist);
if (*plist == NULL) {
*plist = Creatnode(x);
}
else {
node* p = *plist;
while (p->next) {
p = p->next;
}
p->next = Creatnode(x);
}
}
//3.單鏈表的打印
void Printlist(node** plist) {
assert(plist);
node* p =* plist;
while (p) {
printf("%d ", p->data);
p = p->next;
}
}
//4.單鏈表尾刪
void Popback(node** plist) {
assert(plist);
if (*plist == NULL) {
return NULL;
}
node* p = *plist;
node* q = NULL;
while (p->next) {
q = p;
p = p->next;
}
q->next =NULL;
free(p);
}
//5.單鏈表的頭插
void PushFront(node** plist, int x) {
assert(plist);
node* t = Creatnode(x);
if (NULL == *plist) {
*plist = t;
}
else {
t->next = *plist;
*plist = t;
}
}
//6.單鏈表的頭刪
void PopFrount(node** plist) {
assert(plist);
if (plist == NULL) {
return NULL;
}
else {
node* p = *plist;
*plist = p->next;
free(p);
}
}
//7.單鏈表的查找
node* Findpos(node* plist, int x) {
node* cur = plist;
while (cur) {
if (cur->data == x) {
return cur;
}
cur = cur->next;
}
return NULL;
}
//8.單鏈表在pos位置之后插入x
void Insertlinstafter(node* pos, int x) {
assert(pos);
if (NULL == pos) {
return ;
}
node* t = Creatnode(x);
t->next = pos->next;
pos->next = t;
}
//9.單鏈表刪除pos位置之后的元素
void PopPosAfter(node* pos) {
assert(pos);
if (pos->next == NULL) {
return;
}
else{
node* p = pos->next;
pos->next = p->next;
free(p);
}
}
//10.單鏈表的銷毀
void Destorylist(node** plist) {
assert(plist);
node* p = *plist;
while (p) {
*plist = p->next;
free(p);
p = *plist;
}
*plist = NULL;
}
void test1() {
node* plist=NULL;//創(chuàng)建頭指針
PushBack(&plist, 1);//尾插元素
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
PushBack(&plist, 5);
Printlist(&plist);//打印鏈表元素 1 2 3 4 5
printf("\n");
Popback(&plist); //尾刪元素
PushFront(&plist, 0);//首插元素0
Printlist(&plist);//打印鏈表 0 1 2 3 4
printf("\n");
PopFrount(&plist);//首刪元素0
Printlist(&plist);//打印鏈表 1 2 3 4
printf("\n");
Findpos(plist,1);//尋找鏈表中1的地址,不方便演示,下面會演示
Insertlinstafter(Findpos(plist, 4), 5);//在4后面插入5,用到上面的Findpos函數(shù)
Printlist(&plist);//打印鏈表 1 2 3 4 5
printf("\n");
PopPosAfter(Findpos(plist, 4));//刪除指定位置后面的元素(刪除4后面的5)
Printlist(&plist);//打印鏈表 1 2 3 4
printf("\n");
Destorylist(&plist);//銷毀鏈表
Printlist(&plist);//打印鏈表
}
void test() {
test1();
}
int main() {
test();
return 0;
}
3.測試結(jié)果:
a.先創(chuàng)建了頭指針plist
b.尾插1 2 3 4 5
c. 尾刪元素5
d.首插元素0
e.首刪元素0
f.在元素4 后面插入5
g.刪除4元素后面的5
h.銷毀鏈表

到此這篇關(guān)于C語言實現(xiàn)單鏈表的基本功能詳解的文章就介紹到這了,更多相關(guān)單鏈表基本功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言結(jié)構(gòu)體成員賦值的深拷貝與淺拷貝詳解
C語言中的淺拷貝是指在拷貝過程中,對于指針型成員變量只拷貝指針本身,而不拷貝指針所指向的目標,它按字節(jié)復制的。深拷貝除了拷貝其成員本身的值之外,還拷貝成員指向的動態(tài)內(nèi)存區(qū)域內(nèi)容。本文將通過示例和大家詳細說說C語言的深拷貝與淺拷貝,希望對你有所幫助2022-09-09
C語言的數(shù)據(jù)變量、常量、數(shù)據(jù)類型及使用示例詳解
本文介紹了C語言中的變量、常量、數(shù)據(jù)類型關(guān)鍵字以及如何使用這些數(shù)據(jù)類型,主要內(nèi)容包括變量和常量的定義與使用、基本數(shù)據(jù)類型關(guān)鍵字,感興趣的朋友一起看看吧2025-03-03
C++數(shù)據(jù)結(jié)構(gòu)之搜索二叉樹的實現(xiàn)
了解搜索二叉樹是為了STL中的map和set做鋪墊,我們所熟知的AVL樹和平衡搜索二叉樹也需要搜索二叉樹的基礎(chǔ)。本文將詳解如何利用C++實現(xiàn)搜索二叉樹,需要的可以參考一下2022-05-05
C++實現(xiàn)將s16le的音頻流轉(zhuǎn)換為float類型
這篇文章主要為大家詳細介紹了如何利用C++實現(xiàn)將s16le的音頻流轉(zhuǎn)換為float類型,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04

