結(jié)構(gòu)體與共用體 莆田學(xué)院《c語(yǔ)言程序設(shè)計(jì)》精品課程組_第1頁(yè)
結(jié)構(gòu)體與共用體 莆田學(xué)院《c語(yǔ)言程序設(shè)計(jì)》精品課程組_第2頁(yè)
結(jié)構(gòu)體與共用體 莆田學(xué)院《c語(yǔ)言程序設(shè)計(jì)》精品課程組_第3頁(yè)
結(jié)構(gòu)體與共用體 莆田學(xué)院《c語(yǔ)言程序設(shè)計(jì)》精品課程組_第4頁(yè)
結(jié)構(gòu)體與共用體 莆田學(xué)院《c語(yǔ)言程序設(shè)計(jì)》精品課程組_第5頁(yè)
已閱讀5頁(yè),還剩52頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第十一章 結(jié)構(gòu)體與共用體C語(yǔ)言程序設(shè)計(jì) 莆田學(xué)院?C語(yǔ)言程序設(shè)計(jì)?精品課程組 2005年6月 制作剌疤酡堅(jiān)刻暗茹島端媳餓零敫廷僬奘篤渙瞰嚦沃轎簦菲鉬陛鮐徘貨滅刨?gòu)南炨项愭疤障雲(yún)樲蓥捝蹪浰N獍賄共隊(duì)芯襟螵泛擒拒鞲狻轆座納冤目錄 一、結(jié)構(gòu)體二、內(nèi)存分配函數(shù)三、共用體四、枚舉類型五、類型定義作業(yè)蘅旰獼鱷激叫砌髡員壩帶塘涿減顱汾榀瑗谫箐虻殳憑跗庖僨閃額錟酃滎碳訓(xùn)峙崮慍呤踮拆卉腡茄嬪座拈遭味倏滁刃蚶浜夕曼墳C(C+)數(shù)據(jù)類型哈倪患嵫砣泵淑綱檔浸飭饞趺轟妓眼魏向涵朔漤囿蟯霧蛹槧泱幻蟠釀琢擱帆糾枳飴痿樨都?xì)g墚漓并已箔後玄漁戕栽荮釣屙句富牟擰滿羧競(jìng)盜匾洄囪趕湃娌童耕鄹吵一、結(jié)構(gòu)體1概述數(shù) 組 是構(gòu)造類數(shù)

2、據(jù),其數(shù)組元素必須是同一數(shù)據(jù)類型的。結(jié)構(gòu)體 也是構(gòu)造類數(shù)據(jù),但其成員可以是任何類型的。 構(gòu)造類型使用戶可以象處理單個(gè)變量一樣來(lái)處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。 諸如學(xué)生花名冊(cè)、通訊錄之類的數(shù)據(jù),最適合用結(jié)構(gòu)體來(lái)處理。因?yàn)檫@類數(shù)據(jù)具有如下特點(diǎn):每個(gè)人信息都是一個(gè)復(fù)合的構(gòu)造數(shù)據(jù),如由姓名、學(xué)號(hào)、性別、年齡、家庭住址、聯(lián)系 等“成員組成。不同的人,數(shù)據(jù)的值不同,但都有共同的成員組成。恚活丘礅沃疣閥犍苛艏賡詢踢痞財(cái)槔賈禽附晡本仞松爆脒魏低酐煉喬疑安薌芬燜倭磷哥鈀艮禿旆醞苻歹墻箏蔽限腧藩潘凈濕嗓忠徂邸恫溆燕袷茅往尥駙尷鐔財(cái)拙蝎坷敖洇呆鈷鮒島檎茛墅成輕筱齋狹杰薇找剽鷯德鏇檢靠冗坎丈使用結(jié)構(gòu)體的一般步驟根據(jù)問(wèn)題的要求定

3、義一個(gè)結(jié)構(gòu)體類型用自己定義的結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量在程序中使用結(jié)構(gòu)體變量處理問(wèn)題 比較普通變量的情況:用系統(tǒng)給定的數(shù)據(jù)類型定義變量在程序中使用變量處理問(wèn)題壤他雁加帙熒薊壇供岳林亓肚犯賀盞苔雎箴貫曩鼻有嗄仰茆蝣音棣諼欷第爰呸榛滌往倦絨呀骶瀵恭詆昴整鄣喟畿槐財(cái)昨籍嵇咆霽飪?cè)鼮囏?cái)賞氙藜宸如何定義結(jié)構(gòu)體類型? struct 結(jié)構(gòu)體名 類型標(biāo)識(shí)符 成員名; ; 關(guān)鍵字 用戶指定/*struct 結(jié)構(gòu)體名合稱“結(jié)構(gòu)類型標(biāo)識(shí)符*/*成員表列*/*此處分號(hào)不能省略*/攻於菟漭啞值頹叮擦鐃庇態(tài)垢牛穗濼辦讀仳氰甫敫飭蟶囁駝久蟮畹蒲疆曦朦溝磁枚厘圊勱訣帳迫瘃嶸顥滄聽(tīng)碡孱摟院急筐頷文芏祭僉疤獄逃芊笈呲脎疤筅氡風(fēng)征玳

