c語言第11章結構體和共同體_第1頁
c語言第11章結構體和共同體_第2頁
c語言第11章結構體和共同體_第3頁
c語言第11章結構體和共同體_第4頁
c語言第11章結構體和共同體_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 已介紹的數(shù)據(jù)類型:簡單變量、數(shù)組、指針。已介紹的數(shù)據(jù)類型:簡單變量、數(shù)組、指針。例:例:建立學生檔案每一個學生的:學號(int num) 姓名(char name20) 性別(char sex) 年齡(int age) 存在的問題:難以處理一些較復雜的數(shù)據(jù)結構。存在的問題:難以處理一些較復雜的數(shù)據(jù)結構。11.1 結構體及其類型定義結構體及其類型定義成績(float score)地址(char addr30)C程序可將上述數(shù)據(jù)的集合定義為一種結構體類型:struct student int num; char name20; char sex; int age; float score; ch

2、ar addr30;上述定義中: struct 關鍵詞(保留字), 表示定義一種結構體類型。結構體定義的一般形式: struct 結構體名 成員表列; 成員表列:類型標識符 成員名 以上僅說明了定義一種類型的方法,尚未定義變量。strudent 結構體名如:如:struct exp int times; char flag; float meter; 結構體名成員表列11.2 定義結構體變量定義結構體變量一、先定義結構體類型再定義結構體變量一、先定義結構體類型再定義結構體變量三種方法可用來定義結構體變量:struct student x1, x2; 則 x1, x2為student 結構型變量

3、,x1, x2可存放student類型數(shù)據(jù)。例: struct student int num; char name20; char sex; int age; float score; char addr30;類型標識符例:struct student int num; char name20; char sex; int age; char addr30; x1, x2;定義形式 struct 結構體名成員表列 變量名表列;二、二、 在定義結構體類型的同時定義變量在定義結構體類型的同時定義變量:定義形式 struct 成員表列 變量名表列;不出現(xiàn)結構體類型名三、直接定義結構類型變量三、直接

4、定義結構類型變量如:stract int num char name20; char sex; int age; char addr30; x1, x2; 1. 類型名與變量名是不同的概念 2. 允許成員名又為另一個已定義的結構型變量 3. 每一個成員地位如同該類型的變量 4. 成員名與程序中的變量名可相同但意義不同幾點說明幾點說明: :一個嵌套定義的例子:struct date int month;int day;int year;struct studentint num;char name20; char sex;int age;struct date birthday;char add

5、r30; x1, x2; x1或x2num name sex agebirthdaymonth dayyearaddr11.3 結構體類型變量的引用結構體類型變量的引用 如:x1為student型變量,則 x1.num: 表示x1的學號 : 表示x1的名字 x1.birthday.day: 表示x1的出生日 1. 只能用成員,不可用結構體變量名直接運算2. 每一個分量的引用與其同類型的簡單變量的引用相同。引用結構體變量實質上為引用其成員引用結構體變量實質上為引用其成員用分量運算符用分量運算符.優(yōu)先級最高優(yōu)先級最高例如: 關于結構成員的操作的flash演示 struct stude

6、nt x1=8906, Li Ming , M, 25, 8, 3, 1928, Yu Lushan 123 與其它變量的初始化完全一樣,結構體變量在定義時可初始化:11.4 結構體變量的初始化結構體變量的初始化1. 結構體變不是一個簡單變量,它的值是由許多個基本數(shù)據(jù)組成。2. 在內存中占有一段連續(xù)的存儲單元3. 占有的連續(xù)存儲單元大小取決于成員的數(shù)據(jù)類型如:如:struct exp int a; float b; char yn8; struct exp x=1234,56.7, text 若 x 的起始地址為2000, 則 x 在內存中占有的存儲單元為:共用14個字節(jié)的連續(xù)單元123456

7、.7test0ab2000200220062013yn84. 結構體定義和變量定義及初始化可二合為一: struct exp int a; float b; char yn8; x=1234, 56. 7, test; 但不能這樣寫:但不能這樣寫: struct exp int a=1234; float b=56.7; char yn8=test; x;5. 要注意結構體變量的輸入/輸出.若有truct student h;則:scanf(%s, &h);printf(%s, h);錯誤原因:原因:結構體變量中包含有多個不同類型的數(shù)據(jù)項。正確方法正確方法:對結構體變量各成員的值進行輸

8、入/輸出。如:如:scanf(%d%s, &h.num, );printf(%d%s, h.num, );11.5 結構體數(shù)組結構體數(shù)組數(shù)組元素的類型可以是結構。同結構體變量定義類似: struct student w3; w0.num: 表示w0的學號 : 表示w1的姓名對w數(shù)組也可初始化: struct student w3=8901, Li Ming , , , ;則有三個元素w0, w1, w2. 每一個元素為一個結構student型變量。結構體類型標識符結構成員類型也可以是數(shù)組。例如: struct month int number_of

