版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、會計(jì)學(xué)1用戶用戶(yngh)建立的數(shù)據(jù)類型建立的數(shù)據(jù)類型第一頁,共76頁。第1頁/共76頁第二頁,共76頁。第2頁/共76頁第三頁,共76頁。n問題定義:問題定義:n 有時(shí)需要將不同類型的數(shù)據(jù)有時(shí)需要將不同類型的數(shù)據(jù)組合成一個(gè)有機(jī)組合成一個(gè)有機(jī)n的整體,以便于引用。如:的整體,以便于引用。如:n一個(gè)學(xué)生有學(xué)號一個(gè)學(xué)生有學(xué)號/ /姓名姓名/ /性別性別/ /年齡年齡/ /地址地址(dzh)(dzh)等屬性等屬性 int num; int num; char name20;char name20; char sex; char sex;n int age; int char int age; in
2、t char addr30;addr30;n n 應(yīng)當(dāng)把它們組織成一個(gè)組合項(xiàng),在一個(gè)組合項(xiàng)中包含若干個(gè)類型不同(當(dāng)然(dngrn)也可以相同)的數(shù)據(jù)項(xiàng)。 圖9-1100101 Li Fun M 18 87.5 Beijing Num name sex age score addr第3頁/共76頁第四頁,共76頁。n 聲明一個(gè)結(jié)構(gòu)體類型聲明一個(gè)結(jié)構(gòu)體類型(lixng)(lixng)的一般形式的一般形式為:為:n struct struct 結(jié)構(gòu)體名結(jié)構(gòu)體名n 成員表列;成員表列;n如:如:struct studentstruct studentn n int num;char int num;c
3、har name20;char sex;name20;char sex;n int age;float int age;float score;char addr30;score;char addr30;n n n 結(jié)構(gòu)(jigu)體名類型(lixng)名成員名第4頁/共76頁第五頁,共76頁。說明: (1)結(jié)構(gòu)體類型并不是只有一種(y zhn),而是可以設(shè)計(jì)出許多種結(jié)構(gòu)體類型. (2) 成員也可以是一個(gè)結(jié)構(gòu)體變量。 (3)“結(jié)構(gòu)體”這個(gè)詞是根據(jù)英文單詞譯出的。 第5頁/共76頁第六頁,共76頁。n可以采取以下可以采取以下3 3種方法種方法(fngf)(fngf)定義結(jié)構(gòu)定義結(jié)構(gòu)體類型變量:體
4、類型變量:n(1)(1)先聲明結(jié)構(gòu)體類型再定義變量名先聲明結(jié)構(gòu)體類型再定義變量名n例如:例如:struct student struct student student1, student2;student1, student2;n | | | | | | n 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名 n定義了定義了student1student1和和student2student2為為struct struct studentstudent類型的變量,即它們具有類型的變量,即它們具有struct struct studentstudent類型的結(jié)構(gòu)類型的結(jié)構(gòu). .n 圖9-3stu
5、dent1100101 ZhangXin M 19 90.5 Shanghai100102 WangLi F 20 98 Beijingstudent2第6頁/共76頁第七頁,共76頁。 在定義了結(jié)構(gòu)體變量后,系統(tǒng)會為之分配內(nèi)存單元。 例如:student1和student2在Turbo C的內(nèi)存中各占59個(gè)字節(jié)(2+20+1+2+4+30=59)。(2)在聲明類型的同時(shí)(tngsh)定義變量 這種形式的定義的一般形式為: struct結(jié)構(gòu)體名 成員表列 變量名表列; 第7頁/共76頁第八頁,共76頁。例如例如(lr):struct student int num; char name20;
6、char sex; int age; float score; char addr30; student1,student2; 它的作用它的作用(zuyng)與第一種方法相同與第一種方法相同,即定義了兩個(gè),即定義了兩個(gè)struct student 類類型的變量型的變量student1,student2 第8頁/共76頁第九頁,共76頁。(3) (3) 不指定不指定(zhdng)(zhdng)類型名而直接定義結(jié)構(gòu)體類型變類型名而直接定義結(jié)構(gòu)體類型變量量其一般形式為其一般形式為: : struct struct 成員表列成員表列 變量名表列;變量名表列;即不出現(xiàn)結(jié)構(gòu)體名。即不出現(xiàn)結(jié)構(gòu)體名。 第9頁
7、/共76頁第十頁,共76頁。n在定義了結(jié)構(gòu)體變量以后,當(dāng)然可以引用這個(gè)變量。但應(yīng)遵守以下規(guī)則: n (1)同類的結(jié)構(gòu)體變量可以互相賦值,如:nstudent1=student2;n 不能將一個(gè)(y )結(jié)構(gòu)體變量作為一個(gè)(y )整體進(jìn) 行輸入和輸出。n例如: 已定義student1和student2為結(jié)構(gòu)體變量并且它們已有值。nprintf(%d,%s,%c,%d,%f, % n,student1); n 第10頁/共76頁第十一頁,共76頁。引用結(jié)構(gòu)(jigu)體變量中成員的方式為結(jié)構(gòu)(jigu)體變量名.成員名例如, student1.num表示student1變量中的num成員,即stud
8、ent1的num(學(xué)號)項(xiàng)??梢詫ψ兞康某蓡T賦值,例如:student1.num=10010;“.”是成員(分量)運(yùn)算符,它在所有的運(yùn)算符中優(yōu)先級最高,因此可以把student1.num作為一個(gè)整體來看待。上面賦值語句的作用是將整數(shù)10010賦給student1變量中的成員num。 第11頁/共76頁第十二頁,共76頁。(2) 如果(rgu)成員本身又屬一個(gè)結(jié)構(gòu)體類型,則要用若干個(gè)成員運(yùn)算符,一級一級地找到最低的一級的成員。只能對最低級的成員進(jìn)行賦值或存取以及運(yùn)算。例如: 對上面定義的結(jié)構(gòu)體變量student1, 可以這樣訪問各成員: student1.num student1.birthda
9、y.month第12頁/共76頁第十三頁,共76頁。(3) 對結(jié)構(gòu)體變量的成員可以像普通變量一樣進(jìn)行各種( zhn)運(yùn)算(根據(jù)其類型決定可以進(jìn)行的運(yùn)算)。例如: student2.score=student1.score; sum=student1.score+student2.score; student1.age+; +student2.age;由于由于“”運(yùn)算符的優(yōu)先運(yùn)算符的優(yōu)先級最高,因此級最高,因此是對是對進(jìn)行進(jìn)行(jnxng)自加運(yùn)算,而不是先對自加運(yùn)算,而不是先對進(jìn)行進(jìn)行(jnxng)自自加運(yùn)算。加運(yùn)算。第13頁/共76頁第十四頁,共76頁。(4) 可以引用結(jié)構(gòu)體變量(binli
10、ng)成員的地址,也可以引用結(jié)構(gòu)體變量(binling)的地址。例如: scanf(%d,&student1.num); (輸入student1.num的值) printf(%o,student1); (輸出student1的首地址)第14頁/共76頁第十五頁,共76頁。但不能用以下語句(yj)整體讀入結(jié)構(gòu)體變量,例如: scanf(%d,s,c,d,f,s,student1); 結(jié)構(gòu)體變量的地址主要用作函數(shù)參數(shù),傳遞結(jié)構(gòu)體變量的地址。 第15頁/共76頁第十六頁,共76頁。但不能用以下(yxi)語句整體讀入結(jié)構(gòu)體變量,例如: scanf(%d,s,c,d,f,s,student1);
11、 結(jié)構(gòu)體變量的地址主要用作函數(shù)參數(shù),傳遞結(jié)構(gòu)體變量的地址。 例例9.1 對結(jié)構(gòu)對結(jié)構(gòu)(jigu)體變量初始化體變量初始化.#include void main()() struct student long int num; char name20; char sex; char addr20; a=10101,LiLin,M,123 Beijing Road; /* 對結(jié)構(gòu)對結(jié)構(gòu)(jigu)體變量體變量a賦初值賦初值*/printf(No.:%ldnname:%snsex:%cnaddress:%sn,a.num,,a.sex,a.addr); 運(yùn)行結(jié)果:運(yùn)行結(jié)果:No.:101
12、01name:LiLinsex:address:123 Beijing Road第16頁/共76頁第十七頁,共76頁。 一個(gè)結(jié)構(gòu)體變量中可以存放一組數(shù)據(jù)(如一個(gè)學(xué)生的學(xué)號、姓名、成績等數(shù)據(jù))。如果(rgu)有個(gè)學(xué)生的數(shù)據(jù)需要參加運(yùn)算,顯然應(yīng)該用數(shù)組,這就是結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組與以前介紹過的數(shù)值型數(shù)組不同之處在于每個(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)體類型的數(shù)據(jù),它們都分別包括各個(gè)成員(分量)項(xiàng)。 第17頁/共76頁第十八頁,共76頁。9.2.1 定義(dngy)結(jié)構(gòu)體數(shù)組 和定義(dngy)結(jié)構(gòu)體變量的方法相仿,只需說明其為數(shù)組即可。例如:struct studentint num;char name20
13、;char sex;int age; float score;char addr30; ;struct student3; 以上定義了一個(gè)數(shù)以上定義了一個(gè)數(shù)組組stu,數(shù)組有個(gè)元,數(shù)組有個(gè)元素,均為素,均為struct student類型類型(lixng)數(shù)據(jù)。數(shù)據(jù)。第18頁/共76頁第十九頁,共76頁。也可以直接(zhji)定義一個(gè)結(jié)構(gòu)體數(shù)組,例如: struct student int num; ;stu3;或: strcut student int num; ;stu3;圖9-4第19頁/共76頁第二十頁,共76頁。9.2.2 結(jié)構(gòu)(jigu)體數(shù)組的初始化 與其他類型的數(shù)組一樣,對結(jié)構(gòu)
14、(jigu)體數(shù)組可以初始化。例如:struct studentint num;char name20; char sex; int age; float score; char addr30; ;stu210101,LiLin,M,18,87.5,103 BeijingRoad,10102,Zhang Fun,M,19,99,130 Shanghai Road; 圖9-5第20頁/共76頁第二十一頁,共76頁。當(dāng)然(dngrn),數(shù)組的初始化也可以用以下形式:struct student int num; ; struct studentstr,; 即先聲明結(jié)構(gòu)體類型,然后定義數(shù)組為該結(jié)構(gòu)體
15、類型,在定義數(shù)組時(shí)初始化。 結(jié)構(gòu)體數(shù)組初始化的一般形結(jié)構(gòu)體數(shù)組初始化的一般形式式(xngsh)是在定義數(shù)組是在定義數(shù)組的后面加上的后面加上“初值表列初值表列;”。第21頁/共76頁第二十二頁,共76頁。9.2.3 結(jié)構(gòu)(jigu)體數(shù)組應(yīng)用舉例例例9.2對候選人得票的統(tǒng)計(jì)程序。設(shè)有對候選人得票的統(tǒng)計(jì)程序。設(shè)有3個(gè)候選人,每次輸入個(gè)候選人,每次輸入一個(gè)得票的候選人的名字,要求一個(gè)得票的候選人的名字,要求(yoqi)最后輸出各人得票最后輸出各人得票結(jié)果。結(jié)果。#include #include struct person char name20;in count; ;leader3=“Li”,0,
16、”Zhang”,0,”Fun”,0第22頁/共76頁第二十三頁,共76頁。例例9.2void main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; printf(“n”); for(i=0;i3;i+) printf(“%5s:%dn”,,leaderi.count);運(yùn)行運(yùn)行(ynxng)(ynxng)結(jié)果:結(jié)果: : : : :
17、第23頁/共76頁第二十四頁,共76頁。 程序定義一個(gè)全局的結(jié)構(gòu)體數(shù)組leader,它有個(gè)元素(yun s),每一個(gè)元素(yun s)包含兩個(gè)成員name(姓名)和count(票數(shù))。在定義數(shù)組時(shí)使之初始化,使3位候選人的票數(shù)都先置零. 在主函數(shù)中定義字符數(shù)組leader-name,它代表被選人的姓名,在10次循環(huán)中每次先輸入一個(gè)被選人的具體人名,然后把它與3個(gè)候選人姓名相比,看它和哪一個(gè)候選人的名字相同。在輸入和統(tǒng)計(jì)結(jié)束之后,將3人的名字和得票數(shù)輸出。 圖9-6Li 0Zhang 0Fun 0 name count 第24頁/共76頁第二十五頁,共76頁。結(jié)構(gòu)體指針(zhzhn)是指向結(jié)構(gòu)體
18、數(shù)據(jù)的指針(zhzhn),一個(gè)結(jié)構(gòu)體變量的起始地址就是這個(gè)結(jié)構(gòu)體變量的指針(zhzhn)。指針(zhzhn)變量既可以指向結(jié)構(gòu)體變量,也可以用來指向結(jié)構(gòu)體數(shù)組中的元素。但是,指針(zhzhn)變量的基類型必須與結(jié)構(gòu)體變量的類型相同。 例如:struct student pt; /* pt可以指 向struct student類型的數(shù)據(jù) */9.3.1 指向結(jié)構(gòu)體變量的指針(zhzhn)變量 下面通過一個(gè)簡單例子來說明指向結(jié)構(gòu)體變量的指針(zhzhn)變量的應(yīng)用。 第25頁/共76頁第二十六頁,共76頁。例例9.通過指向結(jié)構(gòu)通過指向結(jié)構(gòu)(jigu)體變量的指針變量輸出該結(jié)構(gòu)體變量的指針變量輸出該
19、結(jié)構(gòu)(jigu)體變量的信息。體變量的信息。 #include #include void main()struct studentlong num;char name20; char sex; float score; struct student stu_1; struct student* p; p=&stu_1; stu_1.num=89101;strcpy(stu_1.name,”LiLin”); stu_1.sex=M;stu_1.score=89.5; printf(No.:%ldnname:%snsex:%cnscore:%fn,stu-1.num,
20、,stu-1.sex,stu-1.score); printf(No.:%ldnname:%snsex:%cnscore:%fn,(*p).num,(*p).name,(*p).sex,(*p).score); 定義指針變量p,指向struct student 類型(lixng)的數(shù)據(jù)指向(zh xin)的結(jié)構(gòu)體變量中的成員 運(yùn)行結(jié)果:運(yùn)行結(jié)果:89101 name:LiLin sex: score:89.500000:89101 name:LiLin sex: score:89.500000第26頁/共76頁第二十七頁,共76頁。程序分析: 在函數(shù)的執(zhí)行(zhxng)部分將結(jié)構(gòu)體變量-的起始
21、地址賦給指針變量,也就是使指向-,然后對-的各成員賦值。第一個(gè)函數(shù)是輸出-的各個(gè)成員的值。用-表示-中的成員,依此類推。第二個(gè)函數(shù)也是用來輸出-各成員的值,但使用的是(*)這樣的形式。圖9-7第27頁/共76頁第二十八頁,共76頁。以下以下3 3種形式等價(jià)種形式等價(jià)(dngji)(dngji): 結(jié)構(gòu)體變量成員名結(jié)構(gòu)體變量成員名(* *)成員名)成員名-成員名成員名其中其中-稱為指向運(yùn)算符。稱為指向運(yùn)算符。 請分析以下幾種運(yùn)算:-得到指向(zh xin)的結(jié)構(gòu)體變量中的成員的值。-得到指向(zh xin)的結(jié)構(gòu)體變量中的成員的值,用完該值后使它加。-得到指向(zh xin)的結(jié)構(gòu)體變量中的成員
22、的值加,然后再使用它。第28頁/共76頁第二十九頁,共76頁。11.6.2 11.6.2 指向指向(zh xin)(zh xin)結(jié)構(gòu)體數(shù)組的結(jié)構(gòu)體數(shù)組的指針指針例例9.4 指向結(jié)構(gòu)體數(shù)組元素的指針指向結(jié)構(gòu)體數(shù)組元素的指針(zhzhn)的應(yīng)用的應(yīng)用 #include struct studentint num;char name20;char sex;int age;struct student stu3=10101,Li Lin,M,18,10102,Zhang Fun,M,19,10104,WangMing,F(xiàn),20;void main() struct student *p; print
23、f( No. Name sex age);); for(str;str;p) printf(%5d %-20s %2c %4dn,p-num, p-name, p-sex, p-age); 運(yùn)行結(jié)果:運(yùn)行結(jié)果: LiLin 18 Zhang Fun 19 WangMing 20第29頁/共76頁第三十頁,共76頁。程序分析: 是指向struct student結(jié)構(gòu)體類型數(shù)據(jù)的指針變量。在for語句中先使的初值為stu,也就是數(shù)組stu第一個(gè)(y )元素的起始地址。在第一次循環(huán)中輸出stu0的各個(gè)成員值。然后執(zhí)行,使自加。加意味著p所增加的值為結(jié)構(gòu)體數(shù)組stu的一個(gè)(y )元素所占的字節(jié)數(shù)。執(zhí)行
24、+后p的值等于stu 1,指向stu1。在第二次循環(huán)中輸出stu1的各成員值。在執(zhí)行后,p的值等于stu+2,再輸出stu 2的各成員值。在執(zhí)行+后,的值變?yōu)閟tu +, 已不再小于stu+3了,不再執(zhí)行循環(huán)。 圖9-8第30頁/共76頁第三十一頁,共76頁。注意: (1) 如果的初值為stu,即指向第一個(gè)元素,則加后p就指向下一個(gè)元素。例如: (+p)-num先使自加,然后(rnhu)得到它指向的元素中的num成員值(即10102)。 (p+)-num先得到-num的值(即10101),然后(rnhu)使自加,指向stu1。 請注意以上二者的不同。 第31頁/共76頁第三十二頁,共76頁。注
25、意: (2) 程序已定義了是一個(gè)指向struct student類型數(shù)據(jù)的指針變量,它用來指向一個(gè)struct student類型的數(shù)據(jù),不應(yīng)用來指向stu數(shù)組元素中的某一成員。例如(lr): 1a; 如果要將某一成員的地址賦給p,可以用強(qiáng)制類型轉(zhuǎn)換,先將成員的地址轉(zhuǎn)換成p的類型。例如(lr):( *)0a; 第32頁/共76頁第三十三頁,共76頁。第33頁/共76頁第三十四頁,共76頁。11.6.2 11.6.2 指向結(jié)構(gòu)指向結(jié)構(gòu)(jigu)(jigu)體數(shù)組的指針體數(shù)組的指針例例9.5 有一個(gè)有一個(gè)(y )結(jié)構(gòu)體變量結(jié)構(gòu)體變量stu,內(nèi)含學(xué)生學(xué)號、姓名和,內(nèi)含學(xué)生學(xué)號、姓名和3門課程的成績
26、。要求在門課程的成績。要求在main函數(shù)中賦予值,在另一函數(shù)函數(shù)中賦予值,在另一函數(shù)print中中將它們輸出。今用結(jié)構(gòu)體變量作函數(shù)參數(shù)。將它們輸出。今用結(jié)構(gòu)體變量作函數(shù)參數(shù)。 #include struct student int num; char name20; float score3; ;第34頁/共76頁第三十五頁,共76頁。void main() void print(struct student); struct student stu; stu.num=12345;strcpy(, LiLin;stu.score0=67.5;stu.score1=89;stu.
27、score2 =78.6); print(stu);void print(struct student stu) printf(FORMAT,stu.num,, stu.score0, stu.score1,stu.score2);); printf(n););運(yùn)行運(yùn)行(ynxng)(ynxng)結(jié)果:結(jié)果: 67.50000067.50000089.00000089.00000078.59999878.599998第35頁/共76頁第三十六頁,共76頁。例例9.6 將上題改用指向結(jié)構(gòu)體變量的指針作實(shí)參。將上題改用指向結(jié)構(gòu)體變量的指針作實(shí)參。 #include struct s
28、tudent int num; char name20; float score3;stu=12345, LiLi,67.5,89,78.6;void main()void print(struct student *); /*形參類型修改成指向結(jié)構(gòu)體的指針變形參類型修改成指向結(jié)構(gòu)體的指針變量量*/ print(&stu); /*實(shí)參改為實(shí)參改為stu的起始地址的起始地址(dzh)*/void print(struct student *p) /*形參類型修改形參類型修改了了*/ printf(FORMAT,p-num,p-name, p-score0,p-score1,p-score
29、2); /*用指針變量調(diào)用各成員用指針變量調(diào)用各成員的值的值*/ printf(););運(yùn)行運(yùn)行(ynxng)(ynxng)結(jié)果:結(jié)果: 67.50000067.50000089.00000089.00000078.59999878.599998第36頁/共76頁第三十七頁,共76頁。程序分析(fnx): 此程序改用在定義結(jié)構(gòu)體變量stu時(shí)賦初值,這樣程序可簡化些。print函數(shù)中的形參被定義為指向struct student類型數(shù)據(jù)的指針變量。注意在調(diào)用print函數(shù)時(shí),用結(jié)構(gòu)體變量str的起始地址stu作實(shí)參。在調(diào)用函數(shù)時(shí)將該地址傳送給形參p(p是指針變量)。這樣就指向stu。在print
30、函數(shù)中輸出所指向的結(jié)構(gòu)體變量的各個(gè)成員值,它們也就是stu的成員值.main函數(shù)中的對各成員賦值也可以改用scanf函數(shù)輸入.圖9-9第37頁/共76頁第三十八頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 圖9-10第38頁/共76頁第三十九頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 用結(jié)構(gòu)體建立鏈表:struct student int num; float score; struct student *next ;; 其中成員num和score用來存放結(jié)點(diǎn)中的有用數(shù)據(jù)(用戶需要(xyo)用到的數(shù)據(jù)),
31、next是指針類型的成員,它指向struct student類型數(shù)據(jù)(這就是next所在的結(jié)構(gòu)體類型)圖9-11第39頁/共76頁第四十頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 例例9.7 建立建立(jinl)一個(gè)如圖一個(gè)如圖9.11所示的簡單鏈表,它由所示的簡單鏈表,它由3個(gè)學(xué)生數(shù)據(jù)的結(jié)點(diǎn)組成。輸出各結(jié)點(diǎn)中的數(shù)據(jù)。個(gè)學(xué)生數(shù)據(jù)的結(jié)點(diǎn)組成。輸出各結(jié)點(diǎn)中的數(shù)據(jù)。#include #define NULL 0 struct student long num; float score; struct student *next; ; main() str
32、uct student a,b,c,*head,*p; a. num=99101; a.score=89.5; b. num=99103; b.score=90; c. num=99107; c.score=85; head=&a; a.next=&b; b.next=&c; c.next=NULL; p=head; do printf(%ld %5.1fn,p-num,p-score); p=p-next; while(p!=NULL); 運(yùn)行結(jié)果:運(yùn)行結(jié)果:1010189.51010390.01010785.0第40頁/共76頁第四十一頁,共76頁。程序分析: 開始
33、時(shí)使head指向a結(jié)點(diǎn),a.next指向b結(jié)點(diǎn),b.next指向c結(jié)點(diǎn),這就構(gòu)成(guchng)鏈表關(guān)系?!癱.next=NULL” 的作用是使c.next不指向任何有用的存儲單元。在輸出鏈表時(shí)要借助p,先使p指向a結(jié)點(diǎn),然后輸出a結(jié)點(diǎn)中的數(shù)據(jù),“p=p-next” 是為輸出下一個(gè)結(jié)點(diǎn)作準(zhǔn)備。p-next的值是b結(jié)點(diǎn)的地址,因此執(zhí)行“p=p-next”后p就指向b結(jié)點(diǎn),所以在下一次循環(huán)時(shí)輸出的是b結(jié)點(diǎn)中的數(shù)據(jù)。第41頁/共76頁第四十二頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 圖9-12第42頁/共76頁第四十三頁,共76頁。 9.4 9.4 用
34、指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 算法的實(shí)現(xiàn): 我們(w men)約定學(xué)號不會為零,如果輸入的學(xué)號為,則表示建立鏈表的過程完成,該結(jié)點(diǎn)不應(yīng)連接到鏈表中。 如果輸入的p1-num不等于,則輸入的是第一個(gè)結(jié)點(diǎn)數(shù)據(jù)(n=1),令headp1,即把p1的值賦給head,也就是使head也指向新開辟的結(jié)點(diǎn)p1所指向的新開辟的結(jié)點(diǎn)就成為鏈表中第一個(gè)結(jié)點(diǎn)圖9-13第43頁/共76頁第四十四頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 算法的實(shí)現(xiàn): 再開辟另一個(gè)結(jié)點(diǎn)并使p1指向(zh xin)它,接著輸入該結(jié)點(diǎn)的數(shù)據(jù).如果輸入的p1-num,則
35、應(yīng)鏈入第個(gè)結(jié)點(diǎn)(n=2), 將新結(jié)點(diǎn)的地址(dzh)賦給第一個(gè)結(jié)點(diǎn)的next成員.接著使,也就是使指向剛才建立的結(jié)點(diǎn)圖9-14第44頁/共76頁第四十五頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 算法(sun f)的實(shí)現(xiàn):再開辟一個(gè)結(jié)點(diǎn)并使p1指向它,并輸入該結(jié)點(diǎn)的數(shù)據(jù).在第三次循環(huán)中,由于(),又將的值賦給-,也就是將第個(gè)結(jié)點(diǎn)連接到第個(gè)結(jié)點(diǎn)之后,并使,使指向(zh xin)最后一個(gè)結(jié)點(diǎn).圖9-15第45頁/共76頁第四十六頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 算法的實(shí)現(xiàn): 再開辟一個(gè)新結(jié)點(diǎn),并使
36、p1指向(zh xin)它,輸入該結(jié)點(diǎn)的數(shù)據(jù)。由于p1-num的值為,不再執(zhí)行循環(huán),此新結(jié)點(diǎn)不應(yīng)被連接到鏈表中.將NULL賦給p2-next.建立鏈表過程至此結(jié)束,p1最后所指的結(jié)點(diǎn)未鏈入鏈表中,第三個(gè)結(jié)點(diǎn)的next成員的值為NULL,它不指向(zh xin)任何結(jié)點(diǎn)。圖9-16第46頁/共76頁第四十七頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 建立鏈表的函數(shù)如下: #include #include #define NULL 0 /令NULL代表,用它表示“空地址(dzh)#define LEN sizeof(struct student) /
37、令LEN代表struct /student類型數(shù)據(jù)的長度 struct student long num; float score; struct student *next; ;int n; /n為全局變量,本文件模塊中各函數(shù)均可使用它第47頁/共76頁第四十八頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 struct student *creat() struct student *head; struct student *p1,*p2; n=0; p1=p2=( struct student*) malloc(LEN); scanf(%ld,
38、%f,&p1-num,&p1-score); head=NULL; while(p1-num!=0) n=n+1; if(n=1)head=p1; else p2-next=p1; p2=p1; p1=(struct student*)malloc(LEN); scanf(%ld,%f,&p1-num,&p1-score); p2-next=NULL; return(head);第48頁/共76頁第四十九頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 9.4.4 輸出鏈表 首先要知道(zh do)鏈表第一個(gè)結(jié)點(diǎn)的地址,也
39、就是要知道(zh do)head的值。然后設(shè)一個(gè)指針變量p,先指向第一個(gè)結(jié)點(diǎn),輸出所指的結(jié)點(diǎn),然后使后移一個(gè)結(jié)點(diǎn),再輸出,直到鏈表的尾結(jié)點(diǎn)。 圖9-17,9-18第49頁/共76頁第五十頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 例例9 99 9 編寫一個(gè)輸出編寫一個(gè)輸出(shch)(shch)鏈表的函數(shù)鏈表的函數(shù)print. print. void print(struct student void print(struct student * *head)head) struct student struct student * *p;p; p
40、rintf(nNow,These %d records printf(nNow,These %d records are:n,n); p=head;are:n,n); p=head; if(head!=NULL) if(head!=NULL) do do printf(%ld %5.1fn,p-num,p- printf(%ld %5.1fn,p-num,p-score);score); p=p-next; p=p-next; while(p!=NULL); while(p!=NULL); 第50頁/共76頁第五十一頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈
41、表處理鏈表 可以把例可以把例9.79.7和例和例9.99.9合起來加上一個(gè)主函數(shù)合起來加上一個(gè)主函數(shù)(hnsh)(hnsh),組,組成一個(gè)程序成一個(gè)程序, ,即即: :#include #include #include #include #define LEN sizeof(struct student)#define LEN sizeof(struct student)struct studentstruct student long num; long num; float score; struct student float score; struct student * *next
42、;next; ; ;int n; int n; 第51頁/共76頁第五十二頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 struct student *creat() /* 建立建立(jinl)鏈表的函數(shù)鏈表的函數(shù) */ struct student *head; struct student *p1,*p2; n=0; p1=p2=( struct student*) malloc(LEN); scanf(%ld,%f,&p1-num,&p1-score); head=NULL; while(p1-num!=0) n=n+1; if
43、(n=1)head=p1; else p2-next=p1;第52頁/共76頁第五十三頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 p2=p1; p1=(struct student*)malloc(LEN); scanf(%ld,%f,&p1-num,&p1-score); p2-next=NULL; return(head);void print(struct student head) /* 輸出(shch)鏈表的函數(shù) */ struct student *p; printf(nNow,These %d records are:
44、n,n); 第53頁/共76頁第五十四頁,共76頁。 9.4 9.4 用指針用指針(zhzhn)(zhzhn)處理鏈表處理鏈表 p=head; if(head!=NULL) do printf(%ld %5.1fn,p-num,p-score); p=p-next; while(p!=NULL); void main() struct student *head ; head=creat(); print(head); /* 調(diào)用調(diào)用(dioyng)print函數(shù)函數(shù) */ 第54頁/共76頁第五十五頁,共76頁。 9.5 9.5 共用共用(n yn)(n yn)體類型體類型 9.5.1 什么
45、是共用體類型 使幾個(gè)不同的變量共占同一段內(nèi)存的結(jié)構(gòu)(jigu)稱為 “共用體”類型的結(jié)構(gòu)(jigu).定義共用體類型變量的一般形式(xngsh)為:union共用體名 成員表列 變量表列;圖9-19第55頁/共76頁第五十六頁,共76頁。 9.5 9.5 共用共用(n yn)(n yn)體類型體類型 例如例如(lr)(lr):union data union dataunion data union data int i int i; int int i;i; char ch char ch; 或或 char char ch;ch; float f float f; float ffloat
46、f;a,b,c; ;union a,b,c; ;union data a,b,c;data a,b,c;第56頁/共76頁第五十七頁,共76頁。 9.5 9.5 共用共用(n yn)(n yn)體類型體類型 共用體和結(jié)構(gòu)體的比較:共用體和結(jié)構(gòu)體的比較: 結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)存長結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和。每個(gè)成員分別度之和。每個(gè)成員分別(fnbi)(fnbi)占有其自己的占有其自己的內(nèi)存單元。內(nèi)存單元。 共用體變量所占的內(nèi)存長度等于最長的成員的長共用體變量所占的內(nèi)存長度等于最長的成員的長度。度。 共用體和結(jié)構(gòu)體的比較:共用體和結(jié)構(gòu)體的比較: 結(jié)構(gòu)體變量所占內(nèi)
47、存長度是各成員占的內(nèi)結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和。每個(gè)成員分別占有其自己的存長度之和。每個(gè)成員分別占有其自己的內(nèi)存單元內(nèi)存單元(dnyun)(dnyun)。 共用體變量所占的內(nèi)存長度等于最長的成員共用體變量所占的內(nèi)存長度等于最長的成員的長度。的長度。 例如例如: :上面定義的“共用體”變量、各占個(gè)字節(jié)(因?yàn)橐粋€(gè)實(shí)型變量占個(gè)字節(jié)),而不是各占個(gè)字節(jié)。 第57頁/共76頁第五十八頁,共76頁。 9.5 9.5 共用共用(n yn)(n yn)體類型體類型 9.5.2 共用體變量(binling)的引用方式 只有先定義了共用體變量(binling)才能引用它,而且不能引用共用體變量
48、(binling),而只能引用共用體變量(binling)中的成員。例如例如(lr):前面定義了前面定義了a、b、c為共用體變量為共用體變量 a.i (引用共用體變量中的整型變量)(引用共用體變量中的整型變量) a.ch(引用共用體變量中的字符變量)(引用共用體變量中的字符變量) a.f (引用共用體變量中的實(shí)型變量)(引用共用體變量中的實(shí)型變量)第58頁/共76頁第五十九頁,共76頁。 9.5 9.5 共用共用(n yn)(n yn)體類型體類型 9.5.3 共用(n yn)體類型數(shù)據(jù)的特點(diǎn)(1)同一個(gè)內(nèi)存段可以用來存放幾種不同類型的成員,但在每一瞬時(shí)只能存放其中一種,而不是同時(shí)存放幾種。(
49、2) 共用(n yn)體變量中起作用的成員是最后一次存放的成員,在存入一個(gè)新的成員后原有的成員就失去作用。 (3) 共用(n yn)體變量的地址和它的各成員的地址都是同一地址。 第59頁/共76頁第六十頁,共76頁。 9.5 9.5 共用共用(n yn)(n yn)體類型體類型 (4) 不能對共用體變量名賦值,也不能企圖引用變量名來得到一個(gè)值,又不能在定義共用體變量時(shí)對它初始化。(5) 以前的C規(guī)定不能把共用體變量作為函數(shù)參數(shù),但可以使用指向共用體變量的指針作函數(shù)參數(shù)。ANSI新標(biāo)準(zhǔn)放寬了限制,允許(ynx)用共用體變量作為函數(shù)參數(shù)。(6) 共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用
50、體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,數(shù)組也可以作為共用體的成員。第60頁/共76頁第六十一頁,共76頁。 9.5 9.5 共用共用(n yn)(n yn)體類型體類型 例例9.10 9.10 設(shè)有若干個(gè)人員的數(shù)據(jù)設(shè)有若干個(gè)人員的數(shù)據(jù)(shj)(shj),其中有學(xué)生,其中有學(xué)生和教師。學(xué)生的數(shù)據(jù)和教師。學(xué)生的數(shù)據(jù)(shj)(shj)中包括:姓名、中包括:姓名、號碼、性別、職業(yè)、班級。教師的數(shù)據(jù)號碼、性別、職業(yè)、班級。教師的數(shù)據(jù)(shj)(shj)包括:姓名、號碼、性別、職業(yè)、職包括:姓名、號碼、性別、職業(yè)、職務(wù)。可以看出,學(xué)生和教師所包含的數(shù)據(jù)務(wù)。可以看出,學(xué)生和教師所包含的數(shù)據(jù)(
51、shj)(shj)是不同的?,F(xiàn)要求把它們放在同一表是不同的?,F(xiàn)要求把它們放在同一表格中。格中。圖9-10第61頁/共76頁第六十二頁,共76頁。 9.5 9.5 共用共用(n yn)(n yn)體類型體類型 #include structint num;char name10;char sex;char job;unionint banji;char position10;category;person2;/*先設(shè)人數(shù)(rn sh)為2*/第62頁/共76頁第六十三頁,共76頁。void main()int i;for(i=0;i2;i+)scanf(%d %s %c %c, &per
52、soni.num, &,&personi.sex, &personi.job);if(personi.job = S)scanf(%d, &personi.category.banji);else if(personi.job = T)scanf(%s, personi.category.position);else printf(“Input error!”); printf(n);printf(No. name sex job class/positionn);for(i=0;i2;i+)if (personi.job = S)pri
53、ntf(“%-6d%-10s%-3c%-3c%-6dn”,personi.num, , personi.sex, personi.job, personi.category.banji);else printf(“%-6d%-10s%-3c%-3c%-6sn”,personi.num, ,personi.sex, personi.job, personi.category.position);運(yùn)行運(yùn)行(ynxng)情況如下:情況如下: 第63頁/共76頁第六十四頁,共76頁。也可以不在結(jié)構(gòu)體類型也可以不在結(jié)構(gòu)體類型(lixng)的聲明中聲明共用體
54、類型的聲明中聲明共用體類型(lixng),而把它放在結(jié)構(gòu)體類型而把它放在結(jié)構(gòu)體類型(lixng)的聲明之前,即:的聲明之前,即: int i;union categ int banji;char position10;struct int num; char name10; char sex; char job; union categ category;person2; 第64頁/共76頁第六十五頁,共76頁。9.6 9.6 枚舉枚舉(mi j)(mi j)類型類型枚舉:將變量的值一一列舉出來,變量的值只限于列舉出來的值的范圍內(nèi)。申明(shnmng)枚舉類型用enumenum weekday
55、sun,mon,tue,wed,thu,fri,sat; 定義變量:enum weekday workday,week-day;enumsun,mon,tue,wed,thu,fri,satworkday;變量值只能是sun到sat之一 枚舉元素(yun s)枚舉常量第65頁/共76頁第六十六頁,共76頁。9.6 9.6 枚舉枚舉(mi j)(mi j)類型類型說明:在編譯中,對枚舉元素按常量處理,故稱枚舉常量。它們(t men)不是變量,不能對它們(t men)賦值。 (2) 枚舉元素作為常量,它們(t men)是有值的,語言編譯按定義時(shí)的順序使它們(t men)的值為, (3) 枚舉值可以
56、用來作判斷比較。 (4) 一個(gè)整數(shù)不能直接賦給一個(gè)枚舉變量。 第66頁/共76頁第六十七頁,共76頁。9.6 9.6 枚舉枚舉(mi j)(mi j)類型類型例13口袋中有紅、黃、藍(lán)、白、黑5種顏色的球若干個(gè)。每次從口袋中先后取出個(gè)球,問得到3種不同色的球的可能取法,輸出(shch)每種排列的情況。 算法:圖9-22 9-23 第67頁/共76頁第六十八頁,共76頁。13.9 13.9 枚舉枚舉(mi j)(mi j)類型類型#include main()enum color red,yellow,blue,white,black; enum color i,j,k,pri; int n,loop;n=0; for (i=red;i=black;i+) for (j=red;j=black;j+)if (i!=j) for (k=red;k=black;k+)if (k!=i) & (k!=j)
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 統(tǒng)計(jì)綜合知識培訓(xùn)課件
- 貴州航空職業(yè)技術(shù)學(xué)院《小學(xué)數(shù)學(xué)課程標(biāo)準(zhǔn)與教材分析》2023-2024學(xué)年第一學(xué)期期末試卷
- 二建市政工程實(shí)務(wù)-二級建造師《市政公用工程管理與實(shí)務(wù)》??荚嚲?340
- 2024年國家電網(wǎng)招聘之法學(xué)類題庫及參考答案(a卷)
- 無人機(jī)配送發(fā)展的實(shí)施路徑與戰(zhàn)略規(guī)劃
- 2024年公務(wù)員考試遂川縣《行政職業(yè)能力測驗(yàn)》考前沖刺試卷含解析
- 2024年消防宣傳總結(jié)范文(33篇)
- 2025年婦聯(lián)下半年工作計(jì)劃范文范文
- 2025年學(xué)生會部門干事個(gè)人工作計(jì)劃
- 2025年稅政管理工作總結(jié)情況暨2025年工作計(jì)劃
- 2024上海市化工職業(yè)病防治院上海市職業(yè)安全健康研究院工作人員招聘20人(高頻重點(diǎn)復(fù)習(xí)提升訓(xùn)練)共500題附帶答案詳解
- JGJ142-2012 輻射供暖供冷技術(shù)規(guī)程
- 物業(yè)管理流程:高端寫字樓服務(wù)
- JTG-B01-2014公路工程技術(shù)標(biāo)準(zhǔn)
- 海員常見疾病的保健與預(yù)防
- 易錯題(試題)-2024一年級上冊數(shù)學(xué)北師大版含答案
- 傷口護(hù)理小組工作總結(jié)
- 蘇教版六年級科學(xué)上冊復(fù)習(xí)資料-已整理
- 科勒衛(wèi)浴行業(yè)分析
- 湖南省邵陽市初中聯(lián)考2023-2024學(xué)年九年級上學(xué)期期末地理試題
- 美術(shù)概論課件
評論
0/150
提交評論