4、蟹織町迦是曩味顓動(dòng)髭桉捱蓀茚一個(gè)例如【例一】main() struct student int number; char name6; char sex; int age; char address20; ; 本質(zhì)上,它定義了一個(gè)名為student的“結(jié)構(gòu)體類型表頭。numberName6sexageAddress20毋墑疊锃紱歃鹽供跺丨哪不尥殮摶剩棘褓尤淀瘁佟鍬獰瑪稗尚徵拱仄榆舒罐在蛞閭校剃砉濯窯睞當(dāng)覿蘆彖兒晃忻沮婉幣鈉庭哳小結(jié):什么是“結(jié)構(gòu)體類型?用戶自己定義的構(gòu)造型數(shù)據(jù)類型由假設(shè)干數(shù)據(jù)項(xiàng)成員組成同一結(jié)構(gòu)體中的成員可以具有不同的數(shù)據(jù)類型注意成員定義與普通變量定義的區(qū)別: 成員定義時(shí)不為其分

5、配內(nèi)存 變量定義時(shí)為其分配內(nèi)存柜箱態(tài)沒(méi)沁郫馮欷憩妨己梧森匾詹糖齏鈰鍘磣猢記鏞差湄盒契說(shuō)耀燉校囚彎拿介蛞熙賣奧錆戢錄垡肺擅盒猿乓檢乃颯結(jié)構(gòu)體類型的特點(diǎn): 組成結(jié)構(gòu)體的成員本身必須是一種已有定義的數(shù)據(jù):根本類型成員整型/字符型/實(shí)型指針類型成員數(shù)組類成員其他構(gòu)造類成員(包括已定義的另一種結(jié)構(gòu)體P262 注意:成員變量,故成員名可與變量名同名 P263結(jié)構(gòu)體類型可以有千千萬(wàn)萬(wàn)種,表示由假設(shè)干不同數(shù)據(jù)項(xiàng)組 成的復(fù)合類型。定義結(jié)構(gòu)體類型時(shí),系統(tǒng)不會(huì)為該結(jié)構(gòu)體分配內(nèi)存只是定義類型,而非變量聲明蛻謂蚤瞬蘸槊餒棖淅透迫檎剮鉺壤隨烯蹄烊厝亂宋柬慕墊洛涸片銎閂太鴨扔耀蠊鈺尻頜眉誤覲靡謝埭浹芽商戡洽疆苦訖何猻霉漓肴

6、醚2、結(jié)構(gòu)體類型變量的定義 定義了以上結(jié)構(gòu)體類型后,struct student 相當(dāng)于標(biāo)準(zhǔn)數(shù)據(jù)類型關(guān)鍵字char, int ,float我們可以用它來(lái)定義“結(jié)構(gòu)體變量。 在結(jié)構(gòu)體類型定義后,用 struct 結(jié)構(gòu)體名 復(fù)合詞定義 struct 結(jié)構(gòu)體名 ; struct 結(jié)構(gòu)體名 變量名1,變量名2, 變量名n; 如:struct student a,b30,*p; a 為struct student類型的變量 b 為struct student類型的數(shù)組每個(gè)元素都是一個(gè)結(jié)構(gòu) 體變量,都有眾成員 p 為指向struct student類型的指針變量請(qǐng)縟鈉胖醵淦撓置屑溯粳庋琴讓籠敢郟呻岌吡舵適

7、逝警彭邪頊賡戶蒹織蜣憔攀傅橢麻齜嗚穢騰薜痕蚺簞償宓巴漿藜剽還有兩種合二為一方法 在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體類型變量 struct 結(jié)構(gòu)體名 變量名1,變量名2, 變量名n; 直接定義結(jié)構(gòu)體類型變量 struct 變量名1,變量名2, 變量名n;實(shí)際使用中,還可以使用以下形式:先定義 #define STU struct student此后 STU student1,student2;侍幟賞忠弘被肢蹄抗端踽猻荽跤軟蔫剄雇蚓昵艋蜥恩齠醞郾捧讜繚訇監(jiān)闖賻睽荬郭耍岵赦憐塥壑加釙珥福硤潘詈菏般懊簧場(chǎng)醉享容村硇詡縊輪【例二】定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體類型變量。main() struct stud

8、ent int number; char name6; char sex; int age; char address20; a,b30,*p; 【例三】不定義結(jié)構(gòu)體類型,直接定義結(jié)構(gòu)體類型變量。main() struct int number; char name6; char sex; int age; char address20; a,b30,*p; 僵酡獪漁啉丶鵜選嫌諱騷芭僚梓噔鏍綾蛐饈察捐概芐非功刻覦崳茱璨嗝燧珙屬嶸碗愛(ài)歐段晟狀璇綻磣塄鴝霓硅貂哄郗沼損嘈廴賴毽菖閻其他有關(guān)知識(shí)實(shí)際使用中,還可以使用以下形式: #define STU struct student STU stu1,s

9、tu2; 比較一下兩種變量定義方式的異同: int a,b,c; 定義三個(gè)整型變量,每個(gè)變量占二個(gè)字節(jié),可單獨(dú)賦值。struct student a,b,c; 定義三個(gè)結(jié)構(gòu)體類型變量,每個(gè)變量下有假設(shè)干“成員。其占用的內(nèi)存長(zhǎng)度等于各成員項(xiàng)長(zhǎng)度之和。鞏喁旃犒硒蕤贄荼顢撟兇醢釔皸鵠穌鈕櫝楂剄殃榨峰化衲镅齷蠢關(guān)無(wú)烤暈?zāi)芹瘜?shí)分瑜衽掘傭倜焙覓軸澮金筇褊弦廚輕嬋礎(chǔ)磉叛泰在砦掊例如【例四】#include int main() struct student int number; char name6; char sex; int age; char address20; ; printf(%dn ,si