9、_days; char name3;假設我們已經說明過結構變量 a_month, 然后建立結構a_month 如下圖所示: 可省略大小說明,直接用賦初值確定其大小 struct student w =, ,;struct person char name20; int count; leader3=Li, 0,Zhang , 0, Hang , 0;例:有三個侯選人,每一侯選人的數(shù)據(jù)包括其姓名和得票數(shù),則可定義結構類型person和結構數(shù)組leader程序如下: /*exp14_1.c*/struct person char name20; int count; leader3=Li, 0,Z

10、hang , 0, Hang , 0;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+; printf (n); for (i=0; i3; i+) printf(%5s : %dn, , leaderi.count); Li Li Hang Zhang Zhang Hang Li Hang Zhang

11、Li 輸入:輸入:運行情況如下:運行情況如下: count name LiZhangHang 0 0 0 Li : 4 Zhang : 3 Hang : 3顯示: 結構指針:結構指針:指向結構型變量的起始地址指向結構型變量的起始地址.11.6 結構指針結構指針 例例:struct student char name 10; char sex; int age; float score; char addr20; x1;一、結構指針變量一、結構指針變量則p為結構指針變量,它可用來存放student型變量的地址numnameaddrpx1令p=&x1;則 p為x1的首地址.struct s

12、tudent p; (p).name (p).score 或者用“ ”運算符, p num, pname, p score. 稱為指向運算符, “ ”優(yōu)先級高于+, 。則:p num+1(x1.num)+ +pnum +(x1.num)先使用x1.num, 再加1先使x1.num加1,再用x1.num訪問x1的成員: 小結:小結: 引用結構變量中的成員有三種方法:(2) 用指針變量 (p).成員名 (p).num(3) 用指向運算符成員名 p num(1) 結構體變量名.成員名 x1.num注意注意:指針變量p必須是結構指針型,且有p=&x1;例:例:請指出下列程序的錯誤所在: str

13、uct person char name20; int count; x1=ZhongHua, 10; main( ) int *p;p=&x1;printf (%sn%dn, (*p).name, (*p).count)錯誤的原因:p不是結構指針變量可改為:struct persan *p例例:struct student int num;char name20;char sex;int age; 與其他指向結構體數(shù)組的指針一樣,可用指針指向結構體數(shù)組。二、指向結構體數(shù)組的指針二、指向結構體數(shù)組的指針 main ( ) struct student stu3=10101, Li Li

14、n , M, , , ; struct student p; p=stu; while (pstu+3) printf( , pnum, p name, p sex, p age);內存結構如下:內存結構如下:注:注: p+1為指向下一個元素的首地址。stu0 p+1 p+2(p) 用地址傳送,函數(shù)中形參用指針變量,實參可用 地址量或指針三、用指向結構體的指針作函數(shù)參數(shù)三、用指向結構體的指針作函數(shù)參數(shù)例例/*-exp14_3.c-*/#include struct person char name20;int count; x3=zhao, 4, qian, 3, sun, 6; void p

15、rt(struct person *pp); main( ) int i; for (i=0; iname, pp-count); 運行結果:zhao, 4qian, 3sun, 611.7 鏈表鏈表 解決了內存分配零亂的問題 解決了數(shù)組存放數(shù)據(jù)的弊端 是用指針變量將非連續(xù)的數(shù)據(jù)塊連成一 個整體的一種數(shù)據(jù)結構。一種動態(tài)分配的數(shù)據(jù)結構。1. 什么是鏈表?什么是鏈表?例如:HeadHead: 稱為表頭,僅存放一個地址,無數(shù)據(jù)。數(shù)據(jù)DNull數(shù)據(jù)C數(shù)據(jù)B數(shù)據(jù)A數(shù)據(jù)指針: 為數(shù)據(jù)塊,又稱為鏈表的結點,由兩部分 組成,數(shù)據(jù)和指針。數(shù)據(jù):該結點的具體數(shù)據(jù)指針:下一個結點的地址實現(xiàn)方法:實現(xiàn)方法:2. 用指

16、向該種類型的結構指針作為表頭;3. 每一個結點中包含同種類型的指針變量用以存放下一個結點的地址。1. 用結構型變量表示每一個結點; 內存分配函數(shù),在動態(tài)區(qū)中分配一個長度為 size的連續(xù)空間,分配成功,返回一個指向該空間首地址的指針,未成功,返回值0.實現(xiàn)過程中用到的三個函數(shù)(由系統(tǒng)提供) malloc(size) ptr為指針變量,該函數(shù)釋放最近一次調用malloc或calloc分配且由ptr指向的內存空間。原C標準:malloc返回一個指向char型數(shù)據(jù)的指針。新的C標準:為void 類型,可通過強制類型轉換。 free(ptr) struct student long num;float

17、 score;struct student next;同時定義三個指向這種類型的指針變量head, p1, p2.例例: : 寫一個函數(shù),建立5名學生數(shù)據(jù)的單向鏈表,每一個學生的數(shù)據(jù)塊(結點)定義如下:2. 建立鏈表建立鏈表一開始headnull約定:當輸入學號=0時,結束,返回表頭#define NULL 0#define LEN sizeof(struct student)struct student long num;float score;struet student next;int n;p1: 新分配的結點地址p2: 已分配的最后一個結點地址 struct student crea

