南京師范大學C語言第十講.ppt
《南京師范大學C語言第十講.ppt》由會員分享,可在線閱讀,更多相關《南京師范大學C語言第十講.ppt(39頁珍藏版)》請在裝配圖網上搜索。
1、第十一章 結構體與共用體,本章主要內容: 1.結構體定義、使用、初始化 2.結構體數組和結構體指針 3.單鏈表操作及其應用 4.共用體、枚舉類型和用typedef定義類型,11.1 結構體 結構體是一種構造數據類型 用途:把不同類型的數據組合成一個整體-------自定義數據類型 結構體類型定義,struct 結構體名 類型標識符 成員名; 類型標識符 成員名; . ;,成員類型可以是 基本型或構造型,struct是關鍵字, 不能省略,合法標識符 可省:無名結構體,例 struct student int num; char name20; char sex
2、; int age; float score; char addr30; ;,結構體類型定義描述結構 的組織形式,不分配內存 student 是類型名,不是變量,結構體類型定義的作用域,注意有;號,例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2;,11.2 結構體變量的定義 1.先定義結構體類型,再定義結構體變量 一般形式:,struct
3、 結構體名 類型標識符 成員名; 類型標識符 成員名; . ; struct 結構體名 變量名表列;,例 #define STUDENT struct student STUDENT int num; char name20; char sex; int age; float score; char addr30; ; STUDENT stu1,stu2;,2. 定義結構體類型的同時定義結構體變量 一般形式:,struct 結構體名 類型標識符 成員名; 類型標識符 成員名; . 變量名表列;,例 struct
4、student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,3. 直接定義結構體變量 一般形式:,struct 類型標識符 成員名; 類型標識符 成員名; . 變量名表列;,例 struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,用無名結構體直接定義 變量只能一次,說
5、明 結構體成員名與程序中變量名可相同,不會混淆 結構體類型及變量的作用域與生存期,11.3 結構體變量的引用 引用規(guī)則 結構體變量不能整體引用,只能引用變量成員,可以將一個結構體變量賦值給另一個結構體變量 結構體嵌套時逐級引用 結構體變量地址與成員地址不同: char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,形式二:,struct 結構體名 類型標識符 成員名; 類型標識符 成員名;
6、 . 結構體變量=初始數據;,例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,形式三:,struct 類型標識符 成員名; 類型標識符 成員名; . 結構體變量=初始數據;,例 struct int num; char name20; char sex; int age; char addr30; stu1=112
7、,“Wang Lin”,M,19, “200 Beijing Road”;,11.5 結構體數組 1. 結構體數組的定義 三種形式:,形式一: 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. 結構體數組初始化,例 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. 結構體數組引用: 點記法,引用方式: 結構體數組名下標.成員名,例 11.2 統計侯選人選票 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 結構體和指針 1. 指向結構體變量的指針 定義形式:struct 結構體名 *結構體指針名; 例 struct student *p;,使用結構體指針變量引用成員形式,存放結構體變量在內存的起始地址,指向運算符 優(yōu)先級: 1 結合方向:從左向右,例 指向結構體的指針變量,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. 指向結構體數組的指針,例 11.2 指向結構體數組的指針,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. 用指向結構體的指針作函數參數 用結構體變量的成員作實參 用結構體變量作參數----多值傳遞,效率低 用指向結構體變量或數組的指針作形參參數----實參傳遞結構體的地址,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 用結構體數組作函數參數:一個班級學號,姓名,成績輸入輸出.,void din(struct stud s,int n) int i; for(i=0; i 14、 struct stud *next; ;,表尾標記,2. 動態(tà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指向的內存區(qū),(3) void free(void *ptr) 釋放ptr指向的內存區(qū),3、單鏈表操作 設有定義:,#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é)點的數據,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、從鍵盤輸入一系列正整數,遇<=0結束; 組成先進后出堆棧輸出。FILO,算法: 1. 建立單鏈表 2. 讀入第1個數據 3. while (x0) 4. 生成節(jié)點 5. 插入 6. 讀入后續(xù)數據 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 從鍵盤輸入一系列正整數,遇<=0結束; 組成先進先出隊列輸出。 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 從鍵盤輸入一系列正整數,遇<0結束; 利用鏈表進行插入排序 (從小到大).,p-data=x; /* 建立節(jié)點*/ p-next=v; /* 連后指針 */ if (v==head) head=p; else u-next=p; /*連前指針*/ scanf(%d, ,11.8 共用體 構造數據類型,也叫聯合體 用途:使幾個不同類型的變量共占一段內存(相互覆蓋) 1. 共用體 21、類型定義 定義形式:,union 共用體名 類型標識符 成員名; 類型標識符 成員名; . ;,例 union data int i; char ch; float f; ;,類型定義不分配內存,形式一: 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、. 共用體變量的定義,共用體變量定義分配內存, 長度=最長成員所占字節(jié)數,共用體變量任何時刻 只有一個成員存在,3. 共用體變量引用 引用方式:,例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); (編譯通過,運行結果不對),引用規(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 將一個整數按字節(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. 結構體與共用體 區(qū)別: 存儲方式不同,聯系: 兩者可相互嵌套,例 11.8 結構體中嵌套共用體 (p289 例11.12 ),struct int num; char name10; char sex; char job; union int class; char position10; category; person2;,例11.9 共用體中嵌套結構體,機器字數據與字節(jié)數據的處理,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定義類型 功能:為已有數據類型定義一個類型名。 類型定義簡單形式: typedef type name;,例 typedef int INTEGER;,類型定義語句關鍵字,已有數據類型名,用戶定義的類型名,例 typedef float REAL;,類型定義后,與已有類型一樣使用,例 INTEGER a,b,c; REAL f1 27、,f2;,typedef定義類型的方法: 按定義變量方法先寫出定義體 如 int i; 將變量名換成新類型名 如 int INTEGER; 最前面加typedef 如 typedef int INTEGER; 用新類型名定義變量 如 INTEGER i,j;,例 定義數組類型 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: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑施工重大危險源安全管理制度
- 安全培訓資料:典型建筑火災的防治基本原則與救援技術
- 企業(yè)雙重預防體系應知應會知識問答
- 8 各種煤礦安全考試試題
- 9 危險化學品經營單位安全生產管理人員模擬考試題庫試卷附答案
- 加壓過濾機司機技術操作規(guī)程
- 樹脂砂混砂工藝知識總結
- XXXXX現場安全應急處置預案
- 某公司消防安全檢查制度總結
- 1 煤礦安全檢查工(中級)職業(yè)技能理論知識考核試題含答案
- 4.燃氣安全生產企業(yè)主要負責人模擬考試題庫試卷含答案
- 工段(班組)級安全檢查表
- D 氯化工藝作業(yè)模擬考試題庫試卷含答案-4
- 建筑起重司索信號工安全操作要點
- 實驗室計量常見的30個問問答題含解析