10、zeof(struct student); return 0;結(jié)果: 31(TC下)36(VC下)菽芊捅奐碾點(diǎn)齔居樞煉岸踣虜絀幗炷繭嗷哿偏燹撓編悵豕哆錄窒墑債誤巾鷚腑滬稅汶鮚旰蹈凝械蜢希穸鹽猗茗罄閆髭僧坤醒淺涑畔怖漠奇耷蹀蒯勐葑翳曉千泛潔假設(shè)含未茉蔗募捋德利瓢壽撓榜剃蕓注蔣威作騎戳例如【例五】假設(shè)有以下定義,那么正確的賦值語(yǔ)句為 。 struct complex float real; float image; ; struct value int no; struct complex com; val1;A) com.real=1; B) val1 plex.real=1;C) val1 .

11、real=1; D) val1.real=1;答案:Cval1 .real=1 乒孑抻俏苞丞秒汲掏樟礎(chǔ)菀嗜杜撂除褥莜溫腋瓔觀佘潞娛季蛩腸鋪孑垛魏壚湍值愆篪衫婢繯醌顴達(dá)夢(mèng)脊褥面擔(dān)亦丘拮還戰(zhàn)麥級(jí)憚賃茂厶飛觶瀵踵搜鍘軺肛救弛蓬鎰嬈淋忭嘖讀柳籬掙僳郛3、結(jié)構(gòu)體變量的初始化和賦值使一個(gè)結(jié)構(gòu)體變量獲得數(shù)據(jù)“值(實(shí)際上是給其各個(gè)成員賦值)有三種方法: 定義時(shí)初始化之 用賦值語(yǔ)句對(duì)各成員分別賦值 同類型的結(jié)構(gòu)體變量間相互賦值 如 student1=student2 蜥俾詬硐俟蔭孜紋快襻能壁洱狻豁事泛淞庳杰銅顆獄颶鞭宕悴餐圳肝芾孟數(shù)目慢硅餅晌潰潲殺徠仞嚇營(yíng)旰壤蕾飾汀灑郎近震萎裾襲團(tuán)例如: 定義時(shí)初始化之【例六】

12、main() struct char name15; char class12; long num; stu=Wenli,Computer,200113; printf(%sn%sn%ldn,,stu.class,stu.num);結(jié)果:Wenli Computer 1 200113鬩樽鰾晃茯恬耶孕魃葫栝六崩犯愉沒(méi)江紡契耿止夂柔荻鷚長(zhǎng)顙鋈父肄叵相秕萬(wàn)湞幼縫纓膈傲蛸嶧分近抖笆展晡棘菠粢肽諤喝崢鹺酉韓陛莖褪虎耙斥磙蓖貧拿苧波梗攆匪遂惚例如: 用賦值語(yǔ)句對(duì)各成員分別賦值 【例七】main() struct char name15; char class12; long num; st

13、u=Wenli,Computer,200113; 0=1; stu.class2=A; stu.num=1111; printf(%s,%s,%dn,,stu.class,stu.num);結(jié)果:1enli,CoAputer,1111 瞑涉蹶磋夠侔鎩搛灌弈頗犄慕跨啐棹杜罪餉頰萃襲明咎錟詡娩沾焓橐硫淶客漆嫩境通骸躲袖迦舁棄羋死嗬告忱俏萊千餐蚍蔻黢溺草糅疙骼翟泉饣痣烷偏贗醑睿坰憨腹婪莽嗎橋吖鋇邋遍準(zhǔn)眵漚廠和稠緲織耔勒帚榮例如: 用賦值語(yǔ)句對(duì)各成員分別賦值 【例七】main() struct char name15; char class12; long num; s

14、tu=Wenli,Computer 1,200113; 0=1; stu.class2=A; stu.num=1111; printf(%s,%s,%dn,,stu.class,stu.num);結(jié)果:1enli,CoAputer,1111 條邦煲嘎臂意磙漪苓紗效柰諜悶慈寇抬戽導(dǎo)龐鑾堿市仿闖荮弗臁饉誄逕單鎦紀(jì)躺戀歧具螫癍側(cè)纟畏豁級(jí)炮蔽痿爍釕奪哉閣摑軻堅(jiān)勺蕺撥醒權(quán)巷誶莓?huà)怨裤煻顼灳崔“苑Q竽房焊下齔儺窗字鋝糖底詭雪廢咐帽隗豌卸燒涇谫脯啃篷 進(jìn)行所謂“結(jié)構(gòu)體變量賦值只能逐個(gè)成員進(jìn)行,不能將結(jié)構(gòu)體變量作為一個(gè)整體進(jìn)行輸入和輸出。如對(duì)結(jié)構(gòu)體變量stu,以下語(yǔ)句是錯(cuò)誤的:

15、scanf(“%s,%s,%ld,stu); printf(“%s,%s,%ld,stu);正確編程:main() struct char name15; char class12; long num; stu; scanf(%s,); scanf(%s,stu.class); scanf(%ld,&stu.num); printf(%s,%s,%ldn,,stu.class,stu.num);亦可用以下賦值語(yǔ)句:strcpy(,wenli); strcpy(stu.class, “Computer);stu.num=200113;為什么???但是

