日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C/C++语言实现单链表(带头结点)

發(fā)布時(shí)間:2024/8/24 c/c++ 33 如意码农
生活随笔 收集整理的這篇文章主要介紹了 C/C++语言实现单链表(带头结点) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

徹底理解鏈表中為何使用二級(jí)指針或者一級(jí)指針的引用

數(shù)據(jù)結(jié)構(gòu)之鏈表-鏈表實(shí)現(xiàn)及常用操作(C++篇)

  C語(yǔ)言實(shí)現(xiàn)單鏈表,主要功能為空鏈表創(chuàng)建,鏈表初始化(頭插法),鏈表元素讀取,按位置插入,(有序鏈表)按值插入,按位置刪除,按值刪除,清空鏈表,銷毀鏈表。

  關(guān)鍵思路:(1)將結(jié)點(diǎn)創(chuàng)建結(jié)構(gòu)體;(2)鏈表中添加頭結(jié)點(diǎn),以便統(tǒng)一操作;(3)使用結(jié)點(diǎn)一級(jí)指針和二級(jí)指針的異同點(diǎn);(4)鏈表的最小操作單位是結(jié)點(diǎn);(5)操作的起始位置是頭結(jié)點(diǎn)還是第一個(gè)結(jié)點(diǎn),及起始索引是0還是1. 

 #include <stdio.h>
