




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第10章章 結構體、共同體和枚舉類型結構體、共同體和枚舉類型10.1 結構體類型結構體類型 學生的信息包括學號、姓名、性別、年學生的信息包括學號、姓名、性別、年齡和成績齡和成績用單個變量表示學生信息用單個變量表示學生信息用結構體類型描述學生信息用結構體類型描述學生信息一、一、結構體類型聲明結構體類型聲明 學生的信息包括學號、姓名、性別、年齡和學生的信息包括學號、姓名、性別、年齡和成績成績struct student char sno8;/ 學號學號 char name20;/ 姓名姓名 char sex;/ 性別性別 int age;/ 年齡年齡 double score3;/ 三門課程的成
2、績三門課程的成績; 結構體類型聲明結構體類型聲明的一般形式:的一般形式:struct 標記名稱標記名稱 成員列表成員列表; 標記名稱是一個標識符,也可以省略標標記名稱是一個標識符,也可以省略標記名稱,表示匿名結構體類型記名稱,表示匿名結構體類型 成員列表是組成這個結構體類型的各數成員列表是組成這個結構體類型的各數據項,其一般形式:據項,其一般形式:類型說明符類型說明符1 成員名成員名1_1 , 成員名成員名1_2, 成員名成員名1_3, ;類型說明符類型說明符2 成員名成員名2_1 , 成員名成員名2_2, 成員名成員名2_3, ;類型說明符類型說明符n 成員名成員名n_1 , 成員名成員名n
3、_2, 成員名成員名n_3, ; 成員名是一個標識符成員名是一個標識符 結構體類型聲明既可以放在函數之外,結構體類型聲明既可以放在函數之外,被其作用范圍內的所有函數使用;也可以被其作用范圍內的所有函數使用;也可以放在某個函數的函數體內,只能在該函數放在某個函數的函數體內,只能在該函數的函數體內使用的函數體內使用 如果如果 sizeof 運算符的運算對象是結構體類型,運算運算符的運算對象是結構體類型,運算結果是所有成員占內存大小結果是所有成員占內存大小(按字節計算按字節計算)再加上內部和再加上內部和尾部填充所占內存大小尾部填充所占內存大小(按字節計算按字節計算)的總和的總和struct stud
4、ent char sno8; char name20; char sex;sizeof(struct student) int age; double score3;二、結構體類型的變量聲明二、結構體類型的變量聲明1、先聲明結構體類型再聲明變量、先聲明結構體類型再聲明變量struct 標記名稱標記名稱 成員列表成員列表;struct 標記名稱標記名稱 變量名變量名1 , 變量名變量名2, 變量名變量名3, ;struct student char sno8; char name20; char sex; int age; double score3;struct student s;struc
5、t s;/ 錯誤錯誤student s;/ 錯誤錯誤2、在聲明結構體類型的同時聲明變量、在聲明結構體類型的同時聲明變量struct 標記名稱標記名稱 成員列表成員列表 變量名變量名1 , 變量名變量名2, 變量名變量名3, ;struct student char sno8; char name20; char sex; int age; double score3; s1, s2;3、使用匿名結構體類型聲明變量、使用匿名結構體類型聲明變量struct 成員列表成員列表 變量名變量名1 , 變量名變量名2, 變量名變量名3, ;struct char sno8; char name20; ch
6、ar sex; int age; double score3; s1, s2;struct date int year; int month; int day;struct student char sno8; char name20; char sex; struct date birthday; double score3;三、初始化結構體類型的變量三、初始化結構體類型的變量 在結構體類型的變量聲明時給變量賦值,在結構體類型的變量聲明時給變量賦值,稱為初始化稱為初始化struct student char sno8; char name20; char sex; int age; doub
7、le score3;struct student s = 2015001, LiMing, M, 18, 85.0, 92.5, 95.5;struct date int year; int month; int day;struct student t = 2015001, LiMing, M, 1997, 11, 18, 85.0, 92.5, 95.5;struct student char sno8; char name20; char sex; struct date birthday; double score3;四、引用結構體類型的變量四、引用結構體類型的變量1、不能將結構體類型
8、的變量作為一個整體、不能將結構體類型的變量作為一個整體進行輸入或輸出進行輸入或輸出struct student char sno8; char name20; char sex; int age; double score3;struct student s = 2015001, LiMing, M, 18, 85.0, 92.5, 95.5;printf(%s, %s, %c, %d, %f, %f, %f, s);/ 錯誤錯誤 引用結構體類型的變量中的成員要使用引用結構體類型的變量中的成員要使用成員選擇運算符成員選擇運算符 “ . ”,其一般形式:,其一般形式:結構體類型的變量名結構體類型
9、的變量名.成員名成員名struct student char sno8; char name20; char sex; int age; double score3;struct student s = 2015001, LiMing, M, 18, 85.0, 92.5, 95.5;s.age = 20;s.age+;sum = s.score0 + s.score1 + s.score2;2、如果成員本身又是一個結構體類型的變、如果成員本身又是一個結構體類型的變量,則要用若干成員運算符,一級一級地量,則要用若干成員運算符,一級一級地找到最低一級的成員找到最低一級的成員struct date
10、 int year; int month; int day;struct student t = 2015001, LiMing, M, 1997, 11, 18, 85.0, 92.5, 95.5;t.snot.birthday.yearstruct student char sno8; char name20; char sex; struct date birthday; double score3;3、除了初始化,在其他位置只能用同類型、除了初始化,在其他位置只能用同類型的變量為結構體類型的變量賦值,或者為的變量為結構體類型的變量賦值,或者為其成員賦值其成員賦值struct stude
11、nt char sno8; char name20; char sex; int age; double score3; s1, s2;strcpy(s1.sno, 2015001);strcpy(, LiMing);s1.sex = M;s1.age = 18;s1.score0 = 85.0;s1.score1 = 92.5;s1.score2 = 95.5;s2 = s1;【例【例10.1】 初始化結構體類型的變量,然初始化結構體類型的變量,然后輸出該變量后輸出該變量#include int main(void) struct student char sno8; char
12、 name20; char sex; int age; double score3; ; . return 0;struct student s = 2015001, LiMing, M, 18, 85.0, 92.5, 95.5;int i;printf(sno: %sn, s.sno);printf(name: %sn, );printf(sex: %cn, s.sex);printf(age: %dn, s.age);printf(score:);for (i = 0; i 3; i+) printf(%5.1f, s.scorei);printf(n);【例【例10.2】
13、輸入結構體類型的變量中各成輸入結構體類型的變量中各成員的值,為結構體類型的變量賦值員的值,為結構體類型的變量賦值#include struct student char sno8; char name20; char sex; int age; double score3;int main(void) . return 0;struct student s1, s2;int i;printf(Input the students information: );scanf(%s%s%c%d, s1.sno, , &s1.sex, &s1.age);for (i =
14、0; i 3; i+) scanf(%lf, &s1.scorei);struct student s1, s2;int i;printf(Input the students information: );scanf(%c%s%s%d, &s1.sex, s1.sno, , &s1.age);for (i = 0; i 3; i+) scanf(%lf, &s1.scorei);s2 = s1;printf(sno: %sn, s2.sno);printf(name: %sn, );printf(sex: %cn, s2.sex);
15、printf(age: %dn, s2.age);printf(score:);for (i = 0; i ”,可以,可以直觀、方便地通過指向結構體類型的指針直觀、方便地通過指向結構體類型的指針變量訪問該結構體類型變量的成員,其一變量訪問該結構體類型變量的成員,其一般形式:般形式:指向結構體類型的指針變量名指向結構體類型的指針變量名-成員名成員名struct student char sno8; char name20; char sex; int age; double score;struct student s, *p = &s; 有以下三種方式有以下三種方式可訪問結構體類型變可
16、訪問結構體類型變量量s的成員的成員sno,它們,它們是等價的:是等價的:s.sno(*p).snop-sno【例例10.3】 使用指向結構體類型的指針變使用指向結構體類型的指針變量訪問該結構體類型變量的成員量訪問該結構體類型變量的成員#include #include struct student char sno8; char name20; char sex; int age; double score;int main(void) struct student s; struct student *p; . return 0;strcpy(s.sno, 2015001);strcpy(s
17、.name, LiMing);s.sex = M;s.age = 18;s.score = 92.5;puts(tts.sextts.agetts.score);printf(%stt%stt%ctt%dtt%.1fnn, s.sno, , s.sex, s.age, s.score);p = &s; puts(*p).snot(*p).namet(*p).sext(*p).aget(*p).score);printf(%stt%stt%ctt%dtt%.1fn, (*p).sno, (*p).name, (*p).sex, (*p).age, (
18、*p).score);puts(p-snottp-namettp-sexttp-agettp-score);printf(%stt%stt%ctt%dtt%.1fn, p-sno, p-name, p-sex, p-age, p-score);10.2 結構體類型與數組結構體類型與數組一、數組聲明一、數組聲明1、先聲明結構體類型再聲明數組先聲明結構體類型再聲明數組struct student char sno8; char name20; char sex; int age; double score;struct student s10;2、在聲明結構體類型的同時聲明數組在聲明結構體類型的同
19、時聲明數組struct student char sno8; char name20; char sex; int age; double score; s10;3、使用匿名結構體類型聲明數組、使用匿名結構體類型聲明數組struct char sno8; char name20; char sex; int age; double score; s10;二、引用數組元素的成員二、引用數組元素的成員struct student char sno8; char name20; char sex; int age;s5.age double score;struct student s10;三、初始
20、化數組三、初始化數組【例【例10.4】 初始化數組,輸出數組中的每初始化數組,輸出數組中的每一個數組元素一個數組元素#include struct student char sno8; char name20; char sex; int age; double score;int main(void) struct student s3 = 2015001, LiMing, M, 18, 92.5, 2015002, WangFang, F, 18, 95.5, 2015003, ZhangHuaFeng, M, 19, 85.0 ; int i; . return 0;puts( sno
21、name sex age score);for (i = 0; i 3; i+) printf(%s%20s%5c%5d%8.1fn, si.sno, , si.sex, si.age, si.score);【例例10.5】 輸入三個學生的信息,輸出成輸入三個學生的信息,輸出成績績(score)高于平均成績的學生信息高于平均成績的學生信息#include struct student char sno8; char name20; char sex; int age; double score;int main(void) struct student s3; int i; do
22、uble sum = 0, avg; . return 0;puts(Input three students information(sex, sno, name, age, score):);for (i = 0; i 3; i+) scanf(%c%s%s%d%lf, &si.sex, si.sno, , &si.age, &si.score); sum += si.score;puts(Input three students information(sex, sno, name, age, score):);for (i = 0; i 3; i+
23、) scanf(%c%s%s%d%lf, &si.sex, si.sno, , &si.age, &si.score); getchar( ); sum += si.score;avg = sum / 3;printf(The average score is %4.1fn, avg);puts(sno name sex age score);for (i = 0; i avg) printf(%s%20s%5c%5d%8.1fn, si.sno, , si.sex, si.age, si.score);10.3 結構體類型與函數結構體類型與
24、函數一、形參是結構體類型的變量一、形參是結構體類型的變量【例例10.6】 輸出兩個學生中成績輸出兩個學生中成績(score)較較高的學生信息高的學生信息#include struct student char sno8; char name20; char sex; int age; double score;struct student max(struct student t1, struct student t2);int main(void) struct student s1 = 2015001, LiMing, M, 18, 92.5; struct student s2 = 20
25、15002, WangFang, F, 18, 95.5; struct student s; . return 0;s = max(s1, s2);printf(sno: %sn, s.sno);printf(name: %sn, );printf(sex: %cn, s.sex);printf(age: %dn, s.age);printf(score: %4.1fn, s.score);struct student max(struct student t1, struct student t2) if (t1.score t2.score) return t1; else
26、return t2;【例例10.7】 修改學生的年齡修改學生的年齡#include struct student char sno8; char name20; char sex; int age; double score;void change(struct student t);int main(void) struct student s = 2015001, LiMing, M, 18, 92.5; puts(tttsnottnametsextagetscore); 輸出輸出s各成員的值各成員的值 change(s); 輸出輸出s各成員的值各成員的值 return 0;void ch
27、ange(struct student t) t.age+;二、形參是指向結構體類型的指針變量二、形參是指向結構體類型的指針變量【例【例10.8】 輸出兩個學生中成績輸出兩個學生中成績(score)較較高的學生信息高的學生信息#include struct student char sno8; char name20; char sex; int age; double score;struct student *max(struct student *p1, struct student *p2);int main(void) struct student s1 = 2015001, LiM
28、ing, M, 18, 92.5; struct student s2 = 2015002, WangFang, F, 18, 95.5; struct student *q; . return 0;q = max(&s1, &s2);printf(sno: %sn, q-sno);printf(name: %sn, q-name);printf(sex: %cn, q-sex);printf(age: %dn, q-age);printf(score: %4.1fn, q-score);struct student *max(struct student *p1, struc
29、t student *p2) if (p1-score p2-score) return p1; else return p2;【例例10.9】 修改學生的年齡修改學生的年齡#include struct student char sno8; char name20; char sex; int age; double score;void change(struct student *p);int main(void) struct student s = 2015001, LiMing, M, 18, 92.5; struct student *q = &s; puts(tttsn
30、ottnametsextagetscore); 輸出輸出s各成員的值各成員的值 change(q); 輸出輸出s各成員的值各成員的值 return 0;void change(struct student *p) p-age+;三、形參是數組元素為結構體類型的數組三、形參是數組元素為結構體類型的數組【例例10.10】 輸入三個學生的信息并輸出輸入三個學生的信息并輸出#include struct student char sno8; char name20; char sex; int age; double score;void input(int n, struct student t )
31、;void output(int n, struct student *t);int main(void) struct student s3; input(3, s); output(3, s); return 0;void input(int n, struct student t ) int i; printf(Input %d students information(sex, sno, name, age,score):n, n); for (i = 0; i n; i+) scanf(%c%s%s%d%lf, &ti.sex, ti.sno, , &t
32、i.age, &ti.score); getchar(); void output(int n, struct student *t) int i; puts( sno name sex age score); for (i = 0; i n; i+) printf(%s%20s%5c%5d%8.1fn, ti.sno, , ti.sex, ti.age, ti.score);10.5 單鏈表單鏈表 鏈表結構鏈表結構(單鏈表單鏈表),用于存儲百家姓的,用于存儲百家姓的前四個姓前四個姓(ZHAO、QIAN、SUN、LI) 單鏈表的元素稱為結點,每個結點包括單鏈表的元素稱為結
33、點,每個結點包括兩個域:存儲實際數據的域稱為數據域;兩個域:存儲實際數據的域稱為數據域;存儲下一個結點地址的域稱為指針域存儲下一個結點地址的域稱為指針域 為了在編程時方便處理,往往在單鏈表為了在編程時方便處理,往往在單鏈表的第一個結點之前附設一個結點,稱為頭的第一個結點之前附設一個結點,稱為頭結點結點 頭結點的數據域不存儲任何信息,頭結頭結點的數據域不存儲任何信息,頭結點的指針域存儲第一個結點的地址點的指針域存儲第一個結點的地址一、一、動態存儲庫函數動態存儲庫函數1、庫函數、庫函數malloc 所需包含的頭文件:所需包含的頭文件:stdlib.h 函數原型:函數原型:void *malloc(
34、unsigned int size); 功能:分配長度為功能:分配長度為size個字節的存儲單個字節的存儲單元,當執行成功時,返回一個指向所分配元,當執行成功時,返回一個指向所分配存儲單元起始地址的指針;否則,返回存儲單元起始地址的指針;否則,返回NULL2、庫函數、庫函數free 所需包含的頭文件:所需包含的頭文件:stdlib.h 函數原型:函數原型:void free(void *ptr);功能:釋放指針變量功能:釋放指針變量ptr指向的存儲單元指向的存儲單元【例例10.11】 調用庫函數調用庫函數malloc和和free,分,分配、釋放存儲單元配、釋放存儲單元#include #inc
35、lude struct student char sno8; char name20; char sex; int age; double score;int main(void) struct student *p; p = (struct student *)malloc(sizeof(struct student); scanf(%c%s%s%d%lf,&p-sex, p-sno, p-name, &p-age, &p-score); 輸出輸出信息信息 free(p); p = NULL; return 0;二、二、單鏈表的基本操作單鏈表的基本操作 通常用結構體類
36、型的變量來表示單鏈表通常用結構體類型的變量來表示單鏈表中的結點,一個結構體類型的變量包含若中的結點,一個結構體類型的變量包含若干成員,用指針類型的成員存儲下一個結干成員,用指針類型的成員存儲下一個結點的地址點的地址struct student char sno8; char name20; char sex; int age; double score; struct student *next;【例【例10.12】 建立一個學生信息的單鏈表,建立一個學生信息的單鏈表,輸出單鏈表中的學生信息,然后銷毀單鏈輸出單鏈表中的學生信息,然后銷毀單鏈表表#include #include struct
37、student char sno8; char name20; char sex; int age; double score; struct student *next;void insert_node(struct student *head, struct student *p);void traverse(struct student *head);void delete_node(struct student *head);int main(void) struct student *h, *q; int i, n; . return 0;printf(Input the numbe
38、r of students: );scanf(%d, &n);getchar( );h = (struct student *)malloc(sizeof(struct student);h-next = NULL;printf(Input %d students information(sex,sno,name,age,score):n,n);for (i = 0; i sex, q-sno, q-name, &q-age, &q-score); getchar( ); insert_node(h, q);traverse(h);while (h-next) dele
39、te_node(h);free(h);h = NULL;void insert_node(struct student *head, struct student *p) p-next = head-next; head-next = p;void traverse(struct student *head) struct student *p; puts( sno name sex age score); p = head-next; while (p) printf(%s%20s%5c%5d%8.1fn, p-sno, p-name, p-sex, p-age, p-score); p =
40、 p-next; void delete_node(struct student *head) struct student *p; p = head-next; head-next = p-next; printf(Deleting the student %s n, p-sno); free(p); p = NULL;10.6 枚舉類型枚舉類型 所謂所謂“枚舉枚舉”,就是將變量的可取值一,就是將變量的可取值一一列舉出來,變量只能存、取其中的某個一列舉出來,變量只能存、取其中的某個值,存、取其他值是錯誤的值,存、取其他值是錯誤的一、枚舉類型聲明一、枚舉類型聲明 枚舉類型聲明的一般形式:枚舉類
41、型聲明的一般形式:enum 標記名稱標記名稱 枚舉常量枚舉常量1, 枚舉常量枚舉常量2, 枚舉常量枚舉常量3, ; 標記名稱是一個標識符,也可以省略標標記名稱是一個標識符,也可以省略標記名稱,表示匿名枚舉類型記名稱,表示匿名枚舉類型 枚舉常量是類型為枚舉常量是類型為int的標識符的標識符enum weekday sun, mon, tue, wed, thu, fri, sat; 枚舉類型聲明既可以放在函數之外,被枚舉類型聲明既可以放在函數之外,被其作用范圍內的所有函數使用;也可以放其作用范圍內的所有函數使用;也可以放在某個函數的函數體內,只能在該函數的在某個函數的函數體內,只能在該函數的函數
42、體內使用函數體內使用 如果如果sizeof運算符的運算對象是枚舉類運算符的運算對象是枚舉類型,運算結果與型,運算結果與sizeof(int)的運算結果相同的運算結果相同enum weekday sun, mon, tue, wed, thu, fri, sat;sizeof(enum weekday)二、枚舉常量的值二、枚舉常量的值 在枚舉類型聲明中,枚舉常量的值從在枚舉類型聲明中,枚舉常量的值從0開始,依次加開始,依次加1enum weekday sun, mon, tue, wed, thu, fri, sat;【例【例10.14】 輸出枚舉常量的值輸出枚舉常量的值#include enu
43、m weekday sun, mon, tue, wed, thu = 10, fri, sat;int main(void) printf(sun: %dn, sun); printf(mon: %dn, mon); printf(tue: %dn, tue); printf(wed: %dn, wed); printf(thu: %dn, thu); printf(fri: %dn, fri); printf(sat: %dn, sat); return 0;三、三、枚舉類型的變量聲明枚舉類型的變量聲明1、先聲明枚舉類型再聲明變量先聲明枚舉類型再聲明變量enum 標記名稱標記名稱 枚舉常量枚舉常量1, 枚舉常量枚舉常量2, 枚舉常量枚舉常量3, ;enum 標記名稱標記名稱 變量名變量名1 , 變量名變量名2, 變量名變量名3, ;enum weekday sun, mon, tue, wed, thu, fri, sat;enum weekday today;enum today;/ 錯誤錯誤weekday today; / 錯誤錯誤2、在聲明枚
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2021-2026年中國夾布輸水膠管市場發展前景預測及投資戰略咨詢報告
- 汽車烤漆房項目投資可行性研究分析報告(2024-2030版)
- 2025年中國郵件系統市場深度評估及投資方向研究報告
- 2025年中國咖啡飲料市場深度調查評估及投資方向研究報告
- 2025年中國間廳柜行業市場全景評估及發展前景預測報告
- 2025至2030手動旋轉門行業產業運行態勢及投資規劃深度研究報告
- 2025至2030土豆煎鍋行業項目調研及市場前景預測評估報告
- 2025至2030中國燒烤調料行業發展趨勢分析與未來投資戰略咨詢研究報告
- 2025至2030中國溶解氣浮(DAF)系統行業發展趨勢分析與未來投資戰略咨詢研究報告
- 2025至2030中國泵車行業市場發展分析及競爭格局與投資價值評估報告
- 《課件鐵路發展史》課件
- 2025年貴州茅臺酒廠集團招聘筆試參考題庫含答案解析
- 消渴中醫護理查房
- 兒童護照辦理委托書
- 《中藥調劑技術》課件-中藥調劑的概念、起源與發展
- 《數據中心節能方法》課件
- 2024年變電設備檢修工(高級)技能鑒定理論考試題庫-上(選擇題)
- 循環系統疾病智慧樹知到答案2024年哈爾濱醫科大學附屬第一醫院
- 2024-2030年中國激光水平儀行業市場發展趨勢與前景展望戰略分析報告
- 部編本小學語文六年級下冊畢業總復習教案
- JB∕T 11864-2014 長期堵轉力矩電動機式電纜卷筒
評論
0/150
提交評論