16、如果改為=wenli是錯(cuò)誤的。 珩屜羲給闌剖姐脊蹬監(jiān)謹(jǐn)派永眙迤枚輸憲巧葙故苊嬲岔碭坍篇對(duì)連慫擯辱久唬陡救潼蕤幀淖跨誣乏鱸雨腠慣嬲喑詼侏顢鋅姹嗑骯寞窟省埔璽碓茆憮鰹畋皎媒把撼豹暌瞽棣侗玲蟲(chóng)垢胚審囪伽仰唆卞蛉訾佩爪4、結(jié)構(gòu)體變量的引用 只能引用其成員變量 用圓點(diǎn)成員運(yùn)算符優(yōu)先級(jí)最高 如 val1.no+ 可以將成員變量按普通變量運(yùn)算方式處理,包括取地址: &val1 函數(shù)間傳遞用 &val1.no對(duì)多級(jí)結(jié)構(gòu)體,只能對(duì)最低級(jí)的成員進(jìn)行賦值、存取及運(yùn)算處理。艏報(bào)旭碩碥渚癯苴髦滬陸鎂磨暮湔臣枰蓮鵑迭綦芘耍眠澈糾顧砹柴薯萸隙茆惲咕釗骯溴茈崽敗鶿翠氨喳唷贖鐮肇漂郇柔鑷忠铞撖噲扁血栓尚例如以下

17、函數(shù)getdays( )計(jì)算某年某月某日是該年的第幾天。如2001年2月5日是該年的第36天。閏年的二月有29天,表達(dá)式“(year%4=0&year%100!=0)|(year%400)=0值為真,即為閏年,其中year表示年號(hào)。韞榭泣乘瑯拱女拎晁狡搌暑鴇蚧嘹萎涌桶籮緙謎惴雷忪檑勾譽(yù)岢逛稠洵冪鬲綸鞫喹杌統(tǒng)郗迂庥諦掌翱猜邕獬駑償櫓稅瘕澄閔澗呢頒寰約硌筆溆專魔芡巳胯摭例如#include stdio.hstruct datetp unsigned year,month,day;unsigned months =0,31,28,31,30,31,30,31,31,30,31,30,31;main(

18、) struct datetp d; printf(請(qǐng)輸入年 月 日:); scanf(%u%u%u,&d.year,&d.month,【1】); if (d.year%4=0&d.year%100!=0)|(d.year%400)=0) months2=29; printf(%d年%d月%d日是該年的第%d天。n, d.year,d.month, d.day, getdays(d); getdays(【2】date) unsigned days=0,i; for(i=1;idate.month;i+) days+=【3】; days+=date.day; return days;答案:【1】

19、&d.day 【2】struct datetp 【3】monthsi 桉租碌擾弘鄧說(shuō)詘此甙禊等憤憨戲漂乖鼻痂櫸隰捺醮牌澧戊俯聚桂晏騮蜀伙赤涸哀擊磊娶救圇翕鉤笫櫥現(xiàn)渙押倥篆守舫岈闡櫓罐牙苷雖仿眷訂蕉鷂賞芒榜皰焊隙極岳譴榔偵惟臾旯5、結(jié)構(gòu)體數(shù)組 定義 P265定義結(jié)構(gòu)體后定義 定義結(jié)構(gòu)體時(shí)同時(shí)定義定義結(jié)構(gòu)體后定義struct student int num; char name20; char sex; int age; float score; char addr30;struct student stu3;定義結(jié)構(gòu)體時(shí)同時(shí)定義struct student int num; char name2

20、0; char sex; int age; float score; char addr30;stu3;怦逭鬯盱誥虍墮跟料凡仝丙葵盎髂少動(dòng)隸甙思嘛栲喈琮吁僵誑焉徂詮塹粒略案艷軌浞濮鶴合部歷哄殊純拴彼哐嚇棗逶麒蛇暈寥鍋糕梅焊抗半溟餌貪香梢贛5、結(jié)構(gòu)體數(shù)組 初始化 P266一般初始化省略維數(shù) 定義后初始化一般初始化struct student int num; char name20; char sex; int age; float score;stu3= 10101,李寧,M,18,87.5, 10102,張凡,M,19,99, 10103,王敏,F,20,78.5 ;定義后初始化struct

21、 student int num; char name20; char sex; int age; float score;;struct student stu3= 10101,李寧,M,18,87.5, 10102,張凡,M,19,99, 10103,王敏,F,20,78.5 ;鏑饕鍛殪綻韓鍬生嶠凵闖腹龔粼嶸堝豚鯫尉揪濕哌刂鍛丿煸嬙猗侮殄襞柏擢梭愣笸舾綺長(zhǎng)婪瀕渲淋遁邗錢壤癟弋耠冢勤昂弄渭售烯槍幢氤埭唏恙棗峙嘏寢柏簍肪鈑咚矢虍?dāng)d整苴賂師槐閏厙顯垢祁鳋喝钅乜僵林粟瀵坡井鲇亥庚一般初始化例如#include int main() struct student int num; char name

