浙江大學(xué)C顏暉原版C9_第1頁
浙江大學(xué)C顏暉原版C9_第2頁
浙江大學(xué)C顏暉原版C9_第3頁
浙江大學(xué)C顏暉原版C9_第4頁
浙江大學(xué)C顏暉原版C9_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第九章 結(jié)構(gòu)v結(jié)構(gòu)v結(jié)構(gòu)數(shù)組v結(jié)構(gòu)指針v鏈表v位運(yùn)算v自定義類型學(xué)號(hào)姓名性別出生地出生年出生月出生日數(shù)學(xué)物理 程序設(shè)計(jì)學(xué)號(hào)姓名性別出生地年 月 日 數(shù)學(xué) 物理 程序設(shè)計(jì)出生日期國家 省 市/縣學(xué)習(xí)成績結(jié)構(gòu):同一個(gè)數(shù)據(jù)項(xiàng)的若干成分構(gòu)成的一個(gè)整體。例如:學(xué)生檔案,每個(gè)學(xué)生有學(xué)號(hào)、姓名、性別、出生地、出生年月、學(xué)業(yè)成績等。9.1 結(jié)構(gòu)9.1.1 結(jié)構(gòu)的定義struct student long int num; char name20; float score; ;定義一個(gè)結(jié)構(gòu)類型: struct student9.1.2 結(jié)構(gòu)變量的定義1、先定義結(jié)構(gòu)類型,再定義變量struct student l

2、ong int num; char name20; float score; ;struct student stu1, stu2; num namescorestu1200011Zhang85stu2200012Li942、定義結(jié)構(gòu)類型的同時(shí)定義變量struct student long int num; char name20; float score; stu1, stu2;3、不指定類型名,只定義變量struct long int num; char name20; float score; stu1, stu2;9.1.3 結(jié)構(gòu)變量的初始化只有全局變量或靜態(tài)變量才能初始化。stati

3、c struct student stu2=200012, “Li”, 94; num namescorestu2200012Li94 num namescorestu1200011Zhang85struct student long num; char name20; float score; stu1=200011, Zhang, 85;9.1.4 結(jié)構(gòu)變量的使用1、結(jié)構(gòu)類型變量的整體引用(1) 不能整體輸入輸出,但相同類型的變量可以互相賦值 printf(%ld%s%f, stu1); 非法 stu2=stu1; 合法(2) 可以引用結(jié)構(gòu)體變量的地址 printf(%x, &st

4、u1); 輸出stu1的首地址2、結(jié)構(gòu)變量中分量的引用struct student long int num; char name20; float score; stu1, stu2;(1) 結(jié)構(gòu)變量.分量 stu1.num = 9901; printf(%s, ); num namescorestu1200011Zhang85stu2200012Li94(2) 結(jié)構(gòu)變量中的分量可以依據(jù)它的類型進(jìn)行各種運(yùn)算x = stu1.score;strcpy(, “Wang”);(3) 可以引用結(jié)構(gòu)變量中的分量的地址 scanf(%ld, &stu1.num

5、);9.2 結(jié)構(gòu)數(shù)組一個(gè)結(jié)構(gòu)變量只能存放一個(gè)學(xué)生的資料。若班上有20個(gè)學(xué)生,需要用結(jié)構(gòu)數(shù)組。即,數(shù)組中的每個(gè)元素都是結(jié)構(gòu)類型。9.2.1 定義 struct student long int num; char name20; float score; stu20;stu0200011Zhang 85stu19200012Li90200029Zhao70stu19.2.2 初始化 struct student long int num; char name20; float score; stu20=200011,”Zhang”,85, 200012,”Li”,90;stu0200011Zha

6、ng 85stu19200012Li90200029Zhao70stu19.2.3 引用 struct student long int num; char name20; float score; stu20;stu0.scorestu0200011Zhang 85stu19200012Li90200029Zhao70stu1程序舉例例1、輸入某班30位學(xué)生的姓名及數(shù)學(xué)、英語成績,計(jì)算并輸出每位學(xué)生的平均分。struct student char name10; int math, eng; float aver; ;void main( ) struct

7、student s30; int i; for(i=0; i30; i+) scanf(%s%d%d, , &si.math, &si.eng); si.aver = (si.math+si.eng)/2.0 printf(%s%f, , si.aver); s0s29s1Zhang8085Li7790wang6078輸入某班30位學(xué)生的姓名及數(shù)學(xué)、英語成績,計(jì)算并輸出每門課程的平均分。void main( ) struct student s30; int i; float aver_m=0, aver_e=0;例2 for(i=0; i30; i

8、+) scanf(%s%d%d, , &si.math, &si.eng); aver_m += si.math; aver_e += si.eng; printf(%f%f, aver_m/30, aver_e/30); 輸入30位學(xué)生的姓名及數(shù)學(xué)、英語成績,輸出平均分最高的學(xué)生的姓名及其數(shù)學(xué)和英語成績。struct student char name10; int math, eng; float aver; ;例3void main( ) struct student s30; int i, sub; for(i=0; i30; i+) scanf(%s%d

9、%d, , &si.math, &si.eng); si.aver = (si.math+si.eng)/2.0 sub=0; for( i=1; i ssub.aver ) sub = k; printf(%s%d%dn, , ssub.math, ssub.eng);9.3 結(jié)構(gòu)指針9.3.1 定義struct student long int num; char name20; float score; ;struct student stu1, *ptr;ptr = &stu1; num namescorestu1200011Zh

