用戶自定義數(shù)據(jù)類型.ppt_第1頁(yè)
用戶自定義數(shù)據(jù)類型.ppt_第2頁(yè)
用戶自定義數(shù)據(jù)類型.ppt_第3頁(yè)
用戶自定義數(shù)據(jù)類型.ppt_第4頁(yè)
用戶自定義數(shù)據(jù)類型.ppt_第5頁(yè)
已閱讀5頁(yè),還剩55頁(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、第九章 用戶自定義數(shù)據(jù)類型,第九章 用戶自定義數(shù)據(jù)類型 一、結(jié)構(gòu)體的概念及使用 二、結(jié)構(gòu)體數(shù)組 三、結(jié)構(gòu)體指針 四、鏈表的概念及基本操作 五、共用體的概念及使用 六、9.6 枚舉類型 七、 9.7 用typedef定義類型,系統(tǒng)給定的數(shù)據(jù)類型,在基本類型基礎(chǔ)上自己定義的,C語(yǔ)言的數(shù)據(jù)類型,考慮一個(gè)學(xué)生的基本信息包括: 學(xué)號(hào)、姓名、性別、年齡、成績(jī)、住址等。 這對(duì)一名學(xué)生來(lái)說(shuō)是一個(gè)整體,可以反映出學(xué)生的基本情況,如果用單個(gè)變量分別表示這幾項(xiàng),例如: sum:學(xué)號(hào) name10 :姓名 sex:性別 age: 年齡 score: 成績(jī) addr30:住址 不能體現(xiàn)出它們之間的內(nèi)在聯(lián)系。 所以,希望

2、有一種變量,來(lái)表示所有這些數(shù)據(jù),也就是,把這些基本變量,作為一個(gè)整體構(gòu)成一個(gè)新的變量,這種變量就是我們要介紹的結(jié)構(gòu)體變量。,9.1 結(jié)構(gòu)體,結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型 用途:把不同類型的數(shù)據(jù)組合成一個(gè)整體-自定義數(shù)據(jù)類型 結(jié)構(gòu)體類型定義,struct 結(jié)構(gòu)體名 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . ;,成員類型可以是 基本型或構(gòu)造型,struct是關(guān)鍵字, 不能省略,合法標(biāo)識(shí)符 可省:無(wú)名結(jié)構(gòu)體,分號(hào)不能省略,例 struct student int num; char name20; char sex; int age; float score; char addr30; ;,結(jié)構(gòu)體

3、類型定義描述結(jié)構(gòu) 的組織形式,不分配內(nèi)存,例如:要想把學(xué)生基本情況作為一個(gè)整體加以處理,比如:學(xué)號(hào)、姓名、性別、年齡、成績(jī)、住址等。 必須定義結(jié)構(gòu)體類型,例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2;,1、先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量 一般形式:,struct 結(jié)構(gòu)體名 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . ; struct 結(jié)構(gòu)體名 變量名表列;,定義結(jié)構(gòu)體變 量之后為其分 配內(nèi)存單元,結(jié)構(gòu)體變量的定義

4、,2、定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量 一般形式:,struct 結(jié)構(gòu)體名 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . 變量名表列;,例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,3、直接定義結(jié)構(gòu)體變量 一般形式:,struct 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . 變量名表列;,例 struct int num; char name20; char sex; int age; float score; char addr30; stu

5、1,stu2;,用無(wú)名結(jié)構(gòu)體直接定義 變量只能一次,說(shuō)明 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量概念不同 類型:不分配內(nèi)存; 變量:分配內(nèi)存 結(jié)構(gòu)體類型是一個(gè)模型,類似系統(tǒng)給定的基本類型比如int、 float 等類型,只是結(jié)構(gòu)體類型是用戶自定義的而已。 結(jié)構(gòu)體可嵌套 結(jié)構(gòu)體成員名與程序中變量名可相同,不會(huì)混淆,引用規(guī)則 結(jié)構(gòu)體變量不能整體引用,只能引用變量成員,成員(分量)運(yùn)算符 優(yōu)先級(jí): 1 結(jié)合性:從左向右,引用方式: 結(jié)構(gòu)體變量名.成員名,結(jié)構(gòu)體變量的引用,可以將一個(gè)結(jié)構(gòu)體變量賦值給另一個(gè)結(jié)構(gòu)體變量 結(jié)構(gòu)體嵌套時(shí)逐級(jí)引用,結(jié)構(gòu)體變量的引用,形式一:,例 struct student int num;

6、char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,結(jié)構(gòu)體變量的初始化,struct 結(jié)構(gòu)體名 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . ; struct 結(jié)構(gòu)體名 結(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”

7、;,struct 結(jié)構(gòu)體名 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . 結(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”;,struct 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . 結(jié)構(gòu)體變量=初始數(shù)據(jù);,結(jié)構(gòu)體數(shù)組的定義 三種形式:,形式一: struct student int num; char name20; char sex; int age; ; struct student

8、stu30;,形式二: struct student int num; char name20; char sex; int age; stu30;,形式三: struct int num; char name20; char sex; int age; stu30;,9.2 結(jié)構(gòu)體數(shù)組,例 統(tǒng)計(jì)候選人選票,#include struct person char name20; int count; leader3=“Li”,0,“Zhang”,0,”Wang“,0; main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,l

9、eader_name); for(j=0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn,,leaderi.count); ,結(jié)構(gòu)體數(shù)組初始化,順序初始化: 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;,例

10、struct student int num; char name20; char sex; int age; stu =,;,結(jié)構(gòu)體數(shù)組引用,引用方式: 結(jié)構(gòu)體數(shù)組名下標(biāo).成員名,S=“ZhaoDa” ,指向結(jié)構(gòu)體變量的指針 定義形式:struct 結(jié)構(gòu)體名 *結(jié)構(gòu)體指針名; 例 struct student *p;,存放結(jié)構(gòu)體變量在內(nèi)存的起始地址,9.3 結(jié)構(gòu)體指針,使用結(jié)構(gòu)體指針變量引用成員形式,指向運(yùn)算符 優(yōu)先級(jí): 1 結(jié)合方向:從左向右,#include main() struct student long int num; char name20; char sex

11、; float score; stu_1,*p; p= ,例 int n; int *p= n=10,struct student stu1; struct student *p= (*p).num=101,9.3 結(jié)構(gòu)體指針,指向結(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; main() struct student *p; for(p=stu;pnum,p-name,p-se

12、x,p-age); ,用指向結(jié)構(gòu)體的指針作函數(shù)參數(shù) 用結(jié)構(gòu)體變量的成員作參數(shù)-值傳遞 用指向結(jié)構(gòu)體變量或數(shù)組的指針作參數(shù)-地址傳遞 用結(jié)構(gòu)體變量作參數(shù)- 值傳遞,效率低,struct student void f(struct student stu2) . stu1=.; . main() . f(stu1); ,struct student void f(struct student *p) . stu1=.; . main() . f( ,struct student void f(long num) long num; char name10; stu1=.; . main() . f

13、(stu1.num); ,構(gòu)造數(shù)據(jù)類型,也叫聯(lián)合體 用途:使幾個(gè)不同類型的變量共占一段內(nèi)存(相互覆蓋) 共用體類型定義 定義形式:,union 共用體名 類型標(biāo)識(shí)符 成員名; 類型標(biāo)識(shí)符 成員名; . ;,例 union data int i; char ch; float f; ;,類型定義 不分配內(nèi)存,9.5 共用體,形式一: 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

14、; float f; a,b,c;,共用體變量的定義,共用體變量定義分配內(nèi)存, 長(zhǎng)度=最長(zhǎng)成員所占字節(jié)數(shù),共用體變量任何時(shí)刻 只有一個(gè)成員存在,共用體變量引用 引用方式:,引用規(guī)則 不能引用共用體變量,只能引用其成員,共用體變量中起作用的成員是最后一次存放的成員,例 union int i; char ch; float f; a; a=1; (),在定義共用體變量時(shí)只能初始化第一個(gè)成員,例 union int i; char ch; float f; a=1,a,1.5; (),可以用一個(gè)共用體變量為另一個(gè)變量賦值,例 float x; union int i; char ch; float

15、 f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; () x=a.f; (),例 將一個(gè)整數(shù)按字節(jié)輸出,運(yùn)行結(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=%c,ch1=%cn, x.ch0,x.ch1,x.ch0,x.ch1); ,結(jié)構(gòu)體與共用體 區(qū)別: 存儲(chǔ)方式不同,聯(lián)系: 兩者可相互嵌套 類比:結(jié)構(gòu)體與共用體的定義形式類似,變量定義方式類似

16、,成員引用方式類似。,例 結(jié)構(gòu)體中嵌套共用體,struct int num; char name10; char sex; char job; union int class; char position10; category; person2;,概念: 對(duì)于數(shù)組,編譯系統(tǒng)為其分配連續(xù)的一片存儲(chǔ)單元,而鏈表,通過(guò)動(dòng) 態(tài)分配內(nèi)存,實(shí)現(xiàn)鏈表中各元素(結(jié)點(diǎn))的數(shù)據(jù)存放在非連 續(xù)的單元中.,如: struct student int num; char name10; struct student *next; /* next 是指向該結(jié)構(gòu)體類型的指針變量, ; 用來(lái)存放下一個(gè)結(jié)點(diǎn)的起始地址, 實(shí)現(xiàn)

17、將各結(jié)點(diǎn)連接成鏈 */,9.4 鏈表,動(dòng)態(tài)分配內(nèi)存函數(shù): 格式1:viod *malloc(unsigned int size) 功能: 在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配長(zhǎng)度為size(單位:byte) 連續(xù)空間,返回該連續(xù)域的首地址(是無(wú)類型指針); 未成功,返回 0。,struct student int num; char name10; struct student *next; *pt; pt=(struct student *) malloc(sizeof(struct student) pt num name10 next,格式2:calloc(n, size) 功能:與 malloc(

18、size) 相同,區(qū)別是分配n個(gè)長(zhǎng)度為size 的連續(xù)空間??梢詾橐粸閿?shù)組開辟動(dòng)態(tài)存儲(chǔ)空間。,格式 :viod free(viod *p) 功能:釋放由p 指向的內(nèi)存區(qū),使這部分內(nèi)存區(qū)能被其它變 量使用。P 是最近一次調(diào)用 calloc 或 malloc 函數(shù)時(shí)返回的值。 free 無(wú)返回值。 例如 : free(p);,num score next,建立動(dòng)態(tài)鏈表 例題:寫一個(gè)函數(shù)建立一個(gè)有若干名學(xué)生數(shù)據(jù)的單向動(dòng)態(tài)鏈表, 當(dāng)學(xué)號(hào)為 0 建表結(jié)束。 設(shè)結(jié)點(diǎn)的結(jié)構(gòu)體類型如下: struct student long num ; float score ; struct student *next

19、; ;,num score next,實(shí)現(xiàn)此要求的算法如下:,head,p1,p2,null,99101 89.5,head,p2,p1,99103 78,n=1,99103 78,99103 78,head,p2,99101 89.5,p1,n=2,建立鏈表的函數(shù)可以如下: #define NULL 0 while(p1-num!=0) #define LEN sizeof(struct student) n=n+1; struct student if(n= =1)head=p1; long num; else p2-next=p1; float score; p2=p1; struct

20、student *next; p1=(struct student *)malloc(LEN); ; scanf(“%ld,%f”,可以在主函數(shù)中調(diào)用函數(shù) creat .例如: main() creat(); 輸出鏈表 例題:編寫一個(gè)輸出鏈表的函數(shù) print void print(struct student *head) 在主函數(shù)中調(diào)用 struct student *p; 方式 printf(“n Now ,These %d records are:n”,n); main() p=head; if(head!=NULL) . do print(head); printf(“%ld5.1f

21、n”,p-num , p-score); p=p-next; while (p!=NULL); ,A0,A0,A0,A linked list,Deletion from a linked list,Insertion into a linked list,對(duì)鏈表的刪除操作 例題:寫一函數(shù)以刪除動(dòng)態(tài)鏈表中指定的結(jié)點(diǎn)。函數(shù)del 如下: struct student *del(struct student *head , long num) struct student *p1,*p2; if (head= =NULL)printf(“nlist null!n”); goto end; p1=h

22、ead; while(num!=p1-num ,對(duì)鏈表的插入操作。設(shè)已有一個(gè)學(xué)生鏈表,各結(jié)點(diǎn)是按其成員項(xiàng) num (學(xué)號(hào))的值由小到大順序排序的。今要插入一個(gè)新生的結(jié)點(diǎn),要求按學(xué)號(hào)的順序插入。 插入函數(shù) insert 如下: struct student *insert(struct student *head , struct student *stud) struct student *p0 , *p1 , *p2 ; p1=head ; p0=stud ; if(head= =NULL) head=p0; p0-next=NULL; else while (p0-nump1-num) ,

23、p0,準(zhǔn)備插入的節(jié)點(diǎn),p2,p1,對(duì)鏈表的綜合操作 將以上建立、輸出、刪除、插入的函數(shù)組織在一個(gè)程序中,用函數(shù)main 作主調(diào)函數(shù)??梢詫懗鰉ain 函數(shù) (main函數(shù)的位置在以上個(gè)函數(shù)的后面) main() struct student *head , stu; long del_num; printf(“input records:n”); head=creat(); print(head); printf(“n input the deleted number:”); scanf(“%ld”, ,通用的主函數(shù)為: main() struct student *head , *stu;

24、long del_num; printf(“input records:n”); head=creat(); print(head); printf(“n input the deleted number:”); scanf(“%ld”, ,建立鏈表 變量設(shè)置: head指向結(jié)構(gòu)體類型指針變量,一般用它指向鏈表頭。 p1指向結(jié)構(gòu)體類型指針變量,指向新的結(jié)點(diǎn)首地址。 p2指向結(jié)構(gòu)體類型指針變量,指向尾結(jié)點(diǎn)的首地址。,9909,:,:,9909,:,:,9910,:,:,9911,:,:,p1 p2,p2,p1 p2,p1,head,.,定義head p1,p2,n=0,動(dòng)態(tài)分配,輸入結(jié)點(diǎn)內(nèi) 數(shù)據(jù)

25、,p2 next NULL,返回head,p1num!=0?,nn+1,動(dòng)態(tài)分配,p2 p1,head p1,p2 next p1,n=1?,輸入結(jié)點(diǎn)內(nèi)數(shù)據(jù),N,Y,N,Y,p1,n=1 n=2 n=3,#define LEN sizeof(struct student) struct student int num; float aver; struct student *next; ; int n; struct student *creat( ) /*該函數(shù)是建立鏈表的,它返回 的指針,是指向該鏈表在內(nèi)存存放首地址*/ struct student *head, *p1, *p2; n=

26、0; p1=p2=(struct student*)malloc(LEN); /*動(dòng)態(tài)分配內(nèi)存*/ scanf(“%d,%f”,1,1.5,輸出鏈表,phead,返回,輸出數(shù)據(jù),p pnext,head!=NULL?,p!=NULL?,N,Y,N,Y,pri(head) struct student *head; struct student *p; p=head; if (head != NULL) do printf(“%d %fn”,p num, p aver); p= p next; while(p != NULL); ,刪除鏈表中結(jié)點(diǎn),.,.,.,head p2,p1,.,.,n=1

27、,n=2 n=3,刪除某結(jié)點(diǎn),不是將此結(jié)點(diǎn)真正從內(nèi)存清除,而是將該節(jié)點(diǎn) 在鏈表中的聯(lián)系斷開。 如:要?jiǎng)h除第二個(gè)結(jié)點(diǎn),就把第一個(gè)結(jié) 點(diǎn)最后的指針不是指第2結(jié)點(diǎn)首地址,而指第3個(gè)結(jié)點(diǎn)首地址。 程序中要考慮以下幾種情況: 刪除第一個(gè)結(jié)點(diǎn):head head next; 刪除其它結(jié)點(diǎn):(例刪第二個(gè)結(jié)點(diǎn)) p2 next p1next;,框圖:,head!=NULL?,未找到與未結(jié)束?,找到,p1=head?,p1 head,p2 p1, p1 p1 next,返回,p2next p1 next,返回,n n-1,head p1 next,未找到,N 刪其它結(jié)點(diǎn),刪頭結(jié)點(diǎn),Y,N 是空表,Y,N,str

28、uct student *del(struct student *head, int num) struct student *p1, *p2; if (head= =NULL) printf(“l(fā)ist hull! n”); return(head); p1=head; while (num!= p1 num ,鏈表中插入結(jié)點(diǎn)操作(從小到大) 在一個(gè)有序鏈表中,插入某結(jié)點(diǎn)后,也是有序表,是空表?,插入第一個(gè)結(jié)點(diǎn)?,找插入位置?,找到?,headp0,p0 next NULL,p2p1, p1p2 next,p1 nextp0 p0 nextNULL,nn+1,headp0,p2 nextp0

29、,p0 nextp1,Y,N,Y,N,Y,N,N,Y,插到最后,非空表,空表插入 第一個(gè)結(jié)點(diǎn),p0指向要插入的結(jié)點(diǎn),程序中要考慮以下幾種情況: P0是要插入點(diǎn),p1首先指向頭結(jié)點(diǎn)。 是空表:將該結(jié)點(diǎn)插入,作為頭結(jié)點(diǎn)。 非空表:插入位置是頭結(jié)點(diǎn):headp0, p0 next p1 插入位置是非頭,非尾結(jié)點(diǎn)(p2后,p1前): p2 next p0, p0 next p1 插入位置是尾結(jié)點(diǎn): p1 next p0, p0 next NULL,struct student *insert (struct student *head, struct student *stud) struct stu

30、dent *p0, *p1, *p2; p1=head; p0=stud; if (head= =NULL) head =p0; p0 next=NULL; /*是空表*/ else while (p0 num p1 num) /*插入鏈表最后*/ ,功能:用自定義名字為已有數(shù)據(jù)類型命名 類型定義簡(jiǎn)單形式: typedef type name;,例 typedef int INTEGER;,類型定義語(yǔ)句關(guān)鍵字,已有數(shù)據(jù)類型名,用戶定義的類型名,例 typedef float REAL;,類型定義后,與已有類型一樣使用,例 INTEGER a,b,c; REAL f1,f2;,說(shuō)明: 1.typ

31、edef 沒(méi)有創(chuàng)造新數(shù)據(jù)類型 2.typedef 是定義類型,不能定義變量 3.typedef 與 define 不同,define typedef 預(yù)編譯時(shí)處理 編譯時(shí)處理 簡(jiǎn)單字符置換 為已有類型命名,9.6 用typedef定義類型,typedef定義類型步驟 按定義變量方法先寫出定義體 如 int i; 將變量名換成新類型名 如 int INTEGER; 最前面加typedef 如 typedef int INTEGER; 用新類型名定義變量 如 INTEGER i,j;,例 定義數(shù)組類型 int a100; int ARRAY100; typedef int ARRAY100; AR

32、RAY a,b,c;, int a100,b100,c100;,例 定義指針類型 char *str; char *STRING; typedef char *STRING; STRING p,s10;, char *p; char *s10;,例 定義函數(shù)指針類型 int (*p)(); int (*POWER)(); typedef int (*POWER)(); POWER p1,p2;, int (*p1)(),(*p2)();,例 定義結(jié)構(gòu)體類型 struct date int month; int day; int year; d;,例 定義結(jié)構(gòu)體類型 struct date in

33、t month; int day; int year; DATE;,例 定義結(jié)構(gòu)體類型 typedef struct date int month; int day; int year; DATE;,例 定義結(jié)構(gòu)體類型 DATE birthday, *p;, struct date int month; int day; int year; birthday, *p;,類型定義可嵌套,例 typedef struct club char name20; int size; int year; GROUP; typedef GROUP *PG; PG pclub;, GROUP *pclub; struct club *pclub;,GROUP為結(jié)構(gòu)體類型 PG為指向GROUP的指針類型,若某個(gè)變量只存在有限的幾種取值??啥x成枚舉類型; 例:enum weekday sun, mon, twe, wed, thu, fri, set; enum color red,

溫馨提示

  • 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)論