#include <stdlib.h>
#include <time.h> //涉及到結(jié)構(gòu)體自引用
typedef struct Node{
int data;
struct Node *next;
}Node; //創(chuàng)建空鏈表
//必須用二級(jí)指針,涉及到頭指針的創(chuàng)建
int iniList(Node **List){
*List = (Node *)malloc(sizeof(Node));
if (NULL == *List){
return ;
} (*List)->next = NULL; //創(chuàng)建頭結(jié)點(diǎn)
return ;
} //初始化鏈表(頭插法)
//必須二級(jí)指針
int iniListHead(Node **List, int n){
*List = (Node *)malloc(sizeof(Node));
if (NULL == *List){
return ;
}
(*List)->next = NULL;
srand(time()); int i = ;
while (i < n){
Node *tmpNode = (Node *)malloc(sizeof(Node));
if (NULL == tmpNode){
return ;
}
tmpNode->data = rand() % + ;
tmpNode->next = (*List)->next;
(*List)->next = tmpNode; ++i;
}
return ;
} //初始化鏈表(尾插法)
//必須二級(jí)指針
//需要借助輔助變量pCurrent,將每次尾插的新元素當(dāng)做當(dāng)前元素
int iniListTail(Node **List, int n){
*List = (Node *)malloc(sizeof(Node));
if (NULL == *List){
return ;
}
(*List)->next = NULL;
srand(time()); Node *pCurrent = *List; int i = ;
while (i < n){
Node *tmpNode = (Node *)malloc(sizeof(Node));
if (NULL == tmpNode){
return ;
}
tmpNode->data = rand() % + ;
tmpNode->next = NULL;
pCurrent->next = tmpNode;
pCurrent = tmpNode; ++i;
}
return ;
} //清空鏈表(不刪除頭結(jié)點(diǎn))
//一級(jí),二級(jí)指針均可
//首先找到鏈表地址,然后移動(dòng)至表尾
//判斷條件為指針域是否為空,即到達(dá)結(jié)尾
int deleteList(Node *List){ //這種方法無(wú)法刪除尾結(jié)點(diǎn)
//Node *p= List;
//Node *q = NULL;
//
//while (p->next){
// q = p;
// free(p);
// p = q->next;
//} Node *p = List->next;
Node *q = NULL; while (p){
q = p->next;
free(p);
p = q;
} List->next = NULL;
return ;
} //銷毀鏈表
//必須使用二級(jí)指針,銷毀頭結(jié)點(diǎn)和頭指針
//最后將鏈表頭指針置空
int desrotyList(Node **List){ Node *p = *List;
Node *q = NULL; //如果為空鏈表,直接刪除頭結(jié)點(diǎn)
//如果不是空鏈表,從頭結(jié)點(diǎn)開(kāi)始刪除
while (p){
q = p->next;
free(p);
p = q;
}
(*List) = NULL; //下面是從第一個(gè)結(jié)點(diǎn)開(kāi)始刪除
//最后釋放掉頭結(jié)點(diǎn)
//Node *p = (*List)->next;
//Node *q = NULL;
//
//while (p){
// q = p->next;
// free(p);
// p = q;
//}
//free(*List);
//(*List) = NULL; return ;
} //鏈表獲取元素
//一級(jí),二級(jí)指針均可
//頭結(jié)點(diǎn)無(wú)意義,從第一個(gè)結(jié)點(diǎn)開(kāi)始遍歷,i從1開(kāi)始
//每次都指向下一結(jié)點(diǎn),到pos-1即可
int getList(Node *List, int pos, int *element){
Node *p = List->next; int i = ;
while (p && i < pos){
p = p->next;
++i;
}
*element = p->data;
return ;
} //鏈表按位置插入
//一級(jí),二級(jí)指針均可
//從頭結(jié)點(diǎn)開(kāi)始,有可能插入在第一個(gè)位置,遍歷從1開(kāi)始
int insertListPos(Node *List, int pos, int value){
Node *p = List; int i = ;
while (p && i < pos){
p = p->next;
++i;
}
Node *tmpNode = (Node *)malloc(sizeof(Node));
tmpNode->data = value;
tmpNode->next = p->next;
p->next = tmpNode;
return ;
} //有序鏈表,按值插入
//一二級(jí)指針均可
int insertListValue(Node *List, int value){
Node *pCur = List->next;
Node *pPer = List;
while (pCur && pCur->data < value){
pPer = pCur;
pCur = pCur->next;
} Node *tmpNode = (Node *)malloc(sizeof(Node));
if (NULL == tmpNode){
return ;
}
tmpNode->data = value;
tmpNode->next = pPer->next;
pPer->next = tmpNode;
return ;
} //鏈表按位置刪除
//一二級(jí)指針均可
//記得釋放結(jié)點(diǎn)內(nèi)存
//如果刪除第一個(gè)結(jié)點(diǎn),需要操縱頭結(jié)點(diǎn)
int deleteListPos(Node *List, int pos){
Node *p = List; int i = ;
while (p && i < pos){
p = p->next;
++i;
}
if (NULL == p->next)
return ; Node *tmpNode = p->next;
p->next = p->next->next; free(tmpNode);
return ;
} //鏈表按值刪除元素
//一二級(jí)指針均可
//從第一個(gè)結(jié)點(diǎn)開(kāi)始
int deleteListValue(Node *List, int value){
Node *pCur = List->next;
Node *pPer = List; while (pCur && pCur->data != value){
pPer = pCur;
pCur = pCur->next;
}
if (pCur == NULL){ //空鏈表不刪除任何結(jié)點(diǎn)
return ;
}
else{
pPer->next = pCur->next;
free(pCur);
}
return ;
} int main(){ Node *testList = NULL;
iniList(&testList);
//iniListHead(&testList, 3);
//iniListTail(&testList, 3); insertListPos(testList, , );
insertListPos(testList, , );
insertListPos(testList, , );
insertListPos(testList, , );
//insertListPos(testList, 1, 1);
insertListValue(testList, ); //deleteListPos(testList, 1);
//deleteListValue(testList, 4); //deleteList(testList); //printf("%d\n", testList);
//desrotyList(&testList);
//printf("%d\n", testList); Node * tmpNode = testList->next;
while (tmpNode){
printf("%d\n", tmpNode->data);
tmpNode = tmpNode->next;
} printf("----------------------\n"); int a = ;
getList(testList, , &a);
printf("%d\n", a); system("pause"); return ;
}

C語(yǔ)言完整代碼

  通過(guò)C++實(shí)現(xiàn)C語(yǔ)言的鏈表,主要區(qū)別:(1)struct可以不通過(guò)typedef,直接使用Node;(2)將malloc和free更換為new和delete

 #include<iostream>