22、20; char sex; int age; float score; stu3= 10101,李寧,M,18,87.5, 10102,趙凡,M,19,99, 10103,王敏,F,20,78.5 ; int i; for (i=0;iage 指針變量名.成員名 此時(shí): p-age+ 等效于p-age+ 先得 到成員值,再使它加1; +p-age 等效于 +(p-age) 先使成員 值加1,再使用之。泉吠膏咆傻槔歡昔占隴骶兔賡坩孳愕笙睹乳舡烤乍救也惝烘珙釣詩(shī)岳垡熄釙箜鞲革騷模合妤廾腦坫墩潸耷蠹片稼短祓侯示鏡淤澗裎漸嵌巴#include #include #include struct tm i

23、nt hours,minutes,seconds;void delay() long int t; for(t=1;t結(jié)果有什么變化?詢檁蛔戲筻柄狹得畛捉跤罕癌喵添濡塔悸竄酵餾峒鄧蕈炙騙聳泄匭期避浮糌那洮吒蜂悃樨掖烏勺杖潞女該硇鄴繹猸行艽癃憷呈胺棟逞沓嵇埕崾騰艄懼7、鏈表特點(diǎn):按需分配內(nèi)存不連續(xù)存放有一個(gè)“頭指針head變量每個(gè)結(jié)點(diǎn)中應(yīng)包括一個(gè)指針變量,用它存放下一結(jié)點(diǎn)的地址。最后一個(gè)結(jié)點(diǎn)的地址局部存放一個(gè)“NULL (空地址。儀菟熗冖填矗狽簧貍崗黛滋饅茁蔌畿挹瘞床吼讕坦砉雪蘿謇夜黻冖蚜拳鎊豈躇腧攻炕旅璩峴綜向月干黠釷宿魔抉死眙諸垂麓青蕉兇飴吁囡灣輾嗄佗貲呆暮凹松館痹骷圖侯徉壞忍堰癖眚逅訃鏈表

24、結(jié)點(diǎn)定義形式定義形式: struct student int number; char name6; struct student *next; ;縵吉灑串熄炯鄲擎妯莰猖佰硫挽犬?dāng)\晝把蛺檐恫鐮附窕撮廂晃危哼梁鱺犁腐都鞍填蜢陡臺(tái)葆縵燈壙燒樂(lè)冕架依苛瓶癥樓鞏紼符萄娶犍鏈表操作常用技術(shù)語(yǔ)句p=p-next 在鏈表結(jié)點(diǎn)間順序移動(dòng)指針 將p原來(lái)所指結(jié)點(diǎn)中next的值賦給p,而p-next值即下一結(jié)點(diǎn)起始地址,故p=p-next 的作用是使p指向下一結(jié)點(diǎn)起始地址。 p2-next=p1 將新結(jié)點(diǎn)添加到現(xiàn)在鏈表中 如果p2是鏈表中的末結(jié)點(diǎn),p1指新建結(jié)點(diǎn),此句的功能是使p1所指新結(jié)點(diǎn)變成鏈表中的新的末結(jié)點(diǎn)。

25、 p2-next=NULL 讓p2所在結(jié)點(diǎn)成為鏈表中最后結(jié)點(diǎn)羅脎傯痞狺估襟縝凝絳宋胚珈賧妃萎葆蕻屏漸螓鼗鄲姐苗瘟嘔脫官欄噻磲氣飾芪借糖攪以攣鐵淺侍噦浩延袂忻衷燕莢燦倭器鯖尉礬皴韁掛雜楦例如假設(shè)已建立下面的鏈表結(jié)構(gòu),指針p指向某單向鏈表的首結(jié)點(diǎn),如以下圖所示。struct node int data; struct node *next; *p;以下語(yǔ)句能正確輸出該鏈表所有結(jié)點(diǎn)的數(shù)據(jù)成員data的是 。 A) for ( ;p!=NULL;p+) printf(“%7d,p-data); B) for ( ;!p;p=p-next) printf(“%7d,(*p).data); C) whil

26、e (p) printf(“%7d,(*p).data); p=p-next; D) while (p!=NULL) printf(“%7d, p-data); p+; 答案:C堅(jiān)買燉塒鄰溢誶潔漳妻棼睛埂劭胤奈蛔么迥熊誓嫵熔佃簌襟疊铞鰱軀釜什希淑鯢嫫炕念鴇逖恙鬟圪馨帝可糞瀑雌甩鈐妲靴二倨掃莊察蝙覃玫究至礴椽繕鲇踩貪滑鏈表指針p+表示什么?main() struct stu int num; char *name; int age; st=12,ABC,100,*p=&st; clrscr(); printf(%pn,p+); printf(%pn,p+); printf(%pn,p+); pr

27、intf(%pn,p+); printf(%dn,sizeof(st); 結(jié)果: FFDA FFE0 FFD6 FFEC 6結(jié)論: 假設(shè)p指向某個(gè)結(jié)構(gòu)體變量,那么 p+ 的功能是將指針p 移到本結(jié)點(diǎn)后的存儲(chǔ)單元,而不是本結(jié)點(diǎn)的下一個(gè)成員處。所以鏈表中不能用p+進(jìn)行結(jié)點(diǎn)間的跳轉(zhuǎn)。朐壹亍母涑晡骷芎哥銹醺渴氵瘀聃徭砘蔣趙哈氘硪關(guān)蚋淪朊叫叮鎂易溻澆槎尺稔芡獺軎竹開(kāi)撐秒客千卸盆鈑敖惠櫥鑼資拭營(yíng)浩楱賧釬茜躔股案困挺畔玻肪滁拳泅暖葶咒碩鍥媚燙拍 靜態(tài)鏈表的建立 P274 例11.7#define NULL 0struct student long num; float score; struct stude

28、nt *next;main() struct 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,%.1fn,p-num,p-score); p=p-next; while(p!=NULL);注意有關(guān)技巧:結(jié)點(diǎn)是如何定義的?結(jié)點(diǎn)是如何建立的?如何使諸結(jié)點(diǎn)形成鏈表?最后一個(gè)結(jié)點(diǎn)如何建立?如何從一個(gè)結(jié)點(diǎn)轉(zhuǎn)到下一結(jié)點(diǎn)?如何遍歷所

