南京師范大學(xué)C語言第十講.ppt
《南京師范大學(xué)C語言第十講.ppt》由會員分享,可在線閱讀,更多相關(guān)《南京師范大學(xué)C語言第十講.ppt(39頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第十一章 結(jié)構(gòu)體與共用體,本章主要內(nèi)容: 1.結(jié)構(gòu)體定義、使用、初始化 2.結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針 3.單鏈表操作及其應(yīng)用 4.共用體、枚舉類型和用typedef定義類型,11.1 結(jié)構(gòu)體 結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型 用途:把不同類型的數(shù)據(jù)組合成一個整體-------自定義數(shù)據(jù)類型 結(jié)構(gòu)體類型定義,struct 結(jié)構(gòu)體名 類型標識符 成員名; 類型標識符 成員名; . ;,成員類型可以是 基本型或構(gòu)造型,struct是關(guān)鍵字, 不能省略,合法標識符 可省:無名結(jié)構(gòu)體,例 struct student int num; char name20; char sex
2、; int age; float score; char addr30; ;,結(jié)構(gòu)體類型定義描述結(jié)構(gòu) 的組織形式,不分配內(nèi)存 student 是類型名,不是變量,結(jié)構(gòu)體類型定義的作用域,注意有;號,例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2;,11.2 結(jié)構(gòu)體變量的定義 1.先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量 一般形式:,struct
3、 結(jié)構(gòu)體名 類型標識符 成員名; 類型標識符 成員名; . ; struct 結(jié)構(gòu)體名 變量名表列;,例 #define STUDENT struct student STUDENT int num; char name20; char sex; int age; float score; char addr30; ; STUDENT stu1,stu2;,2. 定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量 一般形式:,struct 結(jié)構(gòu)體名 類型標識符 成員名; 類型標識符 成員名; . 變量名表列;,例 struct
4、student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,3. 直接定義結(jié)構(gòu)體變量 一般形式:,struct 類型標識符 成員名; 類型標識符 成員名; . 變量名表列;,例 struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,用無名結(jié)構(gòu)體直接定義 變量只能一次,說
5、明 結(jié)構(gòu)體成員名與程序中變量名可相同,不會混淆 結(jié)構(gòu)體類型及變量的作用域與生存期,11.3 結(jié)構(gòu)體變量的引用 引用規(guī)則 結(jié)構(gòu)體變量不能整體引用,只能引用變量成員,可以將一個結(jié)構(gòu)體變量賦值給另一個結(jié)構(gòu)體變量 結(jié)構(gòu)體嵌套時逐級引用 結(jié)構(gòu)體變量地址與成員地址不同: char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,形式二:,struct 結(jié)構(gòu)體名 類型標識符 成員名; 類型標識符 成員名;
6、 . 結(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 類型標識符 成員名; 類型標識符 成員名; . 結(jié)構(gòu)體變量=初始數(shù)據(jù);,例 struct int num; char name20; char sex; int age; char addr30; stu1=112
7、,“Wang Lin”,M,19, “200 Beijing Road”;,11.5 結(jié)構(gòu)體數(shù)組 1. 結(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;
8、int age; stu2;,2. 結(jié)構(gòu)體數(shù)組初始化,例 struct int num; char name20; char sex; int age; stu =,,;,順序初始化: struct student int num; char name20; char sex; int age; ; struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19;,例 struct student int
9、 num; char name20; char sex; int age; stu =,,;,3. 結(jié)構(gòu)體數(shù)組引用: 點記法,引用方式: 結(jié)構(gòu)體數(shù)組名下標.成員名,例 11.2 統(tǒng)計侯選人選票 P287,struct person char name20; int count; leader3=“Li”,0,“Zhang”,0,”Wang“,0; #include main() int i,j; char leader_name20; for(i=1;i<=10;i++) scanf(%s,leader_name); for(j=0;j<3;j++) if(
10、strcmp(leader_name,leaderj.name)==0) leaderj.count++; for(i=0;i<3;i++) printf(%5s:%dn,leaderi.name,leaderi.count); ,11.6 結(jié)構(gòu)體和指針 1. 指向結(jié)構(gòu)體變量的指針 定義形式:struct 結(jié)構(gòu)體名 *結(jié)構(gòu)體指針名; 例 struct student *p;,使用結(jié)構(gòu)體指針變量引用成員形式,存放結(jié)構(gòu)體變量在內(nèi)存的起始地址,指向運算符 優(yōu)先級: 1 結(jié)合方向:從左向右,例 指向結(jié)構(gòu)體的指針變量,main() struct student long int num;
11、 char name20; char sex; float score; stu_1,*p; p= ,例 int n; int *p= n=10,struct student stu1; struct student *p= (*p).num=101,2. 指向結(jié)構(gòu)體數(shù)組的指針,例 11.2 指向結(jié)構(gòu)體數(shù)組的指針,struct student int num; char name20; char sex; int age; stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20; ma
12、in() struct student *p; for(p=stu;pnum,p-name,p-sex,p-age); ,3. 用指向結(jié)構(gòu)體的指針作函數(shù)參數(shù) 用結(jié)構(gòu)體變量的成員作實參 用結(jié)構(gòu)體變量作參數(shù)----多值傳遞,效率低 用指向結(jié)構(gòu)體變量或數(shù)組的指針作形參參數(shù)----實參傳遞結(jié)構(gòu)體的地址,struct stud int no; char name20; float score; ; void din(struct stud s,int n); void prt(struct stud s,int n); main() struct stud st140,*p; int
13、 i; din(st1,40); prt(st1,40); ,例 11.3 用結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù):一個班級學(xué)號,姓名,成績輸入輸出.,void din(struct stud s,int n) int i; for(i=0; i 14、 struct stud *next; ;,表尾標記,2. 動態(tài)內(nèi)存分配函數(shù) (得到內(nèi)存塊, 釋放內(nèi)存塊),(1) void *malloc(unsigned size); 在動態(tài)存儲區(qū)分配一個長度為size的連續(xù)空間, 返回起始地址(指針), 或0 (NULL, 不成功) 例: struct stud *p; p=(struct stud *) mallc(sizeof(struct stud));,(2) void *calloc(unsigned n,unsigned size) 分配 n 個,每個長度為size的空間,分配成功, 返回首址; 不成功返回0 (NU 15、LL).,#include 或 ,#include 或 ,NULL在stdio.h 中定義為0,(3) void free(void *ptr) 釋放ptr指向的內(nèi)存區(qū),(3) void free(void *ptr) 釋放ptr指向的內(nèi)存區(qū),3、單鏈表操作 設(shè)有定義:,#include 或 stdlib.h, mem.h,建立鏈表 插入節(jié)點 刪除節(jié)點 遍歷鏈表,#include struct stud int no; float score; struct stud *next; struct stud *head,*u,*p;,(1) 建立鏈表 head=N 16、ULL;,(2) 插入 插入表首,NULL為 0 建立的是空表,,,,,p-next=head; head=p;, 插入表中間 (插在已知節(jié)點u之后),,,,p-next = u-next; u-next = p;,,(3) 刪除 刪除首節(jié)點,,,p=head; if (p!=NULL) head=p-next; p-next = NULL; ,p,,,,,,,NULL,,,(3) 刪除 刪除表中間節(jié)點 (刪除已知節(jié)點的后繼節(jié)點),,,p=u-next; if (p!=NULL) u-next=p-next; p-next = NULL; ,p,,,,,,,NU 17、LL,,,,u,,,(4) 遍歷 如:輸出鏈表每個節(jié)點的數(shù)據(jù),p=head; while (p!=NULL) printf(“%d %fn”,p-no,p-score); p = p-next ; ,p,,,,p,,p,,p,改寫成for 語句, 自己完成,#include struct intr int data; struct intr *next; ; main( ) struct intr *head,*p; int x; head=0; /* 建立空表 */ printf(input data:n); scanf(“%d, ,4. 舉例. 例11.4: 18、從鍵盤輸入一系列正整數(shù),遇<=0結(jié)束; 組成先進后出堆棧輸出。FILO,算法: 1. 建立單鏈表 2. 讀入第1個數(shù)據(jù) 3. while (x0) 4. 生成節(jié)點 5. 插入 6. 讀入后續(xù)數(shù)據(jù) 7. 遍歷輸出,printf(“n”); p=head; while (p!=NULL) printf(%d,p-data); p=p-next; ,輸入:1 2 3 4 5 0 輸出: 5 4 3 2 1,#include struct intr int data; struct intr *next; ; main( ) stru 19、ct intr *head,*p,*t; int x; head=t=0; printf(input data:n); scanf(“%d, ,例 11.5 從鍵盤輸入一系列正整數(shù),遇<=0結(jié)束; 組成先進先出隊列輸出。 FIFO,/* 加表尾標記 */ t-next=0; printf(“n”); p=head; while (p!=0) printf(%d,p-data); p=p-next; ,#include struct intr int data; struct intr *next; ; main( ) stru 20、ct intr *head,*u,*v,*p; int x; head=0; printf(input data:n); scanf(“%d,,例 11.6 從鍵盤輸入一系列正整數(shù),遇<0結(jié)束; 利用鏈表進行插入排序 (從小到大).,p-data=x; /* 建立節(jié)點*/ p-next=v; /* 連后指針 */ if (v==head) head=p; else u-next=p; /*連前指針*/ scanf(%d, ,11.8 共用體 構(gòu)造數(shù)據(jù)類型,也叫聯(lián)合體 用途:使幾個不同類型的變量共占一段內(nèi)存(相互覆蓋) 1. 共用體 21、類型定義 定義形式:,union 共用體名 類型標識符 成員名; 類型標識符 成員名; . ;,例 union data int i; char ch; float f; ;,類型定義不分配內(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,c;,2 22、. 共用體變量的定義,共用體變量定義分配內(nèi)存, 長度=最長成員所占字節(jié)數(shù),共用體變量任何時刻 只有一個成員存在,3. 共用體變量引用 引用方式:,例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); (編譯通過,運行結(jié)果不對),引用規(guī)則 不能引用共用體變量,只能引用其成員,共用體變量中起作用的成員是最后一次存放的成員,例 union int i; char ch; float f; a; a=1; (),不能在定義共用體變量時初始化,例 union int i; char ch; float f; 23、a=1,a,1.5; (),可以用一個共用體變量為另一個變量賦值,例 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; (),例 11.7 將一個整數(shù)按字節(jié)輸出,運行結(jié)果: i=60501 ch0=101,ch1=141 ch0=A,ch1=a,main() union int_char int i; char ch2; x; x.i=24897; printf(i=%on,x.i); printf(ch0=%o,ch1=%on ch0=% 24、c,ch1=%cn, x.ch0,x.ch1,x.ch0,x.ch1); ,4. 結(jié)構(gòu)體與共用體 區(qū)別: 存儲方式不同,聯(lián)系: 兩者可相互嵌套,例 11.8 結(jié)構(gòu)體中嵌套共用體 (p289 例11.12 ),struct int num; char name10; char sex; char job; union int class; char position10; category; person2;,例11.9 共用體中嵌套結(jié)構(gòu)體,機器字數(shù)據(jù)與字節(jié)數(shù)據(jù)的處理,struct w_tag char low; char high; ; union u_tag st 25、ruct w_tag byte_acc; int word_acc; u_acc;,11.9 枚舉 將值一一列舉出來,直接定義變量 enum sun,mon,tue,wed,thu,fri,satworkday,week_end; 可以比較, 可以強制賦值: workday=(enum weekday)3; 也可由程序員指定枚舉元素的值: enum weekdaysun=7,mon=1,tue,wed,thu,fri,satworkday,weekend; 2 3 4 5 6, enum weekday sun,mon,tue,wed,thu,fri,sat 26、; 類型定義 0 1 2 3 4 5 6 常量 enum weekday workday,week_end; 變量定義 week_end=sat; printf(“%d”,week_end); 輸出 6,11.10 用typedef定義類型 功能:為已有數(shù)據(jù)類型定義一個類型名。 類型定義簡單形式: typedef type name;,例 typedef int INTEGER;,類型定義語句關(guān)鍵字,已有數(shù)據(jù)類型名,用戶定義的類型名,例 typedef float REAL;,類型定義后,與已有類型一樣使用,例 INTEGER a,b,c; REAL f1 27、,f2;,typedef定義類型的方法: 按定義變量方法先寫出定義體 如 int i; 將變量名換成新類型名 如 int INTEGER; 最前面加typedef 如 typedef int INTEGER; 用新類型名定義變量 如 INTEGER i,j;,例 定義數(shù)組類型 int a100; int ARRAY100; typedef int ARRAY100; ARRAY a,b,c;, int a100,b100,c100;,例 定義指針類型 char *str; char *STRING; typedef char *STRING; STRING p,s10;, char *p; char *s10;,
- 溫馨提示:
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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運動會安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結(jié)+在機關(guān)“弘揚憲法精神推動發(fā)改工作高質(zhì)量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊教研組工作總結(jié)
- 2024年小學(xué)高級教師年終工作總結(jié)匯報
- 2024-2025年秋季第一學(xué)期初中物理上冊教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報告
- 2025年學(xué)校元旦迎新盛典活動策劃方案
- 2024年學(xué)校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報告