10、ang85ptr9.3.2 結(jié)構(gòu)指針的使用struct student stu1, *ptr = &stu1;stu1.num=200011; stu1.score=85; strcpy(,”Zhang”);通過指針 ptr 訪問結(jié)構(gòu)分量(1) *ptr (*ptr).num = 200011; (*ptr).score = 85; strcpy(*ptr).name,”Zhang”); num namescorestu1200011Zhang85ptr(2) - (*ptr).num = 200011; ptr-num = 200011; ptr-score = 8

11、5; strcpy(ptr-name,”Zhang”);當(dāng)ptr = &stu1時(shí)stu1.num(*ptr).numptr-num 三者等價(jià) num namescorestu1200011Zhang85ptrptr-num + 等價(jià)于 (ptr-num) + ptr-num 等價(jià)于 + (ptr-num)(+ ptr)-num num namescorestu1200011Zhang85ptr9.4 鏈表9.4.1結(jié)構(gòu)的嵌套定義struct day int y; int m; int d;年 月 日成績出生日期姓名學(xué)號(hào)struct student long int num; char

12、 name20; struct day birthday; float score; ymdscorebirthdaynamenumstruct day int y; int m; int d;struct student long int num; char name20; struct day birthday; float score; stu1, stu2;ymdscorebirthdaynamenum或:struct student long int num; char name20; struct int y, m, d; birthday; float score; stu1,

13、stu2;struct student long int num; char name20; struct int y, m, d; birthday; float score; stu1=9901, “Zhao”, 1980, 10,30, 80, stu2;stu2.birthday.y=1979;stu2.birthday.y=1;stu2.birthday.y=20;ymdscorebirthdaynamenum9.4.2 單向鏈表struct student long int num; float score; struct student *next;結(jié)構(gòu)的遞歸定義head9901

14、 809902 909903 75 NULL1、動(dòng)態(tài)內(nèi)存分配函數(shù)(1) void *malloc(unsigned size)功能:在內(nèi)存的動(dòng)態(tài)存貯區(qū)中分配一塊長度為size的連續(xù)空間。返回值:指針,存放被分配內(nèi)存的起始地址。若未申請(qǐng)到空間,則返回 NULL( 0 )。 void *:指向任何類型的數(shù)據(jù),在使用時(shí),要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。例如:(int *) malloc(sizeof(int)(struct student *) malloc(sizeof(struct student)(2) void free(void *ptr)功能:釋放由malloc()申請(qǐng)的動(dòng)態(tài)內(nèi)存空間,ptr存放該空

15、間的首地址。返回值:無。p=(struct student *) malloc(sizeof(struct student);free(p);2、建立鏈表編寫一個(gè)函數(shù),要求用單向鏈表建立學(xué)生檔案,從鍵盤輸入數(shù)據(jù),如果學(xué)號(hào)為0,輸入結(jié)束,并返回鏈表的頭指針。struct student long int num; float score; struct student *next;;struct student *head, *tail, *p;head=tail=NULL;struct student *head, *tail, *p;head=tail=NULL;size=sizeof(st

16、ruct student);p = (struct student *) malloc(size);pnum scorenextheadtailptailhead=tail=NULL;input num, scorewhile num!=0 p= (struct student *) malloc(sizeof(size) p-num=num, p-score=score, p-next=NULL y head=NULL n head=p tail-next=p tail=p input num, score # include stdio.hstruct student int num;fl

17、oat score;struct student *next;struct student *creat( );main( )struct student *head;head = creat( );struct student *creat() struct student *head, *tail, *p; float score; int num, size = sizeof(struct student); head = tail = NULL; scanf(%d %f, &num, &score); while (num) p = (struct student *)

18、malloc(size); p-num = num; p-score = score; p-next = NULL; if(head = NULL) head = p; else tail-next = p; tail = p; scanf(%d %f, &num, &score); return head; 3、遍歷鏈表ptr-numptr-scorehead9901 809902 909903 75 NULLptrptrfor(ptr=head; ptr!=NULL; ptr=ptr-next) printf(“%ld, %f”, ptr-num, ptr-score);p

19、tr=ptr-next# include stdio.hstruct student int num;float score;struct student *next;struct student *creat( );void print(struct student *head)main( ) struct student *head;head = creat();print(head);void print(struct student *head) struct student *ptr; if(head = NULL) printf(n No listn); return; printf(n listn); for (ptr = head; ptr; ptr = ptr-next) printf( %d %fn, ptr-num, ptr-score);4、對(duì)鏈表的刪除操作ptr2=ptr1-nextptr1-next=ptr2-nextheadptr1ptr2headptr1free(ptr2)ptr2=ptr1-nextptr24、對(duì)鏈表的插入操作s-next = ptr-nextptr-next = s先連后斷headptrs9.5 位運(yùn)算9.5.1 位運(yùn)算符1、位邏輯運(yùn)算符 按位取反(與!同級(jí)) 單目右結(jié)合& 按位與 按位異或

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論