#include<ctime> using namespace std; struct Node{
int data;
Node *next;
}; //創(chuàng)建空鏈表
//必須用二級(jí)指針,涉及到頭指針的創(chuàng)建
int iniList(Node **List){
*List = new Node; (*List)->next = NULL; //創(chuàng)建頭結(jié)點(diǎn)
return ;
} //初始化鏈表(頭插法)
//必須二級(jí)指針
int iniListHead(Node **List, int n){
*List = new Node; (*List)->next = NULL;
srand(time()); int i = ;
while (i < n){
Node *tmpNode = new Node; tmpNode->data = rand() % + ;
tmpNode->next = (*List)->next;
(*List)->next = tmpNode; ++i;
}
return ;
} //初始化鏈表(尾插法)
//必須二級(jí)指針
//需要借助輔助變量pCurrent,將每次尾插的新元素當(dāng)做當(dāng)前元素
int iniListTail(Node **List, int n){
*List = new Node; (*List)->next = NULL;
srand(time()); Node *pCurrent = *List; int i = ;
while (i < n){
Node *tmpNode = new Node; tmpNode->data = rand() % + ;
tmpNode->next = NULL;
pCurrent->next = tmpNode;
pCurrent = tmpNode; ++i;
}
return ;
} //清空鏈表(不刪除頭結(jié)點(diǎn))
//一級(jí),二級(jí)指針均可
//首先找到鏈表地址,然后移動(dòng)至表尾
//判斷條件為指針域是否為空,即到達(dá)結(jié)尾
int deleteList(Node *List){ //這種方法無(wú)法刪除尾結(jié)點(diǎn)
//Node *p= List;
//Node *q = NULL;
//
//while (p->next){
// q = p;
// free(p);
// p = q->next;
//} Node *p = List->next;
Node *q = NULL; while (p){
q = p->next;
delete p;
p = q;
} List->next = NULL;
return ;
} //銷毀鏈表
//必須使用二級(jí)指針,銷毀頭結(jié)點(diǎn)和頭指針
//最后將鏈表頭指針置空
int desrotyList(Node **List){ Node *p = *List;
Node *q = NULL; //如果為空鏈表,直接刪除頭結(jié)點(diǎn)
//如果不是空鏈表,從頭結(jié)點(diǎn)開(kāi)始刪除
while (p){
q = p->next;
delete p;
p = q;
}
(*List) = NULL; //下面是從第一個(gè)結(jié)點(diǎn)開(kāi)始刪除
//最后釋放掉頭結(jié)點(diǎn)
//Node *p = (*List)->next;
//Node *q = NULL;
//
//while (p){
// q = p->next;
// free(p);
// p = q;
//}
//free(*List);
//(*List) = NULL; return ;
} //鏈表獲取元素
//一級(jí),二級(jí)指針均可
//頭結(jié)點(diǎn)無(wú)意義,從第一個(gè)結(jié)點(diǎn)開(kāi)始遍歷,i從1開(kāi)始
//每次都指向下一結(jié)點(diǎn),到pos-1即可
int getList(Node *List, int pos, int *element){
Node *p = List->next; int i = ;
while (p && i < pos){
p = p->next;
++i;
}
*element = p->data;
return ;
} //鏈表按位置插入
//一級(jí),二級(jí)指針均可
//從頭結(jié)點(diǎn)開(kāi)始,有可能插入在第一個(gè)位置,遍歷從1開(kāi)始
int insertListPos(Node *List, int pos, int value){
Node *p = List; int i = ;
while (p && i < pos){
p = p->next;
++i;
}
Node *tmpNode = new Node;
tmpNode->data = value;
tmpNode->next = p->next;
p->next = tmpNode;
return ;
} //有序鏈表,按值插入
//一二級(jí)指針均可
int insertListValue(Node *List, int value){
Node *pCur = List->next;
Node *pPer = NULL;
while (pCur && pCur->data < value){
pPer = pCur;
pCur = pCur->next;
} Node *tmpNode = new Node;
if (NULL == tmpNode){
return ;
}
tmpNode->data = value;
tmpNode->next = pPer->next;
pPer->next = tmpNode;
return ;
} //鏈表按位置刪除
//一二級(jí)指針均可
//記得釋放結(jié)點(diǎn)內(nèi)存
//如果刪除第一個(gè)結(jié)點(diǎn),需要操縱頭結(jié)點(diǎn)
int deleteListPos(Node *List, int pos){
Node *p = List; int i = ;
while (p && i < pos){
p = p->next;
++i;
}
Node *tmpNode = p->next;
p->next = p->next->next; delete tmpNode;
return ;
} //鏈表按值刪除元素
//一二級(jí)指針均可
//從第一個(gè)結(jié)點(diǎn)開(kāi)始
int deleteListValue(Node *List, int value){
Node *pCur = List->next;
Node *pPer = List; while (pCur && pCur->data != value){
pPer = pCur;
pCur = pCur->next;
}
if (pCur == NULL){
return ;
}
else{
pPer->next = pCur->next;
delete pCur;
}
return ;
}

C++完整代碼

