




版權(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)存足夠,但是由于碎片太多,沒有連續(xù)內(nèi)存時(shí),只能以申請(qǐng)失敗而告終,而用鏈表這種數(shù)據(jù)結(jié)構(gòu)來(lái)組織數(shù)據(jù),就可以解決上類問題。
靜態(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í)候有頭鏈表每次都需要過濾頭節(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),沒有節(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),如果沒有找到插入的位置,那么就插入到最后
*@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;
//如果沒有找到那么就插入到最后
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)鏈表
斷開鏈表頭,然后以頭插法的方式將原鏈表的數(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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 消防婚戀課件
- 貝柔家庭財(cái)產(chǎn)保全與離婚協(xié)議書
- 餐飲行業(yè)廚師派遣及職業(yè)發(fā)展支持合同
- 倉(cāng)儲(chǔ)配送中心建設(shè)與運(yùn)營(yíng)管理合同
- 高端商務(wù)禮品文具采購(gòu)合同模板
- 跨國(guó)公司財(cái)務(wù)報(bào)表編制與披露合同協(xié)議
- 城市綜合體車位購(gòu)置與商業(yè)租賃一體化合同
- 水電站建設(shè)標(biāo)準(zhǔn)工程承包合同
- 成都市車輛租賃公司與保險(xiǎn)公司合作協(xié)議
- 茶葉采摘與加工服務(wù)合同范本
- 外墻真石漆施工的安全防護(hù)與應(yīng)急措施
- 口腔頜面部皮瓣移植修復(fù)術(shù)后護(hù)理學(xué)習(xí)培訓(xùn)課件
- 神經(jīng)科護(hù)士的疼痛管理和舒適護(hù)理
- 親子教育健康養(yǎng)生知識(shí)講座
- 學(xué)前教育畢業(yè)實(shí)習(xí)評(píng)定表
- 浙江省杭州市杭州第二中學(xué)2024屆高三入學(xué)考試數(shù)學(xué)試題
- 城中村改造的法律問題探討
- (2012)149號(hào)文造價(jià)咨詢費(fèi)計(jì)算表
- 思想道德與法治(湖南師范大學(xué))智慧樹知到課后章節(jié)答案2023年下湖南師范大學(xué)
- 房屋衛(wèi)生間閉水實(shí)驗(yàn)情況確認(rèn)單
- 《溫病學(xué)》習(xí)題集-簡(jiǎn)答題+論述題
評(píng)論
0/150
提交評(píng)論