18、t( ) struct student head, p1, p2;n=0;p1=p2=(struct student ) malloc(LEN);scanf(%d, %f, &p1num, &p1score);head=NULL;while (p1num!=0) n+ +; if(n= =1) head=p1; else p2next = p1; p2=p1; p1=(struct student ) malloc(LEN); scanf(%ld, %f, &p1num, &p2score); p2next=NULL;return(head); void pri

19、nt (head)struet student head; struet student p;p=head;if (p=NULL) return; do printf(%ld %5.1f n, pnum, pscore);該問題比較容易解決。 p=pnext; while (p!=NULL); 3. 輸出鏈表輸出鏈表當你已經定義過結構之后, 你就可以說明一些變量, 然后生成一個鏈接表, 請看: 我們先定義四個變量:struct entry n1,n2,n3,n4; 一般給出某一條件,當某一條件成立時,則刪除該結點: 當?shù)谝粋€結點被刪除時,修改表頭 當最后一個結點不滿足條件時,返回。struct

20、 student del(head, num)struct student head; long num; struct student p1, p2; 表為空時,無任何刪除4. 刪除一個結點刪除一個結點 if (head= =NULL) printf(n list null!=n); return (head);p1=head;while (num!=p1num &p1next!=NULL) p2=p1; p1=p1next;if (num= =p1num)if (p1= =head) head=p1next; else p2next=p1next;printf (delete: %

21、ld n, num);n ; else printf (%ld not been found!n, num); return; 一般情況:鏈表中結點的關鍵數(shù)據(jù)已排好序,待插入結點的關鍵數(shù)據(jù)與鏈表中的關鍵數(shù)據(jù)一一比較,插入適當?shù)奈恢谩?方法:設鏈表中按num已排序好struct studetn insert (head, stud)struct student head, stud; struct student p0, p1, p2; p1=head;5. 對鏈表的插入操作對鏈表的插入操作 p0=stud; if (head= =NULL) head=p0; p0next=NULL;else

22、while(p0nump1num)&(p1next!=NULL) p2=p1; p1=p1next;if (p0numnum, &stuscore);while (stunum!=0) head=insert(head, stu); print (input the inserted record: ); stu=(struct student * ) malloc(LEN);scanf(%ld, %f ,&stunum, &stuscore); 運行情況如下:運行情況如下:input records:98101, 99 89103, 87 89105, 77

23、0, 0 Now, These 3 records are.89101 99.089103 87.089105 77.0 input the deleted number: 98103 delete: 89103Now, These 2 records are.89101 99.089105 77.0 input the deleted number: 98105 delete: 89105Now, These 1 records are.89101 99.0input the deleted number: 0 input the inserted record: 89104, 87 Now

24、, These 2 records are.89101 99.089104 87.0input the inserted record: 89106, 65 Now, These 3 records are.89101 99.089104 87.089106 65.0input the inserted record: 0, 011.8 共用體類型數(shù)據(jù)共用體類型數(shù)據(jù)一、共用體數(shù)據(jù)類型的特點一、共用體數(shù)據(jù)類型的特點 與結構體類似之處:由不同的數(shù)據(jù)項組成一個整體。 與結構體不同之處:占用的內存單元不同。二、共用體類型定義二、共用體類型定義定義方式與結構體類型完全相同。把結構體類型中的關鍵字stru

25、ct換成union即可。例例:struct memb float v;int n;char c; stag; stag占內存7個字節(jié)的空間union memb float v;int n;char c; ustag; utag占的內存空間為100110051007vnc2001vnc200220032004 共用體類型變量每次只能存放一個成員的值。三、共用體類型變量的引用三、共用體類型變量的引用引用方法同結構體變量:(共用體類型變量名).共用體類型變量的輸入輸出同結構體類型變量相同。例例:#includeunion memb float v;int n;char c;main( ) union

26、 memb utag; utag.v=36.7 utag.c=T utag.n=18 printf(%5.1fn%dn%cn, utag.v, utag.n, utag.c); 運行結果運行結果:36.7 13107想一想:想一想:若改變成員的賦值順序: utag.v=36.7 utag.c=T utag.n=18則運行結果為則運行結果為:36.5 84 T構造類型(數(shù)組,結構體,共用體)的定義可以嵌套。 struct priv int n; float f; char c;union publ int ns;float fs;struct priv mud; spe5; spe為共用體類型數(shù)組,每個數(shù)組元素所占用的內存單元為:2001mudfsns20022003200420052006200711.9 枚舉類型枚舉類型一、含義和形式:將變量的值一一列舉,變量的值只限定于該范圍;定義形式:enum 枚舉類型名 值列表例如:enum weekday sun,mon,tue,wed,thu,fri,sat;weekday wk;wk 被定義為枚舉變量,它的值只能是sun 到sat之一 說明:1、在c編譯中,對枚舉元素按常量處理,故稱枚舉常量。它們不是變量,不能對它們賦值。例如: Sun=0;mon=1; 是錯誤的。2、枚舉元素作為常量,它們是有值的,C

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論