版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第九章 結(jié)構(gòu)體與共用體目的要求: 掌握結(jié)構(gòu)體和共用體定義和引用方式 學(xué)習(xí)用結(jié)構(gòu)體和共用體處理數(shù)據(jù) 掌握鏈表的創(chuàng)建方式和基本應(yīng)用重點(diǎn)難點(diǎn): 結(jié)構(gòu)體的定義 結(jié)構(gòu)體數(shù)組的使用 鏈表的應(yīng)用9.1 結(jié)構(gòu)體&結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型&用途:把不同類型的數(shù)據(jù)組合成一個整體-自定義數(shù)據(jù)類型結(jié)構(gòu)體類型定義struct 結(jié)構(gòu)體名 類型標(biāo)識符 成員名; 類型標(biāo)識符 成員名; .;成員類型可以是基本型或構(gòu)造型struct是關(guān)鍵字,不能省略合法標(biāo)識符可省:無名結(jié)構(gòu)體例 struct student int num; char name20; char sex; int age; float score; char ad
2、dr30; ; namenumsexagescoreaddr2字節(jié)2字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié).結(jié)構(gòu)體類型定義描述結(jié)構(gòu)的組織形式,不分配內(nèi)存例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2; 9.2 結(jié)構(gòu)體變量的定義先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量v一般形式: struct 結(jié)構(gòu)體名 類型標(biāo)識符 成員名; 類型標(biāo)識符 成員名; .;struct 結(jié)構(gòu)體名 變量名表列;例 #define student struct
3、student student int num; char name20; char sex; int age; float score; char addr30; ; student stu1,stu2; 定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量一般形式:struct 結(jié)構(gòu)體名 類型標(biāo)識符 成員名; 類型標(biāo)識符 成員名; .變量名表列;例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 直接定義結(jié)構(gòu)體變量一般形式:struct 類型標(biāo)識符 成員名; 類型標(biāo)識符
4、成員名; .變量名表列;例 struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 用無名結(jié)構(gòu)體直接定義變量只能一次說明v結(jié)構(gòu)體類型與結(jié)構(gòu)體變量概念不同l類型:不分配內(nèi)存; 變量:分配內(nèi)存l類型:不能賦值、存取、運(yùn)算; 變量:可以v結(jié)構(gòu)體可嵌套v結(jié)構(gòu)體成員名與程序中變量名可相同,不會混淆例 struct date int month; int day; int year; ; struct student int num; char name20; struct date birt
5、hday; stu;numnamebirthdaymonthdayyear例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu;numnamebirthdaymonthdayyear9.3 結(jié)構(gòu)體變量的引用引用規(guī)則v 結(jié)構(gòu)體變量不能整體引用,只能引用變量成員v可以將一個結(jié)構(gòu)體變量賦值給另一個結(jié)構(gòu)體變量v結(jié)構(gòu)體嵌套時逐級引用成員(分量)運(yùn)算符優(yōu)先級: 1結(jié)合性:從左向右引用方式: 結(jié)構(gòu)體變量名.成員名例 struct student int num; char
6、name20; char sex; int age; float score; char addr30; stu1,stu2; stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score; stu1.age+;例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; printf(“%d,%s,%c,%d,%f,%sn”,stu1); ()stu1=101,“wan lin”,m,19,87.5,“dalian”; ()例
7、 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu2=stu1; ( )例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例 struct student int num; char name20; ch
8、ar sex; int age; float score; char addr30; stu1,stu2; if(stu1=stu2). ()9.4 結(jié)構(gòu)體變量的初始化形式一:struct 結(jié)構(gòu)體名 類型標(biāo)識符 成員名; 類型標(biāo)識符 成員名; .;struct 結(jié)構(gòu)體名 結(jié)構(gòu)體變量=初始數(shù)據(jù);例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“wang lin”,m,19, “200 beijing road”;形式二:struct 結(jié)構(gòu)體名 類型標(biāo)識
9、符 成員名; 類型標(biāo)識符 成員名; .結(jié)構(gòu)體變量=初始數(shù)據(jù);例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,“wang lin”,m,19, “200 beijing road”; 形式三:struct 類型標(biāo)識符 成員名; 類型標(biāo)識符 成員名; .結(jié)構(gòu)體變量=初始數(shù)據(jù);例 struct int num; char name20; char sex; int age; char addr30; stu1=112,“wang lin”,m,19, “200 beijing road”;
10、 9.5 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組的定義三種形式:形式一: struct student int num; char name20; char sex; int age; ;struct student stu2;形式二: struct student int num; char name20; char sex; int age; stu2;形式三: struct int num; char name20; char sex; int age; stu2;numnamesexagenumnamesexagestu0stu125b結(jié)構(gòu)體數(shù)組初始化例 struct int num; char nam
11、e20; char sex; int age; stu =,;順序初始化: struct student int num; char name20; char sex; int age; ;struct student stu =100,“wang lin”,m,20, 101,“l(fā)i gang”,m,19, 110,“l(fā)iu yan”,f,19; 例 struct student int num; char name20; char sex; int age; stu =,;分行初始化: struct student int num; char name20; char sex; int a
12、ge; ;struct student stu =100,“wang lin”,m,20, 101,“l(fā)i gang”,m,19, 110,“l(fā)iu yan”,f,19; 全部初始化時維數(shù)可省結(jié)構(gòu)體數(shù)組引用引用方式: 結(jié)構(gòu)體數(shù)組名下標(biāo).成員名 struct student int num; char name20; char sex; int age; str3;stu1.age+;strcpy(,”zhaoda”);例 統(tǒng)計后選人選票struct person char name20; int count;leader3=“l(fā)i”,0,“zhang”,0,”wang“,0;
13、 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+; for(i=0;i成員名結(jié)構(gòu)體變量名.成員名指向運(yùn)算符優(yōu)先級: 1結(jié)合方向:從左向右例 指向結(jié)構(gòu)體的指針變量main() struct student long int num; char name20; char sex; float score; stu_1,*p; p=&stu_1; stu_1.nu
14、m=89101; strcpy(stu_1.name,li lin); p-sex=m; p-score=89.5; printf(nno:%ldnname:%snsex:%cnscore:%fn, (*p).num,p-name,stu_1.sex,p-score);例 int n; int *p=&n; *p=10; n=10struct student stu1;struct student *p=&stu1;stu1.num=101; (*p).num=101指向結(jié)構(gòu)體數(shù)組的指針例 指向結(jié)構(gòu)體數(shù)組的指針struct student int num; char name20; char
15、sex; int age;stu3=10101,li lin,m,18, 10102,zhang fun,m,19, 10104,wang min,f,20;main() struct student *p; for(p=stu;pnum,p-name,p-sex,p-age);numnamesexagestu0pstu1stu2p+1用指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)v用結(jié)構(gòu)體變量的成員作參數(shù)-值傳遞v用指向結(jié)構(gòu)體變量或數(shù)組的指針作參數(shù)-地址傳遞v用結(jié)構(gòu)體變量作參數(shù)-多值傳遞,效率低struct data int a, b, c; ;main() void func(struct data); s
16、truct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(call func().n); func(arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data parm) printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(process
17、.n); parm.a=18; parm.b=5; parm.c=parm.a*parm.b; printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(return.n);arga :27b: 3c :30(main)(func)parma :27b: 3c :30copyarga :27b: 3c :30(main)(func)parma :18b: 5c :90arga :27b: 3c :30(main)arga :27b: 3c :30(main)例 用結(jié)構(gòu)體變量作函數(shù)參數(shù)struct data int a
18、, b, c; ;main() void func(struct data *parm); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(call func().n); func(&arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data *parm) printf(parm-a=%d parm-b=%d
19、 parm-c=%dn,parm-a,parm-b,parm-c); printf(process.n); parm-a=18; parm-b=5; parm-c=parm-a*parm-b; printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c); printf(return.n);arga :18b: 5c :90(main)arga :27b: 3c :30(main)例 用結(jié)構(gòu)體指針變量作函數(shù)參數(shù)arga :27b: 3c :30(main)(func)parm*arga :18b: 5c :90(main)(func)p
20、arm*9.7 共用體&構(gòu)造數(shù)據(jù)類型,也叫聯(lián)合體&用途:使幾個不同類型的變量共占一段內(nèi)存(相互覆蓋)共用體類型定義定義形式:union 共用體名 類型標(biāo)識符 成員名; 類型標(biāo)識符 成員名; .;例 union data int i; char ch; float f; ;fchi類型定義不分配內(nèi)存形式一: union data int i; char ch; float f; a,b;形式二: union data int i; char ch; float f; ; union data a,b,c,*p,d3;形式三: union int i; char ch; float f; a,b,
21、c;共用體變量的定義fchifchiab共用體變量定義分配內(nèi)存,長度=最長成員所占字節(jié)數(shù)共用體變量任何時刻只有一個成員存在共用體變量引用v引用方式:例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); (編譯通過,運(yùn)行結(jié)果不對) v引用規(guī)則l不能引用共用體變量,只能引用其成員共用體指針名-成員名共用體變量名.成員名(*共用體指針名).成員名union data int i; char ch; float f; ; union data a,b,c,*p,d3;a.i a.ch a.fp-i p-ch p-f(*p).i (*p).ch (*p).fd0.i d
22、0.ch d0.fl共用體變量中起作用的成員是最后一次存放的成員例 union int i; char ch; float f; a; a=1; () l不能在定義共用體變量時初始化例 union int i; char ch; float f; a=1,a,1.5; () l可以用一個共用體變量為另一個變量賦值例 float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; () x=a.f; ()例 將一個整數(shù)按字節(jié)輸出01100001 01000001低字節(jié)高字節(jié)0100000101100001ch0c
23、h1運(yùn)行結(jié)果:i=60501ch0=101,ch1=141ch0=a,ch1=amain() union int_char int i; char ch2; x; x.i=24897; printf(i=%on,x.i); printf(ch0=%o,ch1=%on ch0=%c,ch1=%cn, x.ch0,x.ch1,x.ch0,x.ch1);結(jié)構(gòu)體與共用體v區(qū)別: 存儲方式不同struct node char ch2; int k;a;union node char ch2; int k;b;achkbch k變量的各成員同時存在任一時刻只有一個成員存在v聯(lián)系: 兩者可相互嵌套例 結(jié)構(gòu)體
24、中嵌套共用體 name numsexjobclasspositionliwang10112086fmst501prof循環(huán)n次讀入姓名、號碼、性別、職務(wù)job=s真真假假讀入class讀入position輸出“輸入錯”循環(huán)n次job=s真假輸出:姓名,號碼,性別,職業(yè),班級輸出:姓名,號碼,性別,職業(yè),職務(wù)job=tstruct int num; char name10; char sex; char job; union int class; char position10; category;person2;例共用體中嵌套結(jié)構(gòu)體,機(jī)器字?jǐn)?shù)據(jù)與字節(jié)數(shù)據(jù)的處理 00010010 0011010
25、0低字節(jié)高字節(jié)0011010000010010lowhigh0 x123400010010 11111111低字節(jié)高字節(jié)1111111100010010lowhigh0 x12ffstruct w_tag char low; char high;union u_tag struct w_tag byte_acc; int word_acc;u_acc;word_accbyte_acc.lowbyte_acc.highu_acc共用體變量的應(yīng)用1.#include 2.struct student3. int type; /* 0表示學(xué)生,1表示老師 */4. union5. char stui
26、d10,teachid10; /* 學(xué)號、編號 */6. number;7. char name12;8.a;9.main()10. printf(input the members type(0 is student,1 is teacher):n);11. scanf(%d,&a.type);12. if(a.type)13. printf(input the teachers no:n); scanf(%s,a.number.teachid);14. else15. printf(input the students no:n); scanf(%s,a.number.stuid);16.
27、 17. printf(input the name:n); scanf(%s,);18. if(a.type) /*輸出變量成員信息*/19. printf(no:%s name:%s n,a.number.stuid,);20. else21. printf(no:%s name:%s n,a.number.teachid,);22.9.8、枚舉類型1、概述 p291 所謂“枚舉”,是指將變量的值一一列舉出來,變量的值只限于列舉出來的值的范圍內(nèi)。 枚舉類型也是用戶自定義的數(shù)據(jù)類型,用此種類型聲明的變量只能取指定的若干值之一。2、定義枚舉類型一般形式enu
28、m cnred,yellow,blue,while,black;enum daysun,mon,tue,wed,thu,fri,sat; 0 , 1 , 2 , 3, 4, 5 (有值常量)花括號中間的數(shù)據(jù)項稱“枚舉元素”或“枚舉常量”,是用戶定義的標(biāo)識符。3、枚舉型變量的聲明 enum cn a,b,c; enum day x,y,z; 亦可在定義類型時同時聲明枚舉型變量: enum cnred,yellow,blue,white,black a,b,c;【注意】枚舉元素為有值常量,默認(rèn)為0,1,2,3 但定義時不能將 enum cnred,yellow,blue,while,black;
29、寫成 enum cn0,1,2,3,4; 也不能對元素直接賦值,如red=3; 應(yīng)先進(jìn)行強(qiáng)制類型轉(zhuǎn)換才能賦值。見p292 a=2; a=(enum cn)2 或 x=(enum day)(5-3); 但可在定義時改變其值。示例一、以下程序的運(yùn)行結(jié)果是什么?main() enum colorred,green=4,blue,white=blue+10; printf(%d,%d,%dn,red,blue,white);二、以下正確的枚舉類型定義是 。a) enum a=“sun”,”mon”,”tue”; b) enum bsun=7,mon=-1,tue;c) enum c 7,1,2; 示例
30、main() enum colorred,green,blue,white; enum color fc; clrscr(); printf(請輸入色號:); scanf(%d,&fc); switch (fc) case red:printf(紅色!);break; case green:printf(綠色!);break; case blue:printf(藍(lán)色!);break; case white:printf(白色!);break; default:printf(其他顏色!); 9.9 typedef類型定義類型定義在c語言中,除了提供標(biāo)準(zhǔn)的類型和自定義的結(jié)構(gòu)體、共用體和枚舉類型外,
31、也可使用typedef定義新的類型名來代替已有的類型名。新的類型名與標(biāo)準(zhǔn)的類型名一樣,可以定義相應(yīng)的變量。使用typedef的目的,一個是給數(shù)據(jù)類型一個易記住的名子,另一個是簡化一些比較復(fù)雜的類型聲明。typedef語句的一般形式為: typedef 原數(shù)據(jù)類型原數(shù)據(jù)類型 新的類型名新的類型名;如: typedef char character; typedef int integer;typedef類型定義類型定義 經(jīng)上述定義后,character就與char等價,integer與int等價,例如: char k; int i; 與 chaeacter k; integer i; 是等價的。
32、 上述的定義類型名的別名是為了更好給變量一個易記且有意義的名子,也可以簡化一些復(fù)雜的類型聲明,如聲明結(jié)構(gòu)體類型: typedef struct char name12,sex; int age; student;typedef類型定義類型定義聲明了新的類型名student,代表上面指定一個結(jié)構(gòu)體類型。這時也這樣定義結(jié)構(gòu)體變量: student stu1,stu2;則stu1和stu2都屬于結(jié)構(gòu)體類型變量,等價于: struct student char name12,sex; int age; stu1,stu2;這樣就簡化了結(jié)構(gòu)體變量的聲明。typedef類型定義類型定義 同樣typedef
33、也可以定義數(shù)組類型和指針類型,定義的方法與上述的方法相類似。如以下例子中: typedef struct student char name12,sex; int age; student, *stu; student,與*stu是等價的,都代替了結(jié)構(gòu)體類型struct student,則student *stu1, *stu2;與stu stu1, stu2等價。 值得注意的是,typedef只能對已存在的類型增加一個類型名,并沒有定義的新的類型,而且typedef只能用來定義各種類型名,而不可定義變量。同時建議讀者把用typedef定義的類型名用大寫字母表示,以區(qū)別系統(tǒng)提供的標(biāo)準(zhǔn)類型。10
34、.8 本章小結(jié)本章小結(jié) 通過本章對結(jié)構(gòu)體和共用體的學(xué)習(xí),了解了結(jié)構(gòu)體和共用體的特點(diǎn)和各種使用方法,以及共用體與結(jié)構(gòu)體的區(qū)別,同時也學(xué)習(xí)了鏈表這一動態(tài)進(jìn)行存儲分配的數(shù)據(jù)結(jié)構(gòu)。讀者在對本章的學(xué)習(xí)中,應(yīng)注意如下幾點(diǎn): (1)結(jié)構(gòu)體的定義形式為: struct 結(jié)構(gòu)體名 類型標(biāo)識符 成員1; 類型標(biāo)識符 成員2; 類型標(biāo)識符 成員n; ;本章小結(jié)本章小結(jié) (2)結(jié)構(gòu)體變量有三種定義形式:先定義結(jié)構(gòu)體類型,后定義結(jié)構(gòu)體變量;定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量;不定義結(jié)構(gòu)體類型名,直接定義結(jié)構(gòu)體變量。 (3)c語言一般不允許對結(jié)構(gòu)體變量的整體引用,所以對結(jié)構(gòu)體的引用只能是對分量的引用,結(jié)構(gòu)體變量中的任一分
35、量可以表示為:結(jié)構(gòu)體變量名成員名。 (4)c語言中數(shù)組的成員可以是結(jié)構(gòu)體變量,結(jié)構(gòu)體變量的成員也可以是數(shù)組。結(jié)構(gòu)體數(shù)組有三種定義形式:先定義結(jié)構(gòu)體類型,后定義結(jié)構(gòu)體數(shù)組;定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體數(shù)組;不定義結(jié)構(gòu)體類型名,直接定義結(jié)構(gòu)體變量。 (5)結(jié)構(gòu)體變量中的成員可以是指針變量,也可以定義指向結(jié)構(gòu)體的指針變量,指向結(jié)構(gòu)體的指針變量的值是某一結(jié)構(gòu)體變量在內(nèi)存中的首地址。結(jié)構(gòu)體指針的定義形式: struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 *結(jié)構(gòu)體指針變量名結(jié)構(gòu)體指針變量名;本章小結(jié)本章小結(jié) (6)結(jié)構(gòu)體的成員可以是指針類型,且這個指針類型就是本結(jié)構(gòu)體類型的,這樣可以構(gòu)造出一種動態(tài)數(shù)據(jù)結(jié)構(gòu)成為鏈
36、表。 (7)結(jié)構(gòu)體變量的成員可以作函數(shù)的參數(shù)、指向結(jié)構(gòu)體變量的指針也可以作函數(shù)的參數(shù)。 (8)共用體是用同一段內(nèi)存存放不同類型的數(shù)據(jù),所以在每一時刻內(nèi)存只有一個成員,共用體變量存放的數(shù)據(jù)是最后放入的數(shù)據(jù)。共用體變量的長度是最大的成員的長度共用體變量的地址和它所有成員的地址都是相同的。 (9)不能對共用體進(jìn)行初始化,也不能對共用體變量進(jìn)行賦值??梢杂弥赶蚬灿皿w變量的指針作為函數(shù)的參數(shù),但不能用共用體變量名作為函數(shù)的參數(shù)。本章小結(jié)本章小結(jié) (10)枚舉類型僅適用于取限值有限的變量。 (11)typedef只能對已存在的類型增加一個類型名,并沒有定義的新的類型,而且typedef只能用來定義各種類型
37、名,而不可定義變量。 重點(diǎn):結(jié)構(gòu)體及結(jié)構(gòu)體類型的定義,結(jié)構(gòu)體類型變量,結(jié)構(gòu)體數(shù)組,指向結(jié)構(gòu)體的指針。 難點(diǎn):結(jié)構(gòu)體數(shù)組,鏈表的概念及操作,結(jié)構(gòu)體變量成員與共用體變量成員在內(nèi)存分布形式。9.8 鏈表鏈表的概念鏈表的概念鏈表是利用結(jié)構(gòu)體和指針構(gòu)造的一種常見的數(shù)據(jù)結(jié)構(gòu),它是由若干個結(jié)點(diǎn)串連在一起的,可以進(jìn)行動態(tài)地存儲分配,鏈表的長度不固定,可以隨時增加或刪除。鏈表可分為單向鏈表、雙向鏈表、循環(huán)鏈表等。在本節(jié)中,只討論單向鏈表。一個鏈表由頭指針、若干個結(jié)點(diǎn)和一表尾組成,鏈表的中每個結(jié)點(diǎn)包括兩個部分,即數(shù)據(jù)元素信息和指針元素信息,數(shù)據(jù)元素信息存放用戶所用到的信息,元素信息存放指向下一個結(jié)點(diǎn)地址的信息。特
38、點(diǎn): 按需分配內(nèi)存 不連續(xù)存放 有一個“頭指針”(head)變量 每個結(jié)點(diǎn)中應(yīng)包括一個指針變量,用它存放下一結(jié)點(diǎn)的地址。 最后一個結(jié)點(diǎn)的地址部分存放一個“null” (空地址)。鏈表結(jié)點(diǎn)定義形式定義形式: struct student int number; char name6; struct student *next; ;鏈表操作常用技術(shù)語句p=p-next 在鏈表結(jié)點(diǎn)間順序移動指針 將p原來所指結(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),p
39、1指新建結(jié)點(diǎn),此句的功能是使p1所指新結(jié)點(diǎn)變成鏈表中的新的末結(jié)點(diǎn)。 p2-next=null 讓p2所在結(jié)點(diǎn)成為鏈表中最后結(jié)點(diǎn)示例若已建立下面的鏈表結(jié)構(gòu),指針p指向某單向鏈表的首結(jié)點(diǎn),如下圖所示。struct node int data; struct node *next; *p;以下語句能正確輸出該鏈表所有結(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) while (p) printf(“%7d,”,(*p).da
40、ta); p=p-next; d) while (p!=null) printf(“%7d,”, p-data); p+; 答案:c鏈表指針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+); printf(%pn,p+); printf(%dn,sizeof(st); 結(jié)果: ffda ffe0 ffd6 ffec 6結(jié)論: 若p指向某個結(jié)構(gòu)體變量,則 p+ 的功能是將指針p 移
41、到本結(jié)點(diǎn)后的存儲單元,而不是本結(jié)點(diǎn)的下一個成員處。所以鏈表中不能用p+進(jìn)行結(jié)點(diǎn)間的跳轉(zhuǎn)。 靜態(tài)鏈表的建立 p274 例11.7#define null 0struct student long num; float score; struct student *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;
42、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)形成鏈表?最后一個結(jié)點(diǎn)如何建立?如何從一個結(jié)點(diǎn)轉(zhuǎn)到下一結(jié)點(diǎn)?如何遍歷所有結(jié)點(diǎn)?內(nèi)存分配函數(shù)1、“動態(tài)內(nèi)存分配”的概念 使用戶程序能在運(yùn)行期間動態(tài)地申請和釋放內(nèi)存空間,從而更有效地利用內(nèi)存并提高程序設(shè)計的靈活性。 如,為了保證程序的通用性,最大需要建立一個1000個元素的字符數(shù)組,每個數(shù)組元素占30個字符,共需30000個字節(jié)存儲空間。但程序某次運(yùn)行時,可能只使用30個數(shù)組元素,于是就有29100個字節(jié)的已分配存儲空間被浪費(fèi)。 此時,可通過動態(tài)內(nèi)存分配技術(shù),將程序設(shè)計成運(yùn)行時才向計算機(jī)申請內(nèi)存,并在用完時立即釋放占用的內(nèi)存空間。 使用動態(tài)內(nèi)存分配技術(shù)建立的鏈表稱為“動態(tài)鏈表”。2、動態(tài)內(nèi)存分配函數(shù) p275/p387 以下函數(shù)在malloc.h或stdlib.h中定義(n,x為無符號整數(shù),p為指針變量):void *malloc(x) 分配一個長度為x字節(jié)的連續(xù)空間,分配成功返回起始地址指針,分配失?。▋?nèi)存不足)返回nullvoid *calloc(n,x) 分配n個長度為x字節(jié)的連續(xù)空間(成敗結(jié)果同上)void *realloc(p,x) 將p所指的
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年研發(fā)合作采購協(xié)議2篇
- 2024高速鐵路線路安全監(jiān)測合同
- 中國石油大學(xué)(北京)《人與環(huán)境(環(huán)境修復(fù)與可持續(xù)發(fā)展)》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江傳媒學(xué)院《產(chǎn)品形象設(shè)計》2023-2024學(xué)年第一學(xué)期期末試卷
- 營業(yè)員工作總結(jié)
- 2025年度高端裝備制造承諾賒銷協(xié)議3篇
- 建筑行業(yè)美工室內(nèi)外設(shè)計立體效果圖制作
- 護(hù)眼保健品知識培訓(xùn)課件
- 電影院前臺服務(wù)技巧分享
- 聽證員專業(yè)知識培訓(xùn)課件
- 2025年中國AI AGENT(人工智能體)行業(yè)市場動態(tài)分析、發(fā)展方向及投資前景分析報告
- 家居建材行業(yè)綠色材料應(yīng)用及節(jié)能設(shè)計方
- 大慶市2025屆高三年級第二次教學(xué)質(zhì)量檢測(二模)政治試卷(含答案)
- 2024年中國玩具工程車市場調(diào)查研究報告
- 2025年內(nèi)蒙古阿拉善額濟(jì)納旗事業(yè)單位引進(jìn)48人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025-2030年中國電動三輪車市場發(fā)展現(xiàn)狀及前景趨勢分析報告
- TCABEE 063-2024 建筑光儲直柔系統(tǒng)變換器 通 用技術(shù)要求
- 【9化期末】合肥市廬陽區(qū)2023-2024學(xué)年九年級上學(xué)期期末化學(xué)試題
- 高一下學(xué)期生物人教版必修二:3.4 基因通常是有遺傳效應(yīng)的DNA片段課件
- 雅禮中學(xué)2024-2025學(xué)年初三創(chuàng)新人才選拔數(shù)學(xué)試題及答案
- 下屬企業(yè)考核報告范文
評論
0/150
提交評論