版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第C語言深入探索之單鏈表與typedef的用法目錄前言詳解typedef關(guān)鍵字含義具體使用詳解單鏈表參數(shù)形式指針知識補(bǔ)充單鏈表形參詳解單鏈表實戰(zhàn)案例完整代碼實現(xiàn)詳解頭插建表運(yùn)行效果
前言
昨天博主去本站問答貼子逛了逛,然后發(fā)現(xiàn)了好多關(guān)于數(shù)據(jù)結(jié)構(gòu)線性表,具體來說是單鏈表的問題。有的是沒有一點(diǎn)思路,無從下手;有的是看不懂代碼,不理解關(guān)鍵字以及被形參的形式氣的不行,我總結(jié)了一下常見問題來給大家?guī)砀韶?,到后面還有簡單案例來鞏固知識,弄透一題勝無腦刷百題,接下來是正文內(nèi)容。
詳解typedef關(guān)鍵字
含義
C語言允許用戶使用typedef關(guān)鍵字來定義自己習(xí)慣的數(shù)據(jù)類型名稱,來替代系統(tǒng)默認(rèn)的基本類型名稱、數(shù)組類型名稱、指針類型名稱與用戶自定義的結(jié)構(gòu)型名稱、共用型名稱、枚舉型名稱等。一旦用戶在程序中定義了自己的數(shù)據(jù)類型名稱,就可以在該程序中用自己的數(shù)據(jù)類型名稱來定義變量的類型、數(shù)組的類型、指針變量的類型與函數(shù)的類型等。
具體使用
單鏈表結(jié)點(diǎn)示例:
typedefstructnode
intdata;//數(shù)據(jù)域
structnode*next;//指針域
}Lnode,*SLinkList;
這里我們創(chuàng)建了node結(jié)構(gòu)體,結(jié)構(gòu)體里面包含了整型數(shù)據(jù)data,指針next指向下一個結(jié)點(diǎn)的地址??梢钥吹较旅娲罄ㄌ柾庥蠰node和*SLinkList。他的意思就是我們給node起了一個別名叫Lnode,Lnode具有和node相同的結(jié)構(gòu),structnoden1與Lnoden1效果完全相同;同時C語言還允許在結(jié)構(gòu)中包含指向它自己的指針,即SLinkListL等價于structnode*L或者Lnode*L;
詳解單鏈表參數(shù)形式
指針知識補(bǔ)充
示例:
//1、
int*getValue1(int*L)
inta=10;
L=
returnL;
int*getValue2(int*L)
inta=10;
L=
returnL;
intmain()
int*ptr=(int*)malloc(sizeof(int)*4);
getValue1(ptr);
getValue2(ptr);
cout*ptrendl;
}
我在主函數(shù)中為指針ptr動態(tài)分配了內(nèi)存空間,大小為4*4字節(jié),不理解的可以參考我的這篇博文詳解數(shù)據(jù)結(jié)構(gòu)線性表里面的動態(tài)分布內(nèi)存函數(shù)malloc;然后將地址傳遞到上面兩個函數(shù)里面去,輸出getValue1的*ptr結(jié)果是10,但是getValue2中*ptr的結(jié)果卻是亂碼。那么原因很明顯,就是參數(shù)int*L和int*L的區(qū)別了。這個函數(shù)的返回值是一個地址,然而在棧區(qū)開辟的數(shù)據(jù),在函數(shù)調(diào)用結(jié)束后就會被編譯器自動釋放掉,從而返回的地址不會是a,因此僅僅使用地址傳遞是不行的。那么加上為什么就可以了呢,這是因為我們的目的是改變傳入指針?biāo)赶虻牡刂罚谝环N只能改變該地址對應(yīng)的數(shù)值,第二種可以從本質(zhì)上更改地址,所以能得到a從而*ptr結(jié)果為10。
單鏈表形參詳解
示例:
typedefstructnode
intdata;//數(shù)據(jù)域
structnode*next;//指針域
}Lnode,*SLinkList;
SLinkListInit_List(Lnode*L)
L=(SLinkList)malloc(sizeof(Lnode));
L-next=NULL;
returnL;
}
同樣的,根據(jù)我前面講的知識,我定義了一個SLinkList指針型的初始化鏈表函數(shù)Init_List(),傳入的是結(jié)構(gòu)體指針變量L,接下來為L分配內(nèi)存空間,這里sizeof(Lnode)是計算了結(jié)構(gòu)體Lnode所占內(nèi)存大小并將此內(nèi)存分配給L,接下來讓初始化L,讓其指針域為空。實際上L-data=NULL,L就是單鏈表中的頭結(jié)點(diǎn)。這段代碼是沒有問題的,但是如果把形參中的Lnode*L,改為Lnode*L,那么編譯器必然會提示我們,取消對NULL指針的使用,這就是為什么我們要加上的原因,不加返回的不是我們分配的指針變量L的地址,那這樣我們的初始化毫無意義,雖然不報錯,但是毫無作用。所以提醒你們寫數(shù)據(jù)結(jié)構(gòu)的時候記住這個小細(xì)節(jié),很重要的!
單鏈表實戰(zhàn)案例
完整代碼實現(xiàn)
#includeiostream
usingnamespacestd;
#defineSIZE10
typedefstructnode
intdata;//數(shù)據(jù)域
structnode*next;//指針域
}Lnode,*SLinkList;
SLinkListInit_List(Lnode*L)
L=(SLinkList)malloc(sizeof(Lnode));
L-next=NULL;
returnL;
SLinkListCreat_List(Lnode*L,intn)//頭插建表
srand((unsignedint)time(NULL));
SLinkListp=L;
for(inti=0;ii++)
inte=rand()%20+1;
SLinkLists=(SLinkList)malloc(sizeof(Lnode));
s-next=p-next;
p-next=s;
s-data=e;
returnL;
intcount_List(Lnode*L)
intcount=0;
SLinkListp=L-next;
while(p)
count++;
p=p-next;
returncount;
intfind_List(SLinkListL,intv)
SLinkListp=L-next;
inti=1;
while(ivp-next)
p=p-next;
i++;
returnp-data;
voiddisplay_List(SLinkListL)
SLinkListp=L-next;
while(p)
coutp-data"";
p=p-next;
intmain()
srand((unsignedint)time(NULL));
intn=rand()%5+5,count=0,v=0;
SLinkListL;
L=Init_List(L);
cout"隨機(jī)插入元素完成:"endl;
L=Creat_List(L,n);
count=count_List(L);
cout"單鏈表長度為:"countendl;
cout"遍歷單鏈表結(jié)果為:"endl;
display_List(L);
coutendl;
cout"要查找元素的位置為:";cinv;
intvalue=find_List(L,v);
cout"查找結(jié)果為:"valueendl;
}
詳解頭插建表
把頭插建表方法復(fù)制過來
SLinkListCreat_List(Lnode*L,intn)//頭插建表
srand((unsignedint)time(NULL));
SLinkListp=L;
for(inti=0;ii++)
inte=rand()%20+1;
SLinkLists=(SLinkList)malloc(sizeof(Lnode));
s-next=p-next;
p-next=s;
s-data=e;
returnL;
}
這里不用管srand((unsignedint)time(NULL));這段代碼是為了產(chǎn)生不同隨機(jī)數(shù),和我講的內(nèi)容沒有什么聯(lián)系;往下看,創(chuàng)建建構(gòu)體指針變量p并把p設(shè)置為頭指針:L是頭結(jié)點(diǎn),p=L,p指向鏈表第一個帶值結(jié)點(diǎn)。進(jìn)入循環(huán)語句,循環(huán)語句n我會利用隨機(jī)數(shù)產(chǎn)生;e是1~20范圍內(nèi)隨機(jī)的一個數(shù)值,結(jié)構(gòu)體指針變量s被動態(tài)分配內(nèi)存空間s-next=pnext;p-next=s;s-data=e;這三行代碼是頭插法的核心。首先待插入原色s指針指向頭結(jié)點(diǎn)指向的結(jié)點(diǎn),然后頭指針指向s,這樣鏈表的鏈就連好了,最后給s的數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 活動策劃培訓(xùn)教程
- 洛陽張繼剛核心素養(yǎng)培訓(xùn)
- 2024-2025學(xué)年江西省上饒市高一下學(xué)期期中考試歷史試題(解析版)
- 2026年教育心理學(xué)基礎(chǔ)測試題庫
- 室內(nèi)造景植物培訓(xùn)課件
- 2026年建筑設(shè)計師建筑結(jié)構(gòu)空間規(guī)劃專業(yè)題庫
- 2026年網(wǎng)絡(luò)安全分析師認(rèn)證模擬試題
- 2026年食品安全與營養(yǎng)健康專題題目
- 2026年中醫(yī)經(jīng)絡(luò)理論穴位辨識與經(jīng)絡(luò)調(diào)理操作試題
- 2026年證券投資顧問考試題庫及答案解析
- 心臟血管檢查課件
- 運(yùn)用PDCA循環(huán)管理提高手衛(wèi)生依從性課件
- 二手房定金合同(2023版)正規(guī)范本(通用版)1
- 點(diǎn)因素法崗位評估體系詳解
- 初中畢業(yè)英語學(xué)業(yè)考試命題指導(dǎo)
- DB63T 1933-2021無人機(jī)航空磁測技術(shù)規(guī)范
- 繪本這就是二十四節(jié)氣春
- 開車前安全環(huán)保檢查表(PSSR )
- 2023年吉林省公務(wù)員錄用考試《行測》真題及答案解析
- 渾河渾南攔河壩海漫改造工程項目環(huán)評報告
- YY/T 1843-2022醫(yī)用電氣設(shè)備網(wǎng)絡(luò)安全基本要求
評論
0/150
提交評論