結(jié)點(diǎn)結(jié)構(gòu)體

  將結(jié)點(diǎn)創(chuàng)建為結(jié)構(gòu)體,其中包含數(shù)據(jù)域和指針域成員,指針域涉及結(jié)構(gòu)體自引用。指針域成員之所以為結(jié)點(diǎn)類指針,一是為了編譯時(shí)能明確結(jié)構(gòu)體大小,二是為了指向下一個(gè)結(jié)點(diǎn),因此初始化時(shí)不用開(kāi)辟內(nèi)存,只需要賦值為NULL即可。當(dāng)然了,開(kāi)辟內(nèi)存也是可以的,這樣在刪除結(jié)點(diǎn),及清空鏈表時(shí)需要記得將其釋放,多此一舉,不提倡。

 //涉及到結(jié)構(gòu)體自引用
typedef struct Node{
int data;
struct Node *next;
}Node;

空鏈表創(chuàng)建(二級(jí)指針)

  空鏈表創(chuàng)建時(shí),建議創(chuàng)建頭結(jié)點(diǎn)。在插入和刪除第一個(gè)位置的元素時(shí),需要用結(jié)點(diǎn)的二級(jí)指針移動(dòng)頭指針,但普通結(jié)點(diǎn)的插入和刪除并不需要移動(dòng)頭指針。為了便于操作的統(tǒng)一(指插入和刪除操作),這里先創(chuàng)建頭結(jié)點(diǎn)。

  另外,在創(chuàng)建空鏈表時(shí),需要傳入二級(jí)指針,主要是為了操作頭指針,只要涉及操作頭指針的都需要使用二級(jí)指針。

 //創(chuàng)建空鏈表
//必須用二級(jí)指針,涉及到頭指針的創(chuàng)建
int iniList(Node **List){
*List = (Node *)malloc(sizeof(Node));
if (NULL == *List){
return ;
} (*List)->next = NULL; //創(chuàng)建頭結(jié)點(diǎn),將其指針域置空
return ;
}

鏈表初始化(二級(jí)指針)

  鏈表初始化,即是創(chuàng)建空鏈表,并對(duì)鏈表中的n個(gè)元素進(jìn)行賦值。一般來(lái)說(shuō),有頭插法、尾插法兩種,頭插法是在頭結(jié)點(diǎn)后插入,尾插法是在鏈表尾插入。

  頭插法

  頭插法一般思路:(1)創(chuàng)建帶頭結(jié)點(diǎn)的空鏈表;(2)創(chuàng)建新結(jié)點(diǎn),對(duì)新結(jié)點(diǎn)賦值;(3)新結(jié)點(diǎn)指向頭結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn),頭結(jié)點(diǎn)指向新結(jié)點(diǎn)。

 //初始化鏈表(頭插法)
//必須二級(jí)指針
int iniListHead(Node **List, int n){
*List = (Node *)malloc(sizeof(Node));
if (NULL == *List){
return ;
}
(*List)->next = NULL;
srand(time()); int i = ;
while (i < n){
Node *tmpNode = (Node *)malloc(sizeof(Node));
if (NULL == tmpNode){
return ;
}
tmpNode->data = rand() % + ;
tmpNode->next = (*List)->next;
(*List)->next = tmpNode; ++i;
}
return ;
}

  尾插法

  尾插法一般思路:(1)創(chuàng)建帶頭結(jié)點(diǎn)的空鏈表;(2)創(chuàng)建新結(jié)點(diǎn),對(duì)新結(jié)點(diǎn)數(shù)據(jù)域賦值,指針域置空;(3)建立臨時(shí)變量指向頭結(jié)點(diǎn),頭結(jié)點(diǎn)指向新結(jié)點(diǎn);(4)將臨時(shí)變量往后移動(dòng),指向新結(jié)點(diǎn)。

 //初始化鏈表(尾插法)
//必須二級(jí)指針
//需要借助輔助變量pCurrent,將每次尾插的新元素當(dāng)做當(dāng)前元素
int iniListTail(Node **List, int n){
*List = (Node *)malloc(sizeof(Node));
if (NULL == *List){
return ;
}
(*List)->next = NULL;
srand(time()); Node *pCurrent = *List; int i = ;
while (i < n){
Node *tmpNode = (Node *)malloc(sizeof(Node));
if (NULL == tmpNode){
return ;
}
tmpNode->data = rand() % + ;
tmpNode->next = NULL;
pCurrent->next = tmpNode;
pCurrent = tmpNode; ++i;
}
return ;
}

