




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之單向鏈表詳解目錄鏈表靜態(tài)鏈表動(dòng)態(tài)鏈表定義鏈表節(jié)點(diǎn)創(chuàng)建鏈表創(chuàng)建一個(gè)空節(jié)點(diǎn)尾插法頭插法指定位置插入一個(gè)結(jié)點(diǎn)遍歷鏈表獲取鏈表長(zhǎng)度鏈表搜索鏈表數(shù)據(jù)排序反轉(zhuǎn)鏈表刪除節(jié)點(diǎn)數(shù)據(jù)銷毀鏈表測(cè)試
鏈表
鏈表實(shí)現(xiàn)了,內(nèi)存零碎數(shù)據(jù)的有效組織。比如,當(dāng)我們用malloc來(lái)進(jìn)行內(nèi)存申請(qǐng)的時(shí)候,當(dāng)內(nèi)存足夠,但是由于碎片太多,沒(méi)有連續(xù)內(nèi)存時(shí),只能以申請(qǐng)失敗而告終,而用鏈表這種數(shù)據(jù)結(jié)構(gòu)來(lái)組織數(shù)據(jù),就可以解決上類問(wèn)題。
靜態(tài)鏈表
#includestdio.h
//1.定義鏈表節(jié)點(diǎn)
typedefstructnode{
intdata;
structnode*next;
}Node;
intmain(intargc,char*argv[]){
//2.創(chuàng)建鏈表節(jié)點(diǎn)
Nodea;
Nodeb;
Nodec;
//3.初始化節(jié)點(diǎn)數(shù)據(jù)
a.data=1;
b.data=3;
c.data=5;
//4.鏈接節(jié)點(diǎn)
a.next=
b.next=
c.next=NULL;
//5.創(chuàng)建鏈表頭
Node*head=
//6.使用鏈表
while(head!=NULL){
intcurrentData=head-data;
printf("currentData=%i\n",currentData);
head=head-next;//指向下一個(gè)節(jié)點(diǎn)
return0;
}
動(dòng)態(tài)鏈表
靜態(tài)鏈表的意義不是很大,主要原因,數(shù)據(jù)存儲(chǔ)在棧上,棧的存儲(chǔ)空間有限,不能動(dòng)態(tài)分配。所以鏈表要實(shí)現(xiàn)存儲(chǔ)的自由,要?jiǎng)討B(tài)的申請(qǐng)堆里的空間。
有頭鏈表
無(wú)頭鏈表
單向鏈表有有頭節(jié)點(diǎn)和無(wú)頭節(jié)點(diǎn)兩種列表,有頭節(jié)點(diǎn)在列表的刪除,反轉(zhuǎn),插入等操作會(huì)比無(wú)頭節(jié)點(diǎn)簡(jiǎn)單,但是不好之處就是多占用些空間,而且在多個(gè)鏈表結(jié)合處理的時(shí)候有頭鏈表每次都需要過(guò)濾頭節(jié)點(diǎn),而無(wú)頭鏈表直接完美融合,而且很多高級(jí)語(yǔ)言都是無(wú)頭鏈表的便于日后的擴(kuò)展,下面都是依據(jù)無(wú)頭節(jié)點(diǎn)進(jìn)行演示
定義鏈表節(jié)點(diǎn)
//1.定義鏈表節(jié)點(diǎn)
typedefstructnode{
void*data;
structnode*next;
}Node;
創(chuàng)建鏈表
/**
*創(chuàng)建鏈表
Node*createList(){
//1.創(chuàng)建頭節(jié)點(diǎn)
Node*root=(Node*)malloc(sizeof(Node));
root-data=NULL;
root-next=NULL;
//返回頭節(jié)點(diǎn)
returnroot;
創(chuàng)建一個(gè)空節(jié)點(diǎn)
/**
*創(chuàng)建一個(gè)空節(jié)點(diǎn)
Node*createNode(){
Node*node=(Node*)malloc(sizeof(Node));
node-data=NULL;
node-next=NULL;
returnnode;
}
尾插法
/**
*@briefinsertEndNode尾插法插入節(jié)點(diǎn)
*@paramhead需要插入的頭指針
*@paramdata需要插入的數(shù)據(jù)
voidinsertEndNode(Node*node,void*data){
Node*head=node;
//找到數(shù)據(jù)為空的節(jié)點(diǎn),沒(méi)有節(jié)點(diǎn)那么就擴(kuò)展
while(head-data!=NULL){
//擴(kuò)容
if(head-next==NULL){
Node*pNode=createNode();
head-next=pNode;
head=pNode;
break;
head=head-next;
//插入數(shù)據(jù)
head-data=data;
}
頭插法
/**
*@briefinsertHeadNode頭插法插入節(jié)點(diǎn)
*@paramhead需要插入的頭指針
*@paramdata需要插入的數(shù)據(jù)
voidinsertHeadNode(Node**node,void*data){
Node*pNode=createNode();
pNode-data=data;
pNode-next=*node;
*node=pNode;
指定位置插入一個(gè)結(jié)點(diǎn)
簡(jiǎn)單來(lái)說(shuō)就是先找到需要插入的位置,然后將當(dāng)前位置節(jié)點(diǎn)和他前一個(gè)節(jié)點(diǎn)連接到需要插入的節(jié)點(diǎn)就行了
/**
*@briefinsertNOde將數(shù)據(jù)節(jié)點(diǎn)插入到指定數(shù)據(jù)位置節(jié)點(diǎn),指定數(shù)據(jù)節(jié)點(diǎn)向后移動(dòng),如果沒(méi)有找到插入的位置,那么就插入到最后
*@paraminsertionPoint指定的數(shù)據(jù)節(jié)點(diǎn)
*@paramdata需要插入的數(shù)據(jù)
voidinsertNode(Node*node,void*insertionPoint,void*data){
Node*pNode=node;
Node*pre=pNode;//父節(jié)點(diǎn)
while(pNode!=NULL){
if(pNode-data==insertionPoint){
break;
pre=pNode;//保留當(dāng)前節(jié)點(diǎn)
pNode=pNode-next;
//如果沒(méi)有找到那么就插入到最后
if(pNode==NULL){
insertEndNode(node,data);
return;
Node*dataNode=createNode();
dataNode-data=data;
pre-next=dataNode;
dataNode-next=pNode;
}
遍歷鏈表
因?yàn)槲覀冎荡鎯?chǔ)是使用無(wú)類型的指針,所以需要轉(zhuǎn)換為插入時(shí)候的類型才行
/**
*@briefprintNodeListDouble遍歷鏈表
*@paramnode鏈表指針頭
voidprintNodeListDouble(Node*node){
Node*head=node;
while(head!=NULLhead-data!=NULL){
double*currentData=head-data;
printf("currentData=%f\n",*currentData);
head=head-next;
獲取鏈表長(zhǎng)度
/**
*@brieflistLength計(jì)算鏈表長(zhǎng)度
*@paramhead鏈表頭指針
*@return鏈表長(zhǎng)度
intlistLength(Node*head){
intcount=0;
head=head;
while(head){
count++;
head=head-next;
returncount;
鏈表搜索
/**
*@briefsearchList查找指定節(jié)點(diǎn)
*@paramhead鏈表頭指針
*@paramkey需要查找的值
*@return
Node*searchList(Node*head,void*key){
head=head;
while(head){
if(head-data==key){
break;
}else{
head=head-next;
returnhead;
}
鏈表數(shù)據(jù)排序
因?yàn)槲覀兇鎯?chǔ)數(shù)據(jù)類型是使用無(wú)類型的指針,那么在排序的時(shí)候需要轉(zhuǎn)換為指定類型才行
/**
*@briefbubbleSort對(duì)鏈表值進(jìn)行排序小到大
*@paramhead鏈表頭指針
voidsortDouble(Node*head){
//1.計(jì)算鏈表長(zhǎng)度
intlen=listLength(head);
//2.定義變量記錄前后節(jié)點(diǎn)
Node*cur=head;
while(cur!=NULL){
Node*cur1=cur-next;
while(cur1!=NULL){
//比較大小,然后交換數(shù)據(jù)
if(*((double*)cur-data)*((double*)cur1-data)){
double*temp=(double*)cur-data;
cur-data=cur1-data;
cur1-data=temp;
cur1=cur1-next;
cur=cur-next;
}
反轉(zhuǎn)鏈表
斷開(kāi)鏈表頭,然后以頭插法的方式將原鏈表的數(shù)據(jù)添加鏈表。
/**
*@briefreverseList反轉(zhuǎn)鏈表
*@paramhead鏈表頭指針
voidreverseList(Node**root){
Node*head=*root;
Node*pre=head,*cur=head-next;
pre-next=NULL;
while(cur!=NULL){
Node*node=cur-next;
cur-next=pre;
pre=cur;
cur=node;
*root=pre;
}
刪除節(jié)點(diǎn)數(shù)據(jù)
先找到需要?jiǎng)h除的節(jié)點(diǎn),之后將后一個(gè)結(jié)點(diǎn)賦值給前一個(gè)結(jié)點(diǎn)的next,然后將刪除位置的結(jié)點(diǎn)釋放即可
/**
*@briefdelNode刪除指定節(jié)點(diǎn)
voiddelNode(Node**root,void*key){
Node*head=*root;
//根節(jié)點(diǎn)單獨(dú)處理
if(head-data==keyhead-next!=NULL){
*root=head-next;
free(head-data);
free(head);
return;
Node*head1=head-next;
Node*pre=head;//根節(jié)點(diǎn)
while(head1!=NULL){
if(head1-data==key){
pre-next=head1-next;
free(head1-data);
free(head1);
break;
pre=head1;//當(dāng)前節(jié)點(diǎn)
head1=head1-next;//下一個(gè)節(jié)點(diǎn)
}
銷毀鏈表
/**
*@bri
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)士職業(yè)保障試題及答案總結(jié)
- 無(wú)人機(jī)與傳統(tǒng)飛行器的比較試題及答案
- 學(xué)習(xí)技巧與中級(jí)審計(jì)師試題及答案的有效應(yīng)用
- 2024年審計(jì)師考試備考寶典試題及答案
- 團(tuán)組織如何提高青年的參與積極性試題及答案
- 中級(jí)會(huì)計(jì)2025年線上模擬試題及答案
- 2024年航空器維修考試全解析試題及答案
- 2024年審計(jì)師考試技巧試題及答案
- 2024年無(wú)人機(jī)導(dǎo)航知識(shí)考試題及答案
- 內(nèi)部審計(jì)與外部審計(jì)比較試題及答案
- 中醫(yī)眼干燥癥試題及答案
- 租電動(dòng)車電子合同協(xié)議
- 紡織服裝產(chǎn)業(yè)鏈的韌性及其空間演變研究
- 2025-2030中國(guó)公路瀝青行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略研究報(bào)告
- 2024年全球及中國(guó)互聯(lián)網(wǎng)輿情監(jiān)測(cè)系統(tǒng)行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年人教版五年級(jí)(下)期中數(shù)學(xué)試卷
- GB/T 196-2025普通螺紋基本尺寸
- 《血小板分離機(jī)》課件
- 快遞云倉(cāng)合同協(xié)議
- 2025-2030功能性飼料行業(yè)市場(chǎng)發(fā)展分析及發(fā)展前景與投資機(jī)會(huì)研究報(bào)告
- 江蘇省常州市2024-2025學(xué)年高一下學(xué)期4月期中考試英語(yǔ)試題(含答案)
評(píng)論
0/150
提交評(píng)論