版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第10章 結(jié)構(gòu)體本章內(nèi)容結(jié)構(gòu)體類型的定義結(jié)構(gòu)體變量的定義結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體與指針鏈表的概念及操作2引例輸入10位同學(xué)的一組信息,包括學(xué)號、姓名、性別、數(shù)學(xué)成績、計算機成績,求得每位同學(xué)的平均分和總分,然后按照總分從高到低排序。3結(jié)構(gòu)體類型與變量的概念 結(jié)構(gòu)體類型把關(guān)系緊密且邏輯相關(guān)的多種不同類型的數(shù)據(jù)組織到統(tǒng)一的名字之下,這樣的集合稱為結(jié)構(gòu)體類型。結(jié)構(gòu)體變量結(jié)構(gòu)體類型的變量占用相鄰的一段內(nèi)存單元45一般形式:一般形式:struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 類型關(guān)鍵字類型關(guān)鍵字 成員名成員名1 1; 類型關(guān)鍵字類型關(guān)鍵字 成員名成員名2 2; . 類型關(guān)鍵字類型關(guān)鍵字 成員名成員名n n; ;,
2、元素元素域域6_先定義結(jié)構(gòu)體類型再定義變量名先定義結(jié)構(gòu)體類型再定義變量名_在定義類型的同時定義變量在定義類型的同時定義變量_直接定義結(jié)構(gòu)體變量(不出現(xiàn)結(jié)構(gòu)體類型名)直接定義結(jié)構(gòu)體變量(不出現(xiàn)結(jié)構(gòu)體類型名)struct student student1,student2;student 用戶自定義類型名關(guān)鍵字關(guān)鍵字typedef 概念:關(guān)鍵字typedef用來為已經(jīng)定義的數(shù)據(jù)類型定義一個別名。舉例: typedef struct student STUD; STUD student1,student2; STUD與 struct student類型是同義詞7結(jié)構(gòu)體變量的內(nèi)存占用按照域表中域的先后
3、順序依次在內(nèi)存中劃分存儲單元給每個域。直接用結(jié)構(gòu)體的每個成員類型所占內(nèi)存字節(jié)數(shù)的和作為一個結(jié)構(gòu)體實際所占的內(nèi)存字節(jié)數(shù)是不正確的。事實事實上,所有數(shù)據(jù)類型在內(nèi)存中都是從偶數(shù)地址開始存放的,且結(jié)構(gòu)上,所有數(shù)據(jù)類型在內(nèi)存中都是從偶數(shù)地址開始存放的,且結(jié)構(gòu)所占的實際空間一般是按照機器字長對齊的所占的實際空間一般是按照機器字長對齊的 .不同的編譯器、平臺,對齊方式會有變化不同的編譯器、平臺,對齊方式會有變化我們用sizeof函數(shù)獲得結(jié)構(gòu)體變量所占的字節(jié)數(shù)。 即用即用 sizeof(struct student) 進行計算進行計算8結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用 一般形式:一般形式: 結(jié)構(gòu)體變量名結(jié)構(gòu)體
4、變量名 . 成成員名員名 結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化 舉例:舉例:struct student st1= 101,zhangsan,M,85,69; struct student int num; char name20; char sex; float shx; float jsj; float aver; float sum;9舉例:以下結(jié)構(gòu)體變量的引用哪個是正確的?struct s int x; int y; vs ;A) s . x = 10 ; B) s . vs . x = 10;C) struct va; D) struct s va = 10; va . x = 10
5、;10結(jié)構(gòu)體變量的輸入與輸出結(jié)構(gòu)體變量的輸入與輸出C語言規(guī)定,不能將一個結(jié)構(gòu)體變量作為一語言規(guī)定,不能將一個結(jié)構(gòu)體變量作為一個整體實施輸入、輸出的操作,只能對每個整體實施輸入、輸出的操作,只能對每個具體的成員進行輸入、輸出操作。個具體的成員進行輸入、輸出操作。舉例:struct student st1= 101,zhangsan,M,85,69;11結(jié)構(gòu)體類型的嵌套結(jié)構(gòu)體類型的嵌套如: struct date int month; int day; int year; ;struct stud char name20; int num; char sex; struct date birthd
6、ay; float shx; float jsj; float aver; float sum;12結(jié)構(gòu)體類型中的成員也可以是結(jié)構(gòu)體。結(jié)構(gòu)體類型中的成員也可以是結(jié)構(gòu)體。舉例struct workersint no; char name20; char sex; struct int day; int month; int year; birth; w;若w中的生日為1963年10月25日,如何編寫相應(yīng)的語句?13w.birth.day=25;w.birth.month=10;w.birth.year=1963;結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組概念:由若干相同結(jié)構(gòu)體類型的數(shù)據(jù)組成的概念:由若干相同結(jié)構(gòu)體類型
7、的數(shù)據(jù)組成的有序集合,叫做結(jié)構(gòu)體數(shù)組。有序集合,叫做結(jié)構(gòu)體數(shù)組。定義形式:同基本數(shù)據(jù)類型的數(shù)組定義方法定義形式:同基本數(shù)據(jù)類型的數(shù)組定義方法 struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 結(jié)構(gòu)體數(shù)組名結(jié)構(gòu)體數(shù)組名元素元素個數(shù)個數(shù);14舉例struct person char name9; int age; ;struct person class10= John,19,Paul,17,Mary,18,Adam,16;能打印出字母A的語句應(yīng)為:15Printf(“%c”,0);舉例引例:引例:輸入輸入10位同學(xué)的一組信息,包位同學(xué)的一組信息,包括學(xué)號、姓名、數(shù)學(xué)成績、計括學(xué)號、姓
8、名、數(shù)學(xué)成績、計算機成績,求得每位同學(xué)的平算機成績,求得每位同學(xué)的平均分和總分,然后按照總分從均分和總分,然后按照總分從高到低排序。高到低排序。 zhang, 001, 95.0, 64.0 wang, 002, 92.0, 97.0 zhao, 003, 85.0, 78.0 li, 004, 96.0, 88.0 zhou, 005, 91.0, 96.0 wu, 006, 93.0, 78.0 lin, 007, 98.0, 97.0 ma, 008, 89.0, 93.0 zhen, 009, 88.0, 90.0 yu, 010, 94.0, 90.016#include void
9、main()struct student char name10; int num; float shx; float jsj; float aver; float sum;stu4=zhang,001,95.0,64.0,wang,002,92.0,97.0,zhao,003,85.0,78.0,li,004,96.0,88.0,student1;int i,j;for(i=0;i4;i+) stui.sum=stui.shx+stui.jsj; stui.aver=stui.sum/2;17for(i=0;i3;i+) for(j=i+1;j4;j+) if(stui.sumstuj.su
10、m) student1=stui; stui=stuj; stuj=student1; printf(sort afer:n); for(i=0;ix = 0; /*指向運算符指向運算符*/第二種更常用第二種更常用20 xypptpt思考題struct pointint x;int y;struct rectstruct point pt1;struct point pt2;struct rect rt;struct rect *rp = &rt;下面表達式哪些合法?下面表達式哪些合法?rt.pt1.x(*rp).pt1.xrp-pt1.xrt-pt1.x上面合法的表達式都是等價上面合法的表達
11、式都是等價的嗎?的嗎?21結(jié)構(gòu)體數(shù)組的指針結(jié)構(gòu)體數(shù)組的指針struct STUDENT stu4;struct STUDENT *pt;pt = stu;222341stu0stu1stu2ptpt+stu3舉例#include stdio.hstruct st int x; int y; ;void main()struct st s2=24,8,4,2, *p=s; printf(%d,+p-x); /* (+p) -x */23輸出結(jié)果為:25(4)下面程序的運行結(jié)果是下面程序的運行結(jié)果是_. main() struct cmplx int x; int y; cnum2=1,3,2,7
12、; printf(%dn,cnum0.y/cnum0.x*cnum1.x); a)0 b)1 c)3 d)624#include stdio.hstruct stint x; int *y;void main( )int dt4=10,20,30,40; struct st a4=50,&dt0,60,&dt1,70,&dt2,80,&dt3; struct st *p=a; printf(%dn,+p-x ); printf(%dn,(+p)-x ); printf(%dn,+(*p-y) );25輸出結(jié)果是:516021struct類型的特點類型的特點一個普通的類型一個普通的類型可以定義該
13、類型的變量、數(shù)組、指針可以定義該類型的變量、數(shù)組、指針可以做函數(shù)的參數(shù)類型和返回值類型可以做函數(shù)的參數(shù)類型和返回值類型它的成員可以是任意類型它的成員可以是任意類型基本類型、數(shù)組、指針、結(jié)構(gòu)體基本類型、數(shù)組、指針、結(jié)構(gòu)體struct類型的變量類型的變量兩個同類型結(jié)構(gòu)體變量之間可以相互賦值兩個同類型結(jié)構(gòu)體變量之間可以相互賦值可以取地址可以取地址&不能直接參與算術(shù)和比較運算不能直接參與算術(shù)和比較運算26動態(tài)數(shù)據(jù)結(jié)構(gòu)動態(tài)數(shù)據(jù)結(jié)構(gòu) 鏈表鏈表結(jié)構(gòu)體類型聲明時不能包含自我,但可以包結(jié)構(gòu)體類型聲明時不能包含自我,但可以包含指向本結(jié)構(gòu)體類型的指針變量含指向本結(jié)構(gòu)體類型的指針變量鏈表鏈表struct Link i
14、nt data; struct Link *next;27datanextheaddatanextdatanextdataNULL圖10-1 鏈表原理圖基本概念基本概念鏈表鏈表-是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。它是是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。它是動態(tài)進行存儲分配的一種結(jié)構(gòu)。它可以根據(jù)動態(tài)進行存儲分配的一種結(jié)構(gòu)。它可以根據(jù)需要開辟或刪除存儲單元。需要開辟或刪除存儲單元。 鏈表分為鏈表分為單向鏈表單向鏈表和雙向鏈表。和雙向鏈表。 頭指針頭指針-鏈表有一個鏈表有一個頭指針頭指針變量,通常以變量,通常以head表示,它存放鏈表中的第表示,它存放鏈表中的第1個元素的地個元素的地 址。址。28datanext
15、headdatanextdatanextdataNULL圖10-1 鏈表原理圖基本概念基本概念 節(jié)點節(jié)點-鏈表中的元素稱為節(jié)點。鏈表中的元素稱為節(jié)點。 每個節(jié)點都包含兩部分:數(shù)據(jù)域和指針域。每個節(jié)點都包含兩部分:數(shù)據(jù)域和指針域。 根據(jù)節(jié)點在鏈表中的位置,又可分為鏈表的起始節(jié)根據(jù)節(jié)點在鏈表中的位置,又可分為鏈表的起始節(jié)點、中間節(jié)點以及結(jié)束節(jié)點。點、中間節(jié)點以及結(jié)束節(jié)點。鏈表的結(jié)束節(jié)點的指針域為空指針鏈表的結(jié)束節(jié)點的指針域為空指針NULL 29datanextheaddatanextdatanextdataNULL圖10-1 鏈表原理圖舉例#include stdio.hstruct stint
16、x; struct st *next;void main( )struct st aa3=5,&aa1,7,&aa2,9,NULL; struct st *p; p=&aa0; printf(%d,+p-x );30兩個常用函數(shù)malloc( ) 函數(shù)動態(tài)申請內(nèi)存如:struct temp int data; struct temp *next; ; struct temp *p; p=(struct temp *)malloc(sizeof(struct temp);free( )函數(shù)釋放內(nèi)存如: free(p);使用這兩個函數(shù)時要包含頭文件 stdlib.h31單鏈表的基本操作鏈表的建立鏈
17、表的刪除鏈表的插入3233共用體共用體 聯(lián)合體又稱為共用體,意為各種不同數(shù)據(jù)共用同一聯(lián)合體又稱為共用體,意為各種不同數(shù)據(jù)共用同一段存儲空間。段存儲空間。 與結(jié)構(gòu)體類似,為了定義共用體類型變量,首先要與結(jié)構(gòu)體類似,為了定義共用體類型變量,首先要定義共用體類型,說明該共用體類型中包括哪些成員,定義共用體類型,說明該共用體類型中包括哪些成員,它們各屬于何數(shù)據(jù)類型,然后再定義該類型的變量。它們各屬于何數(shù)據(jù)類型,然后再定義該類型的變量。34 定義共用體數(shù)據(jù)類型的一般形式為定義共用體數(shù)據(jù)類型的一般形式為union 共用體名共用體名 成員表成員表 ;例如,例如,union w int k; double d
18、; char c; ;定義了一個共用體類型定義了一個共用體類型w,包括代表整型量的成員,包括代表整型量的成員k、代表、代表雙精度型量的成員雙精度型量的成員d和代表字符型量的成員和代表字符型量的成員c。 k,d,c三個變?nèi)齻€變量的首地址相同,相當(dāng)于共用了一段連續(xù)的內(nèi)存單元,長量的首地址相同,相當(dāng)于共用了一段連續(xù)的內(nèi)存單元,長度為度為8.kdc2000共用體變量的引用與賦值共用體變量的引用與賦值引用的一般形式:引用的一般形式: 共用體變量名共用體變量名.成員名成員名賦值:賦值: 僅在程序中進行,不能初始化,每次只能賦予僅在程序中進行,不能初始化,每次只能賦予一個成員值。一個成員值。3536幾點說明
19、:幾點說明: (1)由于一個共用體變量中的各成員共用一段存儲空)由于一個共用體變量中的各成員共用一段存儲空間,因此,在任一時刻,只能有一種類型的數(shù)據(jù)存放在該間,因此,在任一時刻,只能有一種類型的數(shù)據(jù)存放在該變量中,即在任一時刻,只有一個成員的數(shù)據(jù)有意義,其變量中,即在任一時刻,只有一個成員的數(shù)據(jù)有意義,其他成員的數(shù)據(jù)是沒有意義的。他成員的數(shù)據(jù)是沒有意義的。 (2)在引用共用體變量中的成員時,必須保證數(shù)據(jù)的)在引用共用體變量中的成員時,必須保證數(shù)據(jù)的一致。一致。 (3)在定義共用體變量時不能為其初始化,并且,共)在定義共用體變量時不能為其初始化,并且,共用體變量不能作為函數(shù)參數(shù)。用體變量不能作為函數(shù)參數(shù)。 (4)共用體類型與結(jié)構(gòu)體類型可以互相嵌套,即共用)共用體類型與結(jié)構(gòu)體類型可以互相嵌套,即共用體類型可以作為結(jié)構(gòu)體類型的成員,結(jié)構(gòu)體類型也可以作體類型可以作為結(jié)構(gòu)體類型的成員,結(jié)構(gòu)體類型也可以作為共用體類型的成員。為共用體類型的成員。37枚舉類型枚舉類型枚舉類型枚舉類型 (1)先定義枚舉類型,然后定義該枚舉)先定義枚舉類型,然后定義該枚舉類型的變量。類型的
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度年福建省高校教師資格證之高等教育心理學(xué)綜合檢測試卷B卷含答案
- 2024年度山西省高校教師資格證之高等教育法規(guī)押題練習(xí)試卷B卷附答案
- 2024年度年福建省高校教師資格證之高等教育學(xué)押題練習(xí)試卷B卷附答案
- 2024年DVD視盤機和驅(qū)動器光頭項目投資申請報告
- 廣東開放大學(xué)2024年秋《國家安全概論(S)(本專)》形成性考核作業(yè)參考答案
- 黨員使命意識提升培訓(xùn)協(xié)議2024
- 2024新建設(shè)工程成本咨詢協(xié)議范本
- 2024水電開發(fā)建設(shè)協(xié)議范本
- 2024年政府專項資金支持計劃協(xié)議
- 廠房2024年租賃化協(xié)議模板
- 保安公司客戶滿意度調(diào)查表
- 課間安全教育主題班會課件
- 民法典 婚姻家庭編課件
- 電氣工程及其自動化專業(yè)人才需求調(diào)研報告(新)5100字
- 公務(wù)員考試行測答題卡
- 消失模工序工藝作業(yè)指導(dǎo)書
- 廣西壯族自治區(qū)北海市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細居民村民委員會
- 老年人能力評定總表(含老年人日常生活活動能力、精神狀態(tài)與社會參與能力、感知覺與溝通能力、老年綜合征罹患情況)
- 小學(xué)英語期中試卷分析(三篇)
- 系動詞公開課 完整版PPT
- 土工擊實儀不確定度評定
評論
0/150
提交評論