![[工學]Ch11結(jié)構(gòu)體與共用體課件_第1頁](http://file4.renrendoc.com/view/eed64ca4442a4a49efeec9953f9f229e/eed64ca4442a4a49efeec9953f9f229e1.gif)
![[工學]Ch11結(jié)構(gòu)體與共用體課件_第2頁](http://file4.renrendoc.com/view/eed64ca4442a4a49efeec9953f9f229e/eed64ca4442a4a49efeec9953f9f229e2.gif)
![[工學]Ch11結(jié)構(gòu)體與共用體課件_第3頁](http://file4.renrendoc.com/view/eed64ca4442a4a49efeec9953f9f229e/eed64ca4442a4a49efeec9953f9f229e3.gif)
![[工學]Ch11結(jié)構(gòu)體與共用體課件_第4頁](http://file4.renrendoc.com/view/eed64ca4442a4a49efeec9953f9f229e/eed64ca4442a4a49efeec9953f9f229e4.gif)
![[工學]Ch11結(jié)構(gòu)體與共用體課件_第5頁](http://file4.renrendoc.com/view/eed64ca4442a4a49efeec9953f9f229e/eed64ca4442a4a49efeec9953f9f229e5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1第11章 結(jié)構(gòu)體與共用體西南大學 計算機與信息科學學院C 語言程序設(shè)計2022/7/232第11章 結(jié)構(gòu)體與共用體11.1 結(jié)構(gòu)體結(jié)構(gòu)體類型 結(jié)構(gòu)體變量的定義、初始化、運算 結(jié)構(gòu)體指針 結(jié)構(gòu)體與函數(shù) 結(jié)構(gòu)體的應用鏈表2022/7/233 一個學生的信息有學號、姓名、性別、年齡、住址、成績等。 一本圖書的信息有分類編號、書名、作者、出版社、出版日期、價格、庫存量等。 如何描述這些類型不同的相關(guān)數(shù)據(jù)?11.1 結(jié)構(gòu)體11.1.1 結(jié)構(gòu)體與結(jié)構(gòu)體類型的定義?信息管理結(jié)構(gòu)體一種構(gòu)造類型數(shù)據(jù) 結(jié)構(gòu)體由若干不同類型的數(shù)據(jù)項組成, 構(gòu)成結(jié)構(gòu)體的各個數(shù)據(jù)項稱為結(jié)構(gòu)體成員。 2022/7/234 struct
2、 結(jié)構(gòu)體名 數(shù)據(jù)類型1 成員名1; 數(shù)據(jù)類型2 成員名2; 數(shù)據(jù)類型n 成員名n; ;11.1 結(jié)構(gòu)體11.1.1 結(jié)構(gòu)體與結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型定義的一般形式: struct為關(guān)鍵字;結(jié)構(gòu)體名是用戶定義的類型標識。 中是組成該結(jié)構(gòu)體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。2022/7/235例如圖書類型的定義: struct bookcard char num10; /*圖書分類編號是字符數(shù)組類型*/ char name30; /*書名是字符數(shù)組類型*/ char author30; /*作者是字符數(shù)組類型*/ char publisher60; /*出版社是字符數(shù)組類型
3、*/ float price; /*價格是單精度實型*/ int n; /*庫存量是整型*/ ;例如學生類型的定義:struct student char num8; /* 學號是字符數(shù)組類型 */ char name30; /* 姓名是字符數(shù)組類型 */ char sex; /* 性別是字符型 */ int age; /* 年齡是整型 */ char addr60; /* 住址是字符數(shù)組類型 */ int score6; /* 成績是整型數(shù)組類型 */ ;11.1 結(jié)構(gòu)體11.1.1 結(jié)構(gòu)體與結(jié)構(gòu)體類型的定義2022/7/23611.1 結(jié)構(gòu)體11.1.2 結(jié)構(gòu)體變量的定義與初始化1. 結(jié)構(gòu)
4、體類型變量的定義 利用已定義的結(jié)構(gòu)體類型名定義變量 struct 結(jié)構(gòu)體名 變量名表;例如: struct bookcard book1100; struct student s30, t1, t2; 按照結(jié)構(gòu)體類型的組成,系統(tǒng)為定義的結(jié)構(gòu)體變量分配內(nèi)存單元。結(jié)構(gòu)體變量的各個成員在內(nèi)存中占用連續(xù)存儲區(qū)域,結(jié)構(gòu)體變量所占內(nèi)存大小為結(jié)構(gòu)體中每個成員所占用內(nèi)存的長度之和。struct studentnum8個字節(jié)name30個字節(jié)sex1個字節(jié)age2個字節(jié)addr60個字節(jié)score12個字節(jié)2022/7/23711.1 結(jié)構(gòu)體結(jié)構(gòu)體類型與變量的說明類型與變量是不同的概念。應先定義一個結(jié)構(gòu)體類型,
5、而后再定義結(jié)構(gòu)體變量。系統(tǒng)對類型不分配空間,僅對變量分配空間。只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算。成員也可以是結(jié)構(gòu)變量。對結(jié)構(gòu)中的成員,可以單獨使用,它的作用與地位相當于普通變量。成員名可與程序中的變量名相同,不同結(jié)構(gòu)體類型的成員名也可相同,二者代表不同的對象。 struct date int year,month,day; struct student char num8; char name30; char sex; struct date birthday; /* 成員為結(jié)構(gòu)體類型 */ char addr60; int score6; ;num8個字節(jié)name
6、30個字節(jié)sex1個字節(jié)birthdayyear2個字節(jié)month2個字節(jié)day2個字節(jié)addr60個字節(jié)score12個字節(jié)2022/7/23811.1 結(jié)構(gòu)體11.1.2 結(jié)構(gòu)體變量的定義與初始化1. 結(jié)構(gòu)體類型變量的定義 在定義結(jié)構(gòu)體類型的同時定義變量例如: struct student char num8,name20,sex; int age; float score; st30; struct 結(jié)構(gòu)體名 成員定義表; 變量名表;2022/7/23911.1 結(jié)構(gòu)體11.1.2 結(jié)構(gòu)體變量的定義與初始化1. 結(jié)構(gòu)體類型變量的定義 直接定義結(jié)構(gòu)體類型變量 例如: struct char
7、 num8,name20,sex; int age; float score; st30, a, b, c; struct 成員定義表; 變量名表;2022/7/231011.1 結(jié)構(gòu)體11.1.2 結(jié)構(gòu)體變量的定義與初始化2. 結(jié)構(gòu)體變量的初始化 【例】結(jié)構(gòu)體變量的初始化。 struct date int year, month, day; struct student char num8, name20, sex; struct date birthday; float score; a=9606011,Li ming,M,1977,12,9,83, b=9608025,Zhang lim
8、ing,F,1978,5,10,87,c; 如果初值個數(shù)少于結(jié)構(gòu)體成員個數(shù),則將無初值對應的成員賦以0值。 如果初值個數(shù)多于結(jié)構(gòu)體成員個數(shù),則編譯出錯。2022/7/231111.1 結(jié)構(gòu)體11.1.2 結(jié)構(gòu)體變量的定義與初始化2. 結(jié)構(gòu)體變量的初始化 【例】結(jié)構(gòu)體數(shù)組的初始化。 struct s char num8,name20,sex; float score; stu3=9606011,Li ming,M,87.5, 9606012,Zhang jiangguo,M,79, 9606013,Wang ping,F,90; 元素的個數(shù)可以省略,根據(jù)賦初值時結(jié)構(gòu)體常量的個數(shù)確定數(shù)組元素的個數(shù)
9、 2022/7/231211.1 結(jié)構(gòu)體11.1.2 結(jié)構(gòu)體變量的定義與初始化3. 結(jié)構(gòu)體變量的運算 用sizeof運算符計算結(jié)構(gòu)體變量所占內(nèi)存空間 struct date int year, month, day;struct student char num8, name20, sex; struct date birthday; float score; a; sizeof(a) 的結(jié)果為8+20+1+6+4=39 sizeof(struct student) 的結(jié)果為39 2022/7/231311.1 結(jié)構(gòu)體11.1.2 結(jié)構(gòu)體變量的定義與初始化3. 結(jié)構(gòu)體變量的運算 同類型結(jié)構(gòu)體變
10、量之間的賦值運算結(jié)構(gòu)體變量之間進行賦值時,系統(tǒng)將按成員一一對應賦值。struct date int year, month, day;struct student char num8, name20, sex; struct date birthday; float score; a=9606011,Li ming,M,1977,12,9,83,b,c;c = a;2022/7/231411.1 結(jié)構(gòu)體11.1.2 結(jié)構(gòu)體變量的定義與初始化3. 結(jié)構(gòu)體變量的運算 對結(jié)構(gòu)體變量進行取址運算 struct date int year, month, day;struct student char
11、num8, name20, sex; struct date birthday; float score; a; 對結(jié)構(gòu)體變量a進行 &a 運算,可以得到a的首地址,它是結(jié)構(gòu)體類型指針。 2022/7/231511.1 結(jié)構(gòu)體11.1.2 結(jié)構(gòu)體變量的定義與初始化4. 結(jié)構(gòu)體變量成員的引用 結(jié)構(gòu)體變量成員引用的一般形式: 結(jié)構(gòu)體變量名.成員名 結(jié)構(gòu)體變量a的各成員可分別表示為a.num、、a.sex、a.birthday、a.score struct date int year, month, day; struct student char num8, name20, sex;
12、struct date birthday; float score; a;“.”是分量運算符,運算級別最高。a.birthday.yeara.birthday.montha.birthday.day 結(jié)構(gòu)體變量的各個成員可進行何種運算,由該成員的數(shù)據(jù)類型決定 2022/7/231611.1 結(jié)構(gòu)體11.1.2 結(jié)構(gòu)體變量的定義與初始化【例】編寫一個統(tǒng)計選票的程序。 struct candidate char name20; /* name為候選人姓名 */ int count; /* count為候選人得票數(shù) */ list=invalid,0,Zhao,0,Qian,0, Sun,0,Li,
13、0,Zhou,0;2022/7/231711.1 結(jié)構(gòu)體11.1.2 結(jié)構(gòu)體變量的定義與初始化main( ) int i,n; printf(Enter voten); scanf(%d,&n); /* 輸入所投候選人編號,編號從1開始 */ while (n!=-1) /* 當輸入編號為-1時,表示投票結(jié)束 */ if (n=1 & n=5) listn.count+; /* 有效票,則相應候選人計票成員加1 */ else printf(invalidn); list0.count+; /* 無效票,list0的計票成員加1 */ scanf(%d,&n); /* 輸入所投候選人編號 */
14、 2022/7/231811.1 結(jié)構(gòu)體11.1.2 結(jié)構(gòu)體變量的定義與初始化for (i=1; iyear p-month p-day“-”是指向結(jié)構(gòu)體成員運算符,優(yōu)先級為一級 2022/7/232111.1 結(jié)構(gòu)體11.1.3 結(jié)構(gòu)體的指針 【例】輸入今天的日期,然后輸出該日期。 main( ) struct date /* 在函數(shù)中定義結(jié)構(gòu)體類型 */ int year, month, day; today,*p=&today; /* 定義結(jié)構(gòu)體變量及其指針 */ printf (Enter today date(YYYY/MM/DD):); scanf(%d/%d/%d,&today.
15、year,&today.month, &today.day); printf(Today:%d/%d/%dn,p-year,p-month, p-day); 2022/7/232211.1 結(jié)構(gòu)體11.1.3 結(jié)構(gòu)體的指針3. 指向結(jié)構(gòu)體數(shù)組的指針 【例】利用結(jié)構(gòu)體指針輸出一組化學 元素名稱及其原子量。 struct list int i; char name4; float w; tab4=1,H,1.008,2,He,4.0026, 3,Li,6.941,4,Be,9.01218;tab數(shù)組1Htab01.0082Hetab14.00263Litab26.9414Betab39.01218
16、2022/7/232311.1 結(jié)構(gòu)體11.1.3 結(jié)構(gòu)體的指針3. 指向結(jié)構(gòu)體數(shù)組的指針 main( ) struct list *p; printf(NotNametAtomic Weightn); for (p=tab; pi, p-name, p-w); tab數(shù)組1Htab01.0082Hetab14.00263Litab26.9414Betab39.01218pppppNo Name Atomic Weight1 H 1.0082 He 4.00263 Li 6.9414 Be 9.012182022/7/232411.1 結(jié)構(gòu)體11.1.3 結(jié)構(gòu)體的指針【例】分析自增自減運算對程
17、序結(jié)果的影響。 struct code int i; char c; a =100,A,200,B, 300,C,400,D;a數(shù)組100a0A200a1B300a2C400a3D2022/7/232511.1 結(jié)構(gòu)體11.1.3 結(jié)構(gòu)體的指針main( ) struct code *p=a; printf(%dt,+p-i); printf(%ct,(+p)-c); printf(%dt,(p+)-i); printf(%ct,+p-c); printf(%dt,p-i+); printf(%dn,p-i); a數(shù)組100a0A200a1B300a2C400a3Dp101D301101B20
18、0D3003012022/7/232611.1 結(jié)構(gòu)體11.1.4 函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞方法一:在函數(shù)之間直接傳遞結(jié)構(gòu)體數(shù)據(jù)。 函數(shù)的形參定義為結(jié)構(gòu)體變量。函數(shù)調(diào)用時,可將主調(diào)函數(shù)的結(jié)構(gòu)體類型實參傳遞給被調(diào)函數(shù)的形參。方法二:使用return語句帶回數(shù)據(jù)。 如果將函數(shù)定義為結(jié)構(gòu)體類型函數(shù),可利用return語句將一個結(jié)構(gòu)體數(shù)據(jù)結(jié)果返回到主調(diào)函數(shù)中。2022/7/232711.1 結(jié)構(gòu)體11.1.4 函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞方法三:在函數(shù)之間傳遞結(jié)構(gòu)體指針。 形參定義為指向結(jié)構(gòu)體類型的指針變量,可將主調(diào)函數(shù)的結(jié)構(gòu)體指針傳遞給被調(diào)函數(shù)的形參變量,通過指針形參的指向域的擴展,操作主調(diào)函數(shù)中結(jié)構(gòu)體變量
19、及其成員。方法四:利用全局結(jié)構(gòu)體變量傳遞結(jié)構(gòu)體數(shù)據(jù)。2022/7/232811.1 結(jié)構(gòu)體11.1.4 函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞 【例】編制一個復數(shù)乘法函數(shù),采用值傳遞的方 法傳送數(shù)據(jù)。 struct complex /* 定義存放復數(shù)的結(jié)構(gòu)體類型 */ float re; /* re成員用于存放復數(shù)的實部 */ float im; /* im成員用于存放復數(shù)的虛部 */ ;2022/7/232911.1 結(jié)構(gòu)體11.1.4 函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞struct complex multiplier(struct complex cx, struct complex cy) struct comp
20、lex cz; cz.re=cx.re*cy.re-cx.im*cy.im; cz.im=cx.re*cy.im+cx.im*cy.re; return(cz); 形參是結(jié)構(gòu)體變量。調(diào)用此函數(shù)時,系統(tǒng)將分別為形參cx和cy各分配一個sizeof(struct complex) 大小的內(nèi)存空間,每個成員都要一一傳遞。 2022/7/233011.1 結(jié)構(gòu)體11.1.4 函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞main( ) struct complex x, y, z; x.re=3.2; x.im=1.5; y.re=2.7; y.im=4.6; z=multiplier(x, y); printf(%f+%f
21、in,z.re,z.im); /*以復數(shù)形式輸出*/ 2022/7/233111.1 結(jié)構(gòu)體11.1.4 函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞 【例】編制一個復數(shù)乘法函數(shù),采用傳遞指針 的方法達到傳送數(shù)據(jù)的目的。 struct complex float re,im; void multiplier(struct complex *px, struct complex *py, struct complex *pz) pz-re=px-re*py-re-px-im*py-im; pz-im=px-re*py-im+px-im*py-re; 形參定義為指針型參數(shù)。函數(shù)調(diào)用時,實參傳遞的是結(jié)構(gòu)體指針(地址),因
22、此形參px、py可讀取主調(diào)函數(shù)中變量的內(nèi)容,乘積結(jié)果也可通過形參pz指針存到主調(diào)函數(shù)中的目標變量。這樣實參與形參之間的數(shù)據(jù)傳遞由多值(每個成員的值)變成了單值(結(jié)構(gòu)體變量的首地址)。 2022/7/233211.1 結(jié)構(gòu)體11.1.4 函數(shù)間結(jié)構(gòu)體數(shù)據(jù)的傳遞main( ) struct complex x, y, z; x.re=3.2; x.im=1.5; y.re=2.7; y.im=4.6; multiplier(&x,&y,&z); printf(%f+%fi)*(%f+%fi)=%f+%fin,x.re,x.im, y.re, y.im, z.re, z.im); 2022/7/23
23、33 鏈表是一種動態(tài)數(shù)據(jù)結(jié)構(gòu),可根據(jù)需要動態(tài)地分配存儲單元。在數(shù)組中,插入或刪除一個元素都比較繁瑣,而用鏈表則相對容易。但是數(shù)組元素的引用比較簡單,對于鏈表中結(jié)點數(shù)據(jù)的存取操作則相對復雜。 11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表 鏈表中每個元素稱為一個結(jié)點。 構(gòu)成鏈表的結(jié)點必須是結(jié)構(gòu)體類型數(shù)據(jù)。1. 鏈表的基本結(jié)構(gòu) head 1000 1032 3284 1296 1382 2008 動態(tài)單向鏈表示意圖C3284H1296A1382I2008NNULL10001032 相鄰結(jié)點的地址不一定是連續(xù)的,依靠指針將 它們連接起來。struct nodechar c; struct node
24、*next; ;2022/7/2334 C語言提供了相關(guān)的存儲管理庫函數(shù)。這里僅介紹其中三個,它們的原型說明在“stdlib.h”頭文件和“malloc.h”頭文件中,使用這三個函數(shù)時,應選擇其中一個頭文件包含到源程序中。 動態(tài)分配存儲區(qū)函數(shù)malloc( ) 函數(shù)原型:void *malloc(unsigned size); 調(diào)用格式:malloc(size) 功能:在內(nèi)存分配一個size字節(jié)的存儲區(qū)。調(diào)用 結(jié)果為新分配的存儲區(qū)的首地址,是一個void 類型指針。若分配失敗,則返回NULL(即0)。11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表2. 動態(tài)分配和釋放存儲單元 在ANSI C標準
25、中,關(guān)鍵字void有兩種用法。第一種用法,可將無返回值的函數(shù)定義為void類型第二種用法,用void * 定義指針,這是一個指向非具體數(shù)據(jù)類型的指針,稱為無類型指針。 2022/7/2335【例】調(diào)用malloc函數(shù)分配所需存儲單元。 #include main( ) struct st int n; struct st *next; *p; p=(struct st *)malloc(sizeof(struct st); p-n=5; p-next=NULL; printf(p-n=%dtp-next=%xn,p-n,p-next); 11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表2. 動態(tài)
26、分配和釋放存儲單元 將函數(shù)返回值轉(zhuǎn)換成結(jié)構(gòu)體指針 2022/7/2336 動態(tài)分配存儲區(qū)函數(shù)calloc( ) 函數(shù)原型: void *calloc(unsigned int n,unsigned int size); 調(diào)用格式:calloc(n,size) 功能:在內(nèi)存分配一個n倍size字節(jié)的連續(xù)存儲區(qū)。調(diào)用結(jié)果為新分配的存儲區(qū)的首地址,是一個void類型指針。若分配失敗,則返回NULL(即0)。11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表2. 動態(tài)分配和釋放存儲單元 2022/7/2337【例】調(diào)用calloc函數(shù)分配所需存儲單元。 #include main( ) int i,*ip
27、; ip=(int *)calloc(10,2); for (i=0; i10; i+) scanf(%d,ip+i); for (i=0; iname,name) gets(p-tel) p-next=NULL h=NULL T F h指向第一個 連接新結(jié)點 結(jié)點 h=p q-next=p q指向新的尾結(jié)點 q=p 讀入一個學生姓名 建立單向鏈表NULLhpChang62783410NULLWang63212986NULLpq 2022/7/2340 strcpy(p-name,name); /* 為新結(jié)點中的成員賦值 */ printf(tel: ); gets(p-tel); p-nex
28、t=NULL; if (h=NULL) /* h為空,表示新結(jié)點為第一個結(jié)點 */ h=p; /* 頭指針指向第一個結(jié)點 */ else /* h不為空 */ q-next=p; /* 新結(jié)點與尾結(jié)點相連接 */ q=p; /* 使q指向新的尾結(jié)點 */ printf(name: ); gets(name); return h; struct node *create( ) static struct node *h; struct node *p,*q; char name20; h=NULL; printf(name: ); gets(name); while (strlen(name)!
29、=0) /* 當輸入的姓名不是空串循環(huán) */ p=NEW; /* 開辟新結(jié)點 */ if (p=NULL) /* p為NULL,新結(jié)點分配失敗 */ printf(Allocation failuren); exit(0); /* 結(jié)束程序運行 */ #include #include #define NEW (struct node *)malloc(sizeof(struct node)struct node char name20,tel9; struct node *next; ;11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表main( ) struct node *head; hea
30、d=create( ); 2022/7/2341【例】輸出學生電話簿鏈表函數(shù)。11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表4. 輸出單向鏈表中各結(jié)點信息 hpChang62783410Li68752341NULLWang63212986 p指向第一個結(jié)點 p=head 當p不為NULL 輸出結(jié)點數(shù)據(jù) p指向下一個結(jié)點 p=p-next 輸出鏈表的N-S圖pppNULL2022/7/2342void prlist(struct node *head) struct node *p; p=head; while (p!=NULL) printf(%st%sn,p-name,p-tel); p=p
31、-next; #include #include #define NEW (struct node *)malloc(sizeof(struct node)struct node char name20,tel9; struct node *next; ;11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表main( ) struct node *head; head=create( ); prlist(head); 2022/7/2343 在鏈表中,如果要刪除第i個結(jié)點,一般是將第(i-1)個結(jié)點直接與第(i+1)個結(jié)點相連接,然后再釋放第i個結(jié)點的存儲單元 。11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體
32、的應用鏈表5. 刪除單向鏈表中指定的結(jié)點 hNULL第i-1個結(jié)點 第i個結(jié)點 第i+1個結(jié)點 2022/7/2344【例】刪除學生電話簿鏈表中指定學生的信息。11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表hpChang62783410Li68752341NULLWang63212986(a) 刪除中間結(jié)點或尾結(jié)點 (q-next=p-next)p q2022/7/2345【例】刪除學生電話簿鏈表中指定學生的信息。11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表hpChang62783410Li68752341NULLWang63212986(b) 刪除第一個結(jié)點 (head=p-next)20
33、22/7/2346【例】刪除學生電話簿鏈表中指定學生的信息。11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表hpChang62783410Li68752341NULLWang63212986pp(c) 未找到指定的結(jié)點 (strcmp(x,p-name)!=0) qq 2022/7/2347【例】刪除學生電話簿鏈 表中指定學生的信息。11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表 p=head while(strcmp(x,p-name)!=0 & p-next!=NULL) q指針跟隨p指針后移查找 (q=p;p=p-next;) strcmp(x,p-name)=0 T F p=head T
34、 F head=p-next q-next=p-next 沒找到 free(p) 刪除鏈表中指定結(jié)點的N-S圖刪除第一個結(jié)點 刪除中間結(jié)點或尾結(jié)點 刪除結(jié)點工作分兩步:查找結(jié)點刪除結(jié)點學生姓名當姓名不同并且不是尾結(jié)點循環(huán)2022/7/2348 if (strcmp(x,p-name)=0) if (p=head) head=p-next; /* 刪除頭結(jié)點 */ else q-next=p-next; /* 刪除中間或尾結(jié)點 */ free(p); /* 釋放被刪除的結(jié)點 */ else printf(Not found.); /* 未找到指定的結(jié)點 */ h=head; return h;#
35、include #include #define NEW (struct node *)malloc(sizeof(struct node)struct node char name20,tel9; struct node *next; ;11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表struct node *delnode(struct node *head, char *x) struct node *p,*q; static struct node *h; if (head=NULL) printf(This is a empty list.); /* 空鏈表情況 */ return h
36、ead; p=head; while (strcmp(x,p-name)!=0 & p-next!=NULL) q=p;p=p-next; /* q指針尾隨p指針向表尾移動 */查找結(jié)點 2022/7/2349 將一個新結(jié)點插入到鏈表中,首先要尋找插入的位置。如果要求在第i個結(jié)點前插入,可設(shè)置三個工作指針p0、p和q,p0是指向待插入結(jié)點的指針。利用p和q指針查找第i個結(jié)點,找到后再將新結(jié)點鏈接到鏈表上。 11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表6. 在單向鏈表中插入結(jié)點 hNULL第i個結(jié)點ppqqp0p新的第i個結(jié)點2022/7/2350【例】在學生電話簿鏈表中插入一個學生的信息。要
37、求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表hpChang62783410Li68752341NULLWang63212986(a) 在表頭插入結(jié)點 (head=p0; p0-next=p)Zhao62758421p02022/7/2351【例】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表hChang62783410Li68752341NULLWang63212986(b) 在表中間插入結(jié)點 (q-nex
38、t=p0; p0-next=p)pqZhao62758421p02022/7/2352【例】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表hpChang62783410Li68752341NULLWang63212986pp(c) 在表尾追加結(jié)點 (p-next=p0; p0-next=NULL) qq Zhao62758421p0Zhao62758421NULL2022/7/2353 head=NULL T F p=head head=p0 while(strcmp(x,p-na
39、me)!=0 & p-next!=NULL) p0-next q指針跟隨p指針后移查找 (q=p;p=p-next;) =NULL strcmp(x,p-name)=0 T F p=head T F p-next=p0 head=p0 q-next=p0 p0-next=NULL p0-next=p在鏈表指定位置前插入結(jié)點的N-S圖【例】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。 11.1 結(jié)構(gòu)體11.1.5 結(jié)構(gòu)體的應用鏈表當姓名不同并且不是尾結(jié)點循環(huán)空表時插入結(jié)點在表尾追加結(jié)點 插入結(jié)點工作分兩步:查找插入位置連接新結(jié)
40、點在表頭插入結(jié)點 在表中間插入結(jié)點 2022/7/2354 if (strcmp(x,p-name)=0) if (p=head) head=p0; /* 在表頭插入結(jié)點 */ else q-next=p0; /* 在表中間插入結(jié)點 */ p0-next=p; else p-next=p0; /* 在表尾插入結(jié)點 */ p0-next=NULL; h=head; return h; struct node *insert(struct node *head, struct node *p0, char *x) struct node *p,*q; static struct node *h; if (head=NULL) head=p0; /* 空表時,插入結(jié)點 */ p0-next=NULL; else p=head; while (strcmp(x,p-name)!=0 & p-next!=NULL) q=p;p=q-next; 查找插入點 11.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國康復醫(yī)療服務行業(yè)市場規(guī)模測算邏輯模型
- 2025年度南京地區(qū)建筑勞務派遣合作協(xié)議書
- 2025年度安防技術(shù)研發(fā)合伙人股份協(xié)議
- 二零二五年度荒山承包合同(生態(tài)修復與水源保護)
- 便利店裝修施工合同范本
- 2025年度簽待崗協(xié)議對員工職業(yè)生涯規(guī)劃指導手冊
- 2025年度平房房屋出租合同(含周邊商業(yè)合作權(quán)益)
- 2025年湖南體育職業(yè)學院單招職業(yè)傾向性測試題庫完整
- 2025年湖南商務職業(yè)技術(shù)學院單招職業(yè)技能測試題庫必考題
- 2024年三季度報重慶地區(qū)A股主營業(yè)務收入增長率排名前十大上市公司
- 大班-數(shù)學-分禮物-課件(互動版)
- (完整版)餐飲員工入職登記表
- 智能化工程施工工藝圖片講解
- 人教版小學五年級數(shù)學下冊教材解讀
- 2022年最新蘇教版五年級下冊科學全冊教案
- 咳嗽與咳痰課件
- 咖啡樹的修剪方法和技術(shù)_種植技巧
- 小學四年級數(shù)學奧數(shù)應用題100題
- 綜合布線驗收報告材料
- 《初三心理健康教育》ppt課件
- 重慶鐵塔公司配套設(shè)備安裝施工服務技術(shù)規(guī)范書
評論
0/150
提交評論