鏈表元素讀取(一、二級(jí)指針)

  鏈表元素讀取,需要涉及到索引位置。我們知道頭結(jié)點(diǎn)的數(shù)據(jù)域沒(méi)有意義,因此起始位置從第一個(gè)結(jié)點(diǎn)開(kāi)始,遍歷值從1開(kāi)始,到pos-1為止,此時(shí)p指向pos結(jié)點(diǎn)。

 //鏈表獲取元素
//一級(jí),二級(jí)指針均可
//頭結(jié)點(diǎn)無(wú)意義,從第一個(gè)結(jié)點(diǎn)開(kāi)始遍歷,i從1開(kāi)始
//每次都指向下一結(jié)點(diǎn),到pos-1即可
int getList(Node *List, int pos, int *element){
Node *p = List->next; int i = ;
while (p && i < pos){
p = p->next;
++i;
}
*element = p->data;
return ;
}

按位置插入(一、二級(jí)指針)

  插入時(shí),需要考慮任意位置,由于頭結(jié)點(diǎn)的設(shè)立,我們不需要單獨(dú)考慮第一個(gè)位置的結(jié)點(diǎn)插入。

  一般思路:(1)起始位置從頭結(jié)點(diǎn)開(kāi)始,遍歷值從1開(kāi)始,到pos-1為止,此時(shí)指向pos-1結(jié)點(diǎn);(2)創(chuàng)建新結(jié)點(diǎn),給新結(jié)點(diǎn)數(shù)據(jù)域賦值;(3)新結(jié)點(diǎn)指向pos位置的下一結(jié)點(diǎn),pos位置指向新結(jié)點(diǎn)。

 //鏈表按位置插入
//一級(jí),二級(jí)指針均可
//從頭結(jié)點(diǎn)開(kāi)始,有可能插入在第一個(gè)位置,遍歷從1開(kāi)始
int insertListPos(Node *List, int pos, int value){
Node *p = List; int i = ;
while (p && i < pos){
p = p->next;
++i;
}
Node *tmpNode = (Node *)malloc(sizeof(Node));
tmpNode->data = value;
tmpNode->next = p->next;
p->next = tmpNode;
return ;
}

有序鏈表按值插入(一、二級(jí)指針)

  有序鏈表中涉及到按值插入,按值刪除時(shí),需要建立兩個(gè)臨時(shí)變量,不同于按位置插入,我們可以在pos前一個(gè)停止遍歷,按值插入,我們需要遍歷找到插入位置,操作插入位置的前一個(gè)結(jié)點(diǎn)。

  一般思路:(1)從第一個(gè)結(jié)點(diǎn)開(kāi)始遍歷;(2)創(chuàng)建per變量標(biāo)記當(dāng)前結(jié)點(diǎn)的前一結(jié)點(diǎn);(3)創(chuàng)建新結(jié)點(diǎn),操作per結(jié)點(diǎn);(4)常規(guī)插入操作。

 //有序鏈表,按值插入
//一二級(jí)指針均可
int insertListValue(Node *List, int value){
Node *pCur = List->next;
Node *pPer = NULL;
while (pCur && pCur->data < value){
pPer = pCur;
pCur = pCur->next;
} Node *tmpNode = (Node *)malloc(sizeof(Node));
if (NULL == tmpNode){
return ;
}
tmpNode->data = value;
tmpNode->next = pPer->next;
pPer->next = tmpNode;
return ;
}

按位置刪除(一、二級(jí)指針)

  刪除時(shí),由于頭結(jié)點(diǎn)的設(shè)立,因此不需要特殊考慮第一個(gè)位置的操作和頭指針的移動(dòng)。需要設(shè)置臨時(shí)變量是釋放p->next后,后面還會(huì)使用p->next的結(jié)點(diǎn),這樣會(huì)造成訪問(wèn)出錯(cuò)。

  一般思路:(1)起始位置從頭結(jié)點(diǎn)開(kāi)始,遍歷從1開(kāi)始,到pos-1為止,此時(shí)指向pos-1結(jié)點(diǎn);(2)創(chuàng)建臨時(shí)變量,指向pos結(jié)點(diǎn);(3)將pos-1結(jié)點(diǎn)指向pos的下一結(jié)點(diǎn),釋放掉pos結(jié)點(diǎn)。

 //鏈表按位置刪除
//一二級(jí)指針均可
//記得釋放結(jié)點(diǎn)內(nèi)存
//如果刪除第一個(gè)結(jié)點(diǎn),需要操縱頭結(jié)點(diǎn)
int deleteListPos(Node *List, int pos){
Node *p = List; int i = ;
while (p && i < pos){
p = p->next;
++i;
}
Node *tmpNode = p->next;
p->next = p->next->next; free(tmpNode);
return ;
}