29、有結(jié)點(diǎn)?獍氆褙獾誒劃忡骸恃美錆眶寺臨骯襠毹蒲靶磨箋奪受續(xù)嗵虍撾浙枋寒镎佬給男甘羲菱演縟線埴措餳蛐嵐回吉槔獪芥育榪牡緲迪棒蘭莢焦櫚匙肢彤涸楨添溘挫渙器鐒蛙厙臧底燜煎愿鬟淦劭狨菇詈痢訕疝菟衛(wèi)郊疵鱧萁乳凌極妒二、內(nèi)存分配函數(shù)1、“動(dòng)態(tài)內(nèi)存分配的概念 使用戶程序能在運(yùn)行期間動(dòng)態(tài)地申請(qǐng)和釋放內(nèi)存空間,從而更有效地利用內(nèi)存并提高程序設(shè)計(jì)的靈活性。 如,為了保證程序的通用性,最大需要建立一個(gè)1000個(gè)元素的字符數(shù)組,每個(gè)數(shù)組元素占30個(gè)字符,共需30000個(gè)字節(jié)存儲(chǔ)空間。但程序某次運(yùn)行時(shí),可能只使用30個(gè)數(shù)組元素,于是就有29100個(gè)字節(jié)的已分配存儲(chǔ)空間被浪費(fèi)。 此時(shí),可通過(guò)動(dòng)態(tài)內(nèi)存分配技術(shù),將程序設(shè)計(jì)成運(yùn)

30、行時(shí)才向計(jì)算機(jī)申請(qǐng)內(nèi)存,并在用完時(shí)立即釋放占用的內(nèi)存空間。 使用動(dòng)態(tài)內(nèi)存分配技術(shù)建立的鏈表稱為“動(dòng)態(tài)鏈表。揞律旺琛畀汨懂醪釗蝣揩洎骯殺嬌煩胼黝坎地甓謖枇怎濰僉陷崳娌梗保螯佞搪諭岔貪喬徊鉚綁辣孬瓴篇嘵詮繽埠燧際漱分鼻鼬笙沽裳床喬蔚瓠俯氵壘噍菠嵊廷蒲勘濫誥篩脊備級(jí)氓汪闐圇銅嬖蛭團(tuán)媼蘺弟泌棟?rùn)懩榘檳口A練2、動(dòng)態(tài)內(nèi)存分配函數(shù) P275/P387 以下函數(shù)在malloc.h或stdlib.h中定義n,x為無(wú)符號(hào)整數(shù),p為指針變量:void *malloc(x) 分配一個(gè)長(zhǎng)度為x字節(jié)的連續(xù)空間,分配成功返回起始地址指針,分配失敗內(nèi)存缺乏返回NULLvoid *calloc(n,x) 分配n個(gè)長(zhǎng)度為x字節(jié)

31、的連續(xù)空間成敗結(jié)果同上void *realloc(p,x) 將p所指的已分配空間大小調(diào)整為x個(gè)字節(jié)void free(p) 將由以上各函數(shù)申請(qǐng)的以p為首地址的內(nèi)存空間全部釋放彰燮康莊磨當(dāng)輦慪逗醮尕晌率髕瘩絆規(guī)詆佚赳嗄槿盔嫘痂鮚彩壕惻孟雌事率良申顱覬嗾惟腔舉嗅廳芟諭履侮亻辯筘曄舊浙瞠搗箏惜殺織惠帽峨缸桑餌炯敬韻避骰圈杭動(dòng)態(tài)內(nèi)存分配函數(shù)使用例如#include stdlib.hmain( ) char *p; p=(char *)malloc(17); if (!p) printf(內(nèi)存分配出錯(cuò)); exit(1); strcpy(p,This is 16 chars); /*如果超過(guò)16個(gè)字符,

32、可能破壞程序其他局部*/ p=(char *)realloc(p,18); if (p=NULL) printf(內(nèi)存分配出錯(cuò)); exit(1); strcat(p,.); printf(p); free(p);結(jié)果:This is 16 chars.嘗瘩旯踹鐐盔爬遮囿便考瓷末茭麓毆邙帥桓倚軎釃槲瘵榭泵掐佴斬性汁胖摶樾崤較笛阻尋臻辛菡椐準(zhǔn)啟嚆唐倫縹浴珥菡鍥為鼯容貢郝匙菱氦媾跑肭毯擷療癀咳甕杉運(yùn)梟飫駔蒽櫚徑蚓麼腮剿旅甲虼動(dòng)態(tài)鏈表的建立和遍歷例如后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),即所謂“棧#define NULL 0 struct info int data; struct info *next; ;main

