【正文】
值是鏈表的頭指針。 } 鏈表結(jié)點(diǎn)的插入 例 87 用插入結(jié)點(diǎn)的方法建立圖示的學(xué)生成績(jī)鏈表 , 鏈表 head有 10個(gè)結(jié)點(diǎn) ,每個(gè)結(jié)點(diǎn)存儲(chǔ)一個(gè)學(xué)生的學(xué)號(hào)和學(xué)習(xí)成績(jī)數(shù)據(jù) 。 pnext=new。 headnext=NULL。 newdata=x。 d a t a 1 d a t a 2 d a t a 3 d a t a 4 ∧h e a dpd a t an e w結(jié) 點(diǎn) A 結(jié) 點(diǎn) B 結(jié) 點(diǎn) C 結(jié) 點(diǎn) Dd a t a 1 d a t a 2 d a t a 3 n e w d a t a 4 ∧h e a dpd a t a結(jié) 點(diǎn) A 結(jié) 點(diǎn) B 結(jié) 點(diǎn) C 結(jié) 點(diǎn) D 鏈表結(jié)點(diǎn)的插入 ? insert()函數(shù) 功能:在 head鏈表的 p結(jié)點(diǎn)之后插入值為 x的結(jié)點(diǎn) struct student *insert(struct node *head,struct node *p,int x) { struct node *new。 ⑵ 把 new的首地址存儲(chǔ)到結(jié)點(diǎn) p的指針域中 。 ⑴ 使 new的指針域存儲(chǔ)結(jié)點(diǎn) D的首地址。 n e w d a ta n e x th e a d d a t a∧ 鏈表結(jié)點(diǎn)的插入 2.在 head鏈表的 p結(jié)點(diǎn)之后插入一個(gè)結(jié)點(diǎn) head鏈表和要插入結(jié)點(diǎn) new如圖所示。 ① 將 new的 next成員置空,使 new結(jié)點(diǎn)成為鏈表的最后一個(gè)結(jié)點(diǎn)。 將要存儲(chǔ)的數(shù)據(jù)對(duì)應(yīng)賦值給 p結(jié)點(diǎn)數(shù)據(jù)域的各個(gè)成員。 new=(struct node *)calloc(1,sizeof(struct node))。 鏈表結(jié)點(diǎn)的插入 1.在空鏈表中插入一個(gè)結(jié)點(diǎn) 空鏈表就是頭指針 head為空的鏈表。 必須的成員,否則構(gòu)不成鏈表 ?學(xué)生鏈表的結(jié)點(diǎn)定義 ?結(jié)點(diǎn) 鏈表的基本操作 ? 鏈表結(jié)點(diǎn)的插入 ? 鏈表結(jié)點(diǎn)的刪除 ? 鏈表結(jié)點(diǎn)的查找 鏈表結(jié)點(diǎn)的插入 ? 在鏈表中插入結(jié)點(diǎn),就是把一個(gè)新結(jié)點(diǎn)連接到鏈表中。 struct student *next。 char sex。 n e w d a ta n e x t存儲(chǔ)具體數(shù)據(jù) 存儲(chǔ)下一個(gè)節(jié)點(diǎn)的地址 d a t a 1 d a t a 2 d a t a 3 d a t a n ∧. . .h e a d?struct node類(lèi)型的結(jié)點(diǎn)形成的鏈表 頭指針 空指針 定義鏈表結(jié)構(gòu) 9 9 0 1l i u j i aM8 79 9 0 2w a n g k a iM8 99 9 0 3x i a o h u aF8 1N U L Lh e a d學(xué)號(hào) 姓名 性別 成績(jī) 9901 liujia M 87 9902 wangkai M 89 9903 xiaohua F 81 9904 zhangli F 82 9905 wangfeng M 88 struct student { int num。 struct node *next。 定義鏈表結(jié)構(gòu) ? 要定義一個(gè)鏈表結(jié)點(diǎn)的結(jié)構(gòu),須有兩項(xiàng)內(nèi)容: ? 定義數(shù)據(jù)存儲(chǔ)所對(duì)應(yīng)的各個(gè)成員; ? 定義指向其他結(jié)點(diǎn)的指針成員。 例如: int *p。 ?功能 以 size為單位大小共分配 n*size個(gè)字節(jié)的連續(xù)空間,并將該空間的首地址作為函數(shù)的返回值。 ?功能 釋放以前分配給指針變量 block的動(dòng)態(tài)空間,但指針變量 block不會(huì)自動(dòng)變成空指針。 p=(int *)malloc(sizeof(int))。由于返回的指針的基類(lèi)型為 void,應(yīng)該通過(guò)顯式類(lèi)型轉(zhuǎn)換后才能存入其他基類(lèi)型的指針變量中,否則會(huì)有警告提示。 ?功能 分配一塊長(zhǎng)度為 size字節(jié)的連續(xù)空間,并將該空間的首地址作為函數(shù)的返回值。鏈表每一個(gè)結(jié)點(diǎn)的建立和刪除過(guò)程,都需要使用動(dòng)態(tài)內(nèi)存管理函數(shù)。 動(dòng)態(tài)內(nèi)存管理函數(shù) ?動(dòng)態(tài)分配內(nèi)存 按需分配內(nèi)存,申請(qǐng)獲得制。 鏈表的特點(diǎn) ⑴ 鏈表中的結(jié)點(diǎn)具有完全相同的結(jié)構(gòu),每一個(gè)結(jié)點(diǎn)存儲(chǔ)一個(gè)獨(dú)立的結(jié)構(gòu)體數(shù)據(jù); ⑵ 鏈表的結(jié)點(diǎn)由系統(tǒng)隨機(jī)分配,它們?cè)趦?nèi)存中的位置可能是相鄰的,也可能是不相鄰的,結(jié)點(diǎn)之間的聯(lián)系是通過(guò)指針域?qū)崿F(xiàn)的; ⑶ 為了能準(zhǔn)確的定位第一個(gè)結(jié)點(diǎn),每個(gè)鏈表要有一個(gè)表頭指針,從第一個(gè)結(jié)點(diǎn)開(kāi)始,沿指針鏈能遍歷鏈表中的所有結(jié)點(diǎn); ⑷ 鏈表中的結(jié)點(diǎn)是在需要時(shí)用 calloc()申請(qǐng)的,當(dāng)不再需要時(shí),應(yīng)有 free()函數(shù)釋放所占用的內(nèi)存段。 ⑶ 若當(dāng)前是第一個(gè)數(shù)據(jù),則將 M的首地址保存在指針變量 head中;否則將 M的首地 保存在上一個(gè)內(nèi)存段中。 9 9 0 1l i u j i aM8 79 9 0 2w a n g k a iM8 99 9 0 3x i a o h u aF8 1N U L Lh e a d學(xué)號(hào) 姓名 性別 成績(jī) 9901 liujia M 87 9902 wangkai M 89 9903 xiaohua F 81 9904 zhangli F 82 9905 wangfeng M 88 ⑴ 用 calloc()申請(qǐng)一段內(nèi)存 M,并把它分成兩部分:一部分存儲(chǔ)數(shù)據(jù);另一部分存儲(chǔ)下一個(gè)內(nèi)存段的地址。 結(jié)構(gòu)體數(shù)組名 鏈表概述 ? 使用鏈表存儲(chǔ)學(xué)生信息 ? 鏈表的特點(diǎn) ? 動(dòng)態(tài)內(nèi)存管理函數(shù) ? 定義鏈表結(jié)構(gòu) 鏈表的概念 ? 鏈表 是結(jié)構(gòu)體最重要的應(yīng)用,它 是一種非固定長(zhǎng)度的數(shù)據(jù)結(jié)構(gòu) , 是一種動(dòng)態(tài)存儲(chǔ)技術(shù) ,它能夠根據(jù)數(shù)據(jù)的結(jié)構(gòu)特點(diǎn)和數(shù)量使用內(nèi)存,尤其適用于數(shù)據(jù)個(gè)數(shù)可變的數(shù)據(jù)存儲(chǔ)。,88}。,82,9915,wangjun ,39。,81,9914, zhanghua,39。 }stu[N]={9913,xiaoli,39。 char sex。 } /* program */ include include define N 3 struct student { int num。i++,p++) printf(%d%20s%3c%4d\n, pnum,pname,psex,pscore)。 for(i=0。 return 0。 } 共 3組初始化數(shù)據(jù) 結(jié)構(gòu)體指針變量 int main() { void output(struct sudent *,int)。p++) printf(%d%20s%3c%4d\n,pnum,pname,psex,pscore)。 for(p=stu。,88}。,82,9915,wangjun,39。,81,9914,zhanghua,39。 }s