按值刪除(一、二級(jí)指針)

  按值刪除與按值插入一樣,需要兩個(gè)臨時(shí)變量。

  一般思路:(1)起始位置從第一個(gè)結(jié)點(diǎn)開(kāi)始,(2)設(shè)立per結(jié)點(diǎn)指針保存當(dāng)前結(jié)點(diǎn)的上一結(jié)點(diǎn);(3)常規(guī)刪除操作。

 //鏈表按值刪除元素
//一二級(jí)指針均可
//從第一個(gè)結(jié)點(diǎn)開(kāi)始
int deleteListValue(Node *List, int value){
Node *pCur = List->next;
Node *pPer = List; while (pCur && pCur->data != value){
pPer = pCur;
pCur = pCur->next;
}
if (pCur == NULL){ //空鏈表不刪除任何結(jié)點(diǎn)
return ;
}
else{
pPer->next = pCur->next;
free(pCur);
}
return ;
}

清空鏈表(一、二級(jí)指針)

  清空鏈表,只是將鏈表中的結(jié)點(diǎn)刪除,并釋放掉結(jié)點(diǎn)空間,保留頭結(jié)點(diǎn),并將頭結(jié)點(diǎn)的指針域置空。

  一般思路:(1)起始位置從第一個(gè)結(jié)點(diǎn)開(kāi)始;(2)設(shè)置臨時(shí)變量q指向當(dāng)前結(jié)點(diǎn)p的下一結(jié)點(diǎn),釋放掉當(dāng)前結(jié)點(diǎn)p,將臨時(shí)變量q賦給p;(3)最后將頭結(jié)點(diǎn)的指針置空。

 //清空鏈表(不刪除頭結(jié)點(diǎn))
//一級(jí),二級(jí)指針均可
//首先找到鏈表地址,然后移動(dòng)至表尾
//判斷條件為指針域是否為空,即到達(dá)結(jié)尾
int deleteList(Node *List){ //這種方法無(wú)法刪除尾結(jié)點(diǎn),當(dāng)p->next是尾結(jié)點(diǎn)上一節(jié)點(diǎn)時(shí),走一遍程序
//Node *p= List;
//Node *q = NULL;
//
//while (p->next){
// q = p;
// free(p);
// p = q->next;
//} Node *p = List->next;
Node *q = NULL; while (p){
q = p->next;
free(p);
p = q;
} List->next = NULL;
return ;
}

銷毀鏈表(二級(jí)指針)

  銷毀鏈表,是在清空鏈表的基礎(chǔ)上,刪除頭結(jié)點(diǎn),將頭指針置空,涉及到頭指針的操作,需要二級(jí)指針。

  思路一:(1)與清空鏈表操作相同,從第一個(gè)結(jié)點(diǎn)開(kāi)始刪除;(2)最后釋放掉頭結(jié)點(diǎn),將頭指針置空

  思路二:(1)起始位置從頭結(jié)點(diǎn)開(kāi)始刪除;(2)將頭指針置空

 //銷毀鏈表
//必須使用二級(jí)指針,銷毀頭結(jié)點(diǎn)和頭指針
//最后將鏈表頭指針置空
int desrotyList(Node **List){ Node *p = *List;
Node *q = NULL; //如果為空鏈表,直接刪除頭結(jié)點(diǎn)
//如果不是空鏈表,從頭結(jié)點(diǎn)開(kāi)始刪除
while (p){
q = p->next;
free(p);
p = q;
}
(*List) = NULL; //下面是從第一個(gè)結(jié)點(diǎn)開(kāi)始刪除
//最后釋放掉頭結(jié)點(diǎn)
//Node *p = (*List)->next;
//Node *q = NULL;
//
//while (p){
// q = p->next;
// free(p);
// p = q;
//}
//free(*List);
//(*List) = NULL; return ;
}

 二級(jí)指針和一級(jí)指針插入解析

-------------------------------------------------------------------------------------------------------------

如果上面的資料對(duì)你有啟發(fā),麻煩點(diǎn)個(gè)推薦,讓更多人的人看到哦。

關(guān)注公眾號(hào)【兩猿社】,懂點(diǎn)互聯(lián)網(wǎng),懂點(diǎn)IC的程序猿,帶你豐富項(xiàng)目經(jīng)驗(yàn)哦。

總結(jié)

以上是生活随笔為你收集整理的C/C++语言实现单链表(带头结点)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。