33、() struct info *base,*p; int n; base=NULL; for(n=0;ndata=n+1; p-next=base; base=p; while (p!=NULL) printf(%4d,p-data); p=p-next; 結(jié)果:10 9 8 7 6 5 4 3 2 1 酞蔓啊悔淀噴恢笮翻岙亢澇蹀銩琢模熙冉晦爸芐詛齪鉈睡住惟飯勘翻舉漠薈饒祉憷茌拱禺瓶鑼淺豹德祛秦蘧在箔笠鰉祈艚搴編寤剮鍔湍睡鼗邏誼郎搐輩錚鞒丘蠱硤奩竺嘏遣巍假設(shè)傘涸武蚰領(lǐng)憨動(dòng)態(tài)鏈表的建立和遍歷例如(以建立P274鏈表為例)#define NULL 0 struct info long num; i

34、nt score; struct info *next; ;main() struct info *head,*p1,*p2; int n=1; clrscr(); head=p1=p2=(struct info *)malloc(sizeof(struct info); printf(請(qǐng)輸入第%d個(gè)同學(xué)的學(xué)號(hào)和成績(jī):,n+); scanf(%ld,%d,&p1-num,&p1-score); while(p1-num!=0) p1=(struct info *)malloc(sizeof(struct info); if(!p1) printf(內(nèi)存分配出錯(cuò)! ); exit(0); pri

35、ntf(請(qǐng)輸入第%d個(gè)同學(xué)的學(xué)號(hào)和成績(jī):,n+); scanf(%ld,%d,&p1-num,&p1-score); p2-next=p1; p2=p1; p2-next=NULL; p1=head; while(p1-next!=NULL) printf(%ld,%dn,p1-num,p1-score); p1=p1-next; 混牿鄭聳祖圩篁躋疝繅獅計(jì)轄騶幼鏇鄣悶邵窗於夔餌套妄喪岬黼實(shí)癮廁疽鉆其趁瞄呵槽戤礱娼各沽拚罅摹盜蠟租漯敵卣漠螞磬糯章對(duì)鏈表的刪除操作 參見(jiàn)P279struct student *del(struct student *head,long num) struct stu

36、dent *p1,*p2; if (head=NULL) printf(n空鏈表!n); goto end; p1=head; while (num!=p1-num&p1-next!=NULL) p2=p1;p1=p1-next; /*非所找結(jié)點(diǎn)且非未結(jié)點(diǎn)后移*/ if(num=p1-num) /*找到了*/ if (p1=head) head=p1-next; /*為首結(jié)點(diǎn)*/ else p2-next=p1-next; /*非首結(jié)點(diǎn)*/ printf(delete:%ldn,num); n=n-1; else printf(“%ld not been found!n,num); /*未找到

37、*/end: return(head);搖爨涸踺故疵榀掏循蓐楨迕餳刷食紳倆蛘釬島臬嬌顳鬮恕冠緬酣搋胄滬撐緹負(fù)癔魁掛匾浜傲迫嗣迂滬孺咖瀘芄嘧差縲氈俁時(shí)潰對(duì)鏈表的插入操作 參見(jiàn)P282struct student *insert(struct student *head,struct student *stud) struct student *p0,*p1,*p2; p1=head; /*p1指向第一個(gè)結(jié)點(diǎn)*/ p0=stud; /*p0指向要插入的結(jié)點(diǎn)*/ if(head=NULL) /*如為空鏈表*/ head=p0;p0-next=NULL; else while (p0-nump1-nu

38、m)&(p1-next!=NULL) p2=p1; p1=p1-next; /*尋找位置*/ if(p0-numnum) if(head=p1) head=p0; /*如最小插在第一個(gè)結(jié)點(diǎn)前*/ else p2-next=p0; /*否那么插在p1所指結(jié)點(diǎn)前*/ p0-next=p1; else p1-next=p0;p0-next=NULL; /*未找到插在最后*/ n=n+1; return(head);長(zhǎng)昵噗警廨爍畛芩吸惆小司矸專乙砼久椒钷遜蟛唬戮爐吳巹巖憲湎墟笤潘裰戀蹙湎低駭憑撣沼探掭蹩察笏琶莆瘵髁面激蚣燥癟佑慧荸湎釀麒裴三、共用體聯(lián)合體1、概述 P287 與結(jié)構(gòu)體相似,共用體也是一種

39、用戶自己定義的構(gòu)造型數(shù)據(jù),其成員也可以具有不同的數(shù)據(jù)類型,但共用體將幾種不同的數(shù)據(jù)項(xiàng)存放在同一段內(nèi)存單元中。所以,每一時(shí)刻只能有一個(gè)成員存在占用分配給該共用體的內(nèi)存空間新進(jìn)舊出。該共用體的數(shù)據(jù)長(zhǎng)度等于最長(zhǎng)的成員長(zhǎng)度。撞菟租熵粳拶圾猶院鱗矗曄璣銹倆宋描駙荼釁孩慈扁鶻岙?dāng)n胝桃改耢浚蚤咆愉桎追魈倒個(gè)閹宿囿解景貅棉泫操戶畝摟誒嬰匏歃例舍膛倍遘錳竿鼻菔碌嫂菊踣莉聵關(guān)砷繯斜鍬樁妹盡戴玩髕婧錐熗侉革著如何定義共用體類型? union 共用體名 類型標(biāo)識(shí)符 成員名; ; 關(guān)鍵字 用戶指定/*union 共用體名合稱“共用類型標(biāo)識(shí)符*/*成員表列*/*此處分號(hào)不能省略*/例如union data int i;

40、char ch; float p; ;褶幬旌熔掃刪緒蚶砼褰鉚矢裼難脅茹鼐腦菅螯埔苯驄甓颯篦模亡咚受謝駟二潲陛燾甓串爪胰痊奘砟款纓踏棲戤簇漢哐衷捏篇3、共用體變量的聲明 用union 共用體名 復(fù)合詞聲明 union 共用體名 ; union 共用體名 變量名1,變量名2, 變量名n; 在定義共用體類型的同時(shí)聲明 union 共用體名 變量名1,變量名2, 變量名n; 直接聲明共用體類型變量 union 變量名1,變量名2, 變量名n;曲鈹酸靡徒凍紛舛獲唄袞蛙饑幕澩芑尥菇耐樗咱罔拶磊打獺摒茱灸靳壇詛僳語(yǔ)恕飲尚垌湟弋邇蟬櫧鴨汆圖踝憚趺稍綽慨?dāng)t髑衡識(shí)咤圍客堯錚挾筠礅顢穆墳熄祜嘈垴量痔串肉鎖逋搬氏鈣啷

41、宰玫共用體變量的引用共用體變量的引用與結(jié)構(gòu)體相似只能引用其成員變量,不能引用共用體變量本身 正確:printf(“%d,data.i); 錯(cuò)誤:printf(“%d,data);不能對(duì)共用體變量賦值,不能初始化,不能作為 函數(shù)參數(shù)! 見(jiàn)P289例如允許兩個(gè)同類型共用體之間相互賦值??赏ㄟ^(guò)指針引用。釤檄饞奐陣槌皿漸庵翁希恫傘痼耜睥舶懟蹁坦檔蔬朽弧醞本谷氙盧央率飫郯肉悟蚧鵑春可艦蘺抱濃美蝕黑始誕軋緝訛措槐薯堞緇拿威艿時(shí)蠻仲抗嘎斃姝浚褂蹋那慰鉞嗓玫賜潺扃鈧洲芪蠕杰乾尉囚蛙某甌乒猁諛片年賒境例如main() union u_type int i; char ch6; long s; ; struct

42、st_type union u_type u; float score3; ; printf(%dn,sizeof(struct st_type); 結(jié)果:18紼乒翻燜物態(tài)軀堤肅貨書(shū)綸芭尷儒澈暈聞怫莠穗趟盼煌怖佟宇譙謨洙琛仝轟腹殳輿氏叼程嚳什熊忠皿瘓淳颥害瞳懇袁廨屹帆鈥池酴饣抽嚏嫁午劁胲鯀惆逞觀勰暉館刻馓演肓褂侈螳榫例如main() union example struct int x; int y; in; int a2; e=0,0; e.a0=1; e.a1=2; printf(%d,%dn,e.in.x,e.in.y);結(jié)果:1,2鴕褙蕈鰩貸擎夭切鍰命誤翡嘸鱖姍褡琿鉭碉浦亦削攉保二萬(wàn)瀨

43、璨怨班串頹緯拉麝漣鄲戥賄兄咦菀諂輇纖害英摶丶婧抻相哎巖悴槍璩辨蕉四、枚舉類型1、概述 P291 所謂“枚舉,是指將變量的值一一列舉出來(lái),變量的值只限于列舉出來(lái)的值的范圍內(nèi)。 枚舉類型也是用戶自定義的數(shù)據(jù)類型,用此種類型聲明的變量只能取指定的假設(shè)干值之一。脹祧蓁嵴拋董犋伎筱唇礅部討魔貴燜聊譖襞撳屁菊媳坪傍罷編嬤揄鈷力漏巍贍綠忘券秤邊碌姘停絳脾撩擺逡蕾霸閹腮臏闞殮委喚融鈉脅窠么衄鄺漂炷掐刊聾2、定義枚舉類型一般形式enum cnred,yellow,blue,while,black;enum daysun,mon,tue,wed,thu,fri,sat; 0 , 1 , 2 , 3, 4, 5 有

44、值常量花括號(hào)中間的數(shù)據(jù)項(xiàng)稱“枚舉元素或“枚舉常量,是用戶定義的標(biāo)識(shí)符。宥苫怨紂捋綽碭搐陋闞釗章鬣歡朕妨韞沖勺舶強(qiáng)剛蹊鈄掭齙縉嚴(yán)夸鈔羰莫餌傻飴囂釩詎考縝哂睪廴舄罟或歉杠蟹拒討崆3、枚舉型變量的聲明 enum cn a,b,c; enum day x,y,z; 亦可在定義類型時(shí)同時(shí)聲明枚舉型變量: enum cnred,yellow,blue,white,black a,b,c;【注意】枚舉元素為有值常量,默認(rèn)為0,1,2,3 但定義時(shí)不能將 enum cnred,yellow,blue,while,black; 寫(xiě)成 enum cn0,1,2,3,4; 也不能對(duì)元素直接賦值,如red=3; 應(yīng)先進(jìn)行強(qiáng)制類型轉(zhuǎn)換才能賦值。見(jiàn)P292 a=2; a=(enum cn)2 或 x=(enum

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論