版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第12章自定義數(shù)據(jù)類型第12章自定義數(shù)據(jù)類型本章要點結(jié)構(gòu)體鏈表2024/1/21212自定義數(shù)據(jù)類型知識點結(jié)構(gòu)體鏈表枚舉類型2024/1/21312自定義數(shù)據(jù)類型自定義數(shù)據(jù)類型包括:數(shù)組(前面討論過)結(jié)構(gòu)體共用體(本書不討論)枚舉2024/1/21412.1結(jié)構(gòu)體結(jié)構(gòu)體是一種構(gòu)造類型,它是由若干成員組成的。每一個成員可以是一個基本數(shù)據(jù)類型或者又是一個構(gòu)造類型。
學(xué)生:由姓名、身高、成績等組成,為一個有機整體2024/1/21512.1.1結(jié)構(gòu)體聲明聲明結(jié)構(gòu)體類型的一般形式為:struct結(jié)構(gòu)名{成員表列};structStudent{intiNum;charcArrName[20];charcSex;floatfScore;};結(jié)構(gòu)體聲明并不分配空間,結(jié)構(gòu)體類型聲明是在說明一種數(shù)據(jù)類型,并非變量定義。2024/1/21612.1.2結(jié)構(gòu)體變量定義1.先聲明結(jié)構(gòu)體,再定義結(jié)構(gòu)體變量。structstudent{intiNum;charcArrName[20];charcSex;floatfScore;};structstudentstrStu1,strStu2;定義結(jié)構(gòu)體變量有以下三種方法:2024/1/21712.1.2結(jié)構(gòu)體變量定義2.在聲明結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量。structstudent{intiNum;charcArrName[20];charcSex;floatfScore;}strStu1,strStu2;定義結(jié)構(gòu)體變量有以下三種方法:2024/1/21812.1.2結(jié)構(gòu)體變量定義3.直接定義結(jié)構(gòu)體變量。struct{intiNum;charcArrName[20];charcSex;floatfScore;}strStu1,strStu2;定義結(jié)構(gòu)體變量有以下三種方法:第三種方法與第二種方法的區(qū)別在于第三種方法中省去了結(jié)構(gòu)體名,而直接給出結(jié)構(gòu)體變量。這種類型結(jié)構(gòu)體只能用此一次,以后無法再定義該結(jié)構(gòu)體類型變量,即使再聲明成員完全相同的結(jié)構(gòu)體類型,也和此次定義的結(jié)構(gòu)體類型屬于不同的結(jié)構(gòu)體類型。2024/1/21912.1.2結(jié)構(gòu)體變量定義
結(jié)構(gòu)體變量在內(nèi)存空間的存儲是連續(xù)的,結(jié)構(gòu)體類型占用空間的大小sizeof(structstudent)的值各成員大小之和29字節(jié)(iNum:4字節(jié)、cArrName[20]:20字節(jié)、cSex:1字節(jié)、fScore:4字節(jié)),各編譯系統(tǒng)為內(nèi)存管理方便可能分配的空間大一些。2024/1/211012.1.3結(jié)構(gòu)體變量引用1.結(jié)構(gòu)變量初始化和其他類型變量一樣,對結(jié)構(gòu)變量可以在定義時進行初始化賦值。structstudent{intiNum;charcArrName[20];charcSex;floatfScore;}strStu2,strStu1={102,"Zhangping",'M',78.5};strStu1、strStu2均被定義為結(jié)構(gòu)變量,并對strStu1作了初始化賦值。2024/1/211112.1.3結(jié)構(gòu)體變量引用2.結(jié)構(gòu)體成員引用引用結(jié)構(gòu)變量成員的一般形式是:結(jié)構(gòu)體變量名.成員名.為成員運算符,優(yōu)先級最高,結(jié)合性為自左向右。例如:strStu1.iNum第一個學(xué)生的學(xué)號strStu2.cSex第二個學(xué)生的性別如果成員本身又是一個結(jié)構(gòu)體則必須逐級找到最低級的成員才能使用。例如:strStu1.strBirthday.iMonth第一個學(xué)生出生的月份成員可以在程序中單獨使用,與普通變量完全相同。2024/1/211212.1.3結(jié)構(gòu)體變量引用3.結(jié)構(gòu)體變量賦值結(jié)構(gòu)變量之間可以像普通變量一樣相互賦值。strStu2=strStu1;會把strStu1內(nèi)存空間的全部內(nèi)容復(fù)制strStu2對應(yīng)的空間中。不能對結(jié)構(gòu)體變量整體進行輸入、輸出、運算。scanf("",&strStu);strStu2+strStu1;strStu2<strStu1;2024/1/211312.1.4結(jié)構(gòu)體數(shù)組數(shù)組的元素也可以是結(jié)構(gòu)體類型的structStudent{intiNum;char*pcName;charcSex;floatfScore;}strStuArr[5];2024/1/211412.1.4結(jié)構(gòu)體數(shù)組例12.2對學(xué)生表按照成績從小到大排序#include<stdio.h>#include<string.h>/*聲明結(jié)構(gòu)體類型*/structstudent{intiNum;char*pcName;charcSex;floatfScore;};intmain(){
/*定義結(jié)構(gòu)體數(shù)組*/structstudentstrStuArr[5]={ {101,"Liping",'M',45}, {102,"Zhangping",'M',62.5}, {103,"Hefang",'F',92.5}, {104,"Chengling",'M',87}, {105,"Wangming",'F',58}};
structstudentstrStuTemp;inti1,i2,iFlag;for(i1=0;i1<4;i1++){iFlag=i1;for(i2=i1+1;i2<5;i2++)if(strStuArr[i2].fScore<strStuArr[iFlag].fScore)iFlag=i2;if(iFlag!=i1){ strStuTemp=strStuArr[i1]; strStuArr[i1]=strStuArr[iFlag];strStuArr[iFlag]=strStuTemp;}}for(i1=0;i1<5;i1++){printf("Num=%dName=%s",strStuArr[i1].iNum,strStuArr[i1].pcName);printf("Sex=%cScore=%f\n",strStuArr[i1].cSex,strStuArr[i1].fScore);}return0;}2024/1/211512.1.5結(jié)構(gòu)體與指針一個指針變量也可以指向結(jié)構(gòu)體變量,一個指針變量當(dāng)用來指向一個結(jié)構(gòu)體變量時,稱之為結(jié)構(gòu)體指針變量。結(jié)構(gòu)體指針變量中的值是所指向的結(jié)構(gòu)體變量的首地址。通過結(jié)構(gòu)體指針即可間接訪問該結(jié)構(gòu)變量。結(jié)構(gòu)體指針定義說明的一般形式為:
struct結(jié)構(gòu)名*結(jié)構(gòu)指針變量名;structstudent*pStrStudent;pStrStudent=&strStu1;2024/1/211612.1.5結(jié)構(gòu)體與指針通過結(jié)構(gòu)體指針變量,就能間接地訪問結(jié)構(gòu)體變量的各個成員。其訪問的一般形式為:
(*結(jié)構(gòu)指針變量).成員名或為:
結(jié)構(gòu)指針變量->成員名->為指向運算符,優(yōu)先級最高,結(jié)合性為自左向右。兩種寫法完全一樣。(*pStrStudent).iNum或者:pStrStudent->iNum應(yīng)該注意(*pStrStudent)兩側(cè)的括號不可少,因為成員符"."的優(yōu)先級高于"*"。2024/1/211712.1.5結(jié)構(gòu)體與指針例12.3通過指針間接訪問結(jié)構(gòu)體成員#include<stdio.h>structstudent{intiNum;char*pcName;charcSex;floatfScore;}strStu1={102,"Zhangping",'M',78.5},*pStrStudent;intmain(){pStrStudent=&strStu1;
/*通過變量名訪問*/printf("Number=%d\nName=%s\n",strStu1.iNum,strStu1.pcName);printf("Sex=%c\nScore=%f\n\n",strStu1.cSex,strStu1.fScore);
/*通過指針和.運算符訪問*/printf("Number=%d\nName=%s\n",(*pStrStudent).iNum,(*pStrStudent).pcName);printf("Sex=%c\nScore=%f\n\n",(*pStrStudent).cSex,(*pStrStudent).fScore);
/*通過指針和->運算符訪問*/printf("Number=%d\nName=%s\n",pStrStudent->iNum,pStrStudent->pcName);printf("Sex=%c\nScore=%f\n\n",pStrStudent->cSex,pStrStudent->fScore);return0;}2024/1/211812.1.5結(jié)構(gòu)體與指針例12.4用指針變量輸出結(jié)構(gòu)體數(shù)組。#include<stdio.h>structstudent{intiNum;char*pcName;charcSex;floatfScore;}strStuArr[5]={{101,"Zhouping",'M',45},{102,"Zhangping",'M',62.5},{103,"Lioufang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58}};intmain(){structstudent*pStrStudent;/*指針指向數(shù)組開始*/pStrStudent=strStuArr;printf("No\tName\t\t\tSex\tScore\t\n");/*通過移動指針訪問數(shù)組*/for(pStrStudent=strStuArr;pStrStudent<strStuArr+5;pStrStudent++)printf("%d\t%s\t\t%c\t%f\t\n",pStrStudent->iNum,pStrStudent->pcName,pStrStudent->cSex,pStrStudent->fScore);return0;}2024/1/2119課堂練習(xí)每本書包括書名、ISBN、價格;要管理5本書,應(yīng)該采用什么樣的數(shù)據(jù)結(jié)構(gòu)進行管理;計算5本書的價格總和。每本書包括書名、ISBN、價格;未知幾本書,應(yīng)該采用什么樣的數(shù)據(jù)結(jié)構(gòu)進行管理;計算所有書的價格總和。2024/1/212012.2鏈表數(shù)組大小編譯時決定--不適于大小可變情況動態(tài)空間運行時申請與釋放--夠用即可structstudent{intiNum;floatfScore;structstudent*pStrNext;};鏈表的精髓2024/1/212112.2鏈表鏈表的基本操作有以下幾種:(1)建立鏈表;(2)輸出鏈表(3)結(jié)點查找;(4)插入結(jié)點;(5)刪除結(jié)點;2024/1/212212.2鏈表例12.5鏈表的創(chuàng)建、輸出、查找#include<stdio.h>/*結(jié)點定義*/structstudent{intiNum;floatfScore;structstudent*pStrNext;};2024/1/212312.2鏈表例12.5鏈表的創(chuàng)建、輸出、查找/*創(chuàng)建鏈表*/structstudent*create(){structstudent*pStrStuHead=0,*pStrStuTemp,*pStrStuTail=0;intiNumTemp;floatfScoreTemp;printf("inputnumandscore(>=0,<0end):\n");scanf("%d",&iNumTemp);scanf("%f",&fScoreTemp);
/*添加結(jié)點,當(dāng)輸入成績值為負數(shù)時結(jié)束*/while(fScoreTemp>0){/*申請結(jié)點并填入數(shù)據(jù),結(jié)點的指針域為0,因為新結(jié)點將作為最后一個結(jié)點*/pStrStuTemp=(structstudent*)malloc(sizeof(structstudent));pStrStuTemp->iNum=iNumTemp;pStrStuTemp->fScore=fScoreTemp;pStrStuTemp->pStrNext=0;
/*接入鏈表*/if(!pStrStuHead)
/*接入第一個結(jié)點,頭指針、尾指針均指向該結(jié)點*/ pStrStuHead=pStrStuTail=pStrStuTemp;else{ /*接入非第一個結(jié)點*/pStrStuTail->pStrNext=pStrStuTemp;/*接在尾指針?biāo)附Y(jié)點之后*/pStrStuTail=pStrStuTemp;/*尾指針指向新加入結(jié)點*/}printf("inputnumandscore(>=0,<0end):\n");scanf("%d",&iNumTemp);scanf("%f",&fScoreTemp);}returnpStrStuHead;}2024/1/212412.2鏈表例12.5鏈表的創(chuàng)建、輸出、查找/*輸出鏈表*/voidlist(structstudent*pStrStuHead){while(pStrStuHead){printf("%d\t%f\t\n",pStrStuHead->iNum,pStrStuHead->fScore);/*輸出*/ pStrStuHead=pStrStuHead->pStrNext;/*移動到下一個結(jié)點*/}}/*查找結(jié)點*/structstudent*search(structstudent*pStrStuTemp,floatfScoreTemp){while(pStrStuTemp){if(pStrStuTemp->fScore==fScoreTemp) break; pStrStuTemp=pStrStuTemp->pStrNext;/*移動到下一個結(jié)點*/}returnpStrStuTemp;}鏈表的遍歷2024/1/212512.2鏈表例12.5鏈表的創(chuàng)建、輸出、查找intmain(){structstudentstrStuTemp;structstudent*pStrStuHead,*pStrStuResualt;floatfScoreTemp;intiNumTemp;/*創(chuàng)建鏈表*/pStrStuHead=create();
/*輸出鏈表所有結(jié)點*/list(pStrStuHead);
/*輸入要查找的成績,然后返回找到結(jié)點的地址,找不到返回空*/printf("inputsearchscore:\n");scanf("%f",&fScoreTemp);pStrStuResualt=search(pStrStuHead,fScoreTemp);if(pStrStuResualt)printf("num=%d,score=%f\n",pStrStuResualt->iNum,pStrStuResualt->fScore);elseprintf("notfound!");return0;}2024/1/2126課堂練習(xí)1.對例12.5的鏈表插入結(jié)點的函數(shù):
void*insert(structstudent*Head,intn,structstudent*p);//在鏈表Head第n個節(jié)點之后插入p所指向結(jié)點。在第n個結(jié)點之前插入怎么辦?2.對例12.5的鏈表刪除結(jié)點的函數(shù):void*delete(structstudent*Head,,floatfScoreTemp);//在鏈表Head中刪除成績值為fScoreTemp的結(jié)點。插入和刪除都必須定位到前面的結(jié)點2024/1/212712.3枚舉類型
有些變量的取值被限定在一個有限的范圍內(nèi)。例如,一個星期內(nèi)只有七天,一年只有十二個月等等。如果把這些量說明為整型,字符型或其它類型顯然是不妥當(dāng)?shù)?。為此,C語言提供了一種稱為“枚舉”的類型。枚舉類型優(yōu)點:1.便于理解、見名知義2.節(jié)省存儲空間枚舉類型優(yōu)點:1.編程復(fù)雜2.程序運行費時間2024/1/212812.3枚舉類型1.枚舉類型的聲明枚舉類型的聲明的一般形式為:enum枚舉名{枚舉值表};在枚舉值表中羅列出所有可用值,這些值也稱為枚舉元素。enumweekday{
sun,mon,tue,wed,thu,fri,sat};該枚舉名為weekday,枚舉值共有7個,即一周中的七天。被說明為weekday類型變量的取值只能是七天中的某一天。2024/1/212912.3枚舉類型
2.枚舉變量的定義同結(jié)構(gòu)體一樣,枚舉類型變量也可用不同的方式定義enumenumenumweekday{sun,mon,tue,wed,thu,fri,sat};enumweekdayweek1,week2,week3;或者為:enumweekday{sun,mon,tue,wed,thu,fri,sat}week1,week2,week3;或者為:enum{sun,mon,tue,wed,thu,fri,sat}week1,week2,week3;2024/1/213012.3枚舉類型3.枚舉類型變量的賦值和使用枚舉值是一種特殊的常量值,在使用中注意以下幾點:(1)枚舉值是常量,不是變量。不能在程序中用賦值語句再對它賦值。例如對枚舉類型weekday的元素再作賦值:
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度文化藝術(shù)界員工勞動合同范本2篇
- 二零二五年度大蒜種植基地與電商平臺物流配送合同3篇
- 二零二五年度房產(chǎn)中介保密協(xié)議示范文本9篇
- 二零二五年度房屋抵押貸款與資產(chǎn)證券化合同范本3篇
- 二零二五年度建筑安裝工程安全應(yīng)急預(yù)案編制合同3篇
- 二零二五年度房地產(chǎn)開發(fā)項目合作智慧城市建設(shè)合作協(xié)議范本3篇
- 縱向推書機構(gòu)課程設(shè)計
- 二零二五年度步行街商鋪租賃與綠色能源使用協(xié)議合同3篇
- 二零二五年度房地產(chǎn)銷售代理服務(wù)合同(含綠色環(huán)保建材)3篇
- 海南衛(wèi)生健康職業(yè)學(xué)院《拓展運動課程設(shè)計》2023-2024學(xué)年第一學(xué)期期末試卷
- 八年級一本·現(xiàn)代文閱讀訓(xùn)練100篇
- 米吳科學(xué)漫畫奇妙萬象篇
- 河南省鄭州市金水區(qū)2022-2023學(xué)年三年級上學(xué)期期末數(shù)學(xué)試卷
- XXX酒店開辦費POB預(yù)算
- Z矩陣、Y矩陣、A矩陣、S矩陣、T矩陣定義、推導(dǎo)及轉(zhuǎn)換公式
- 中美歐規(guī)范樁基承載力計算設(shè)計對比
- 外科洗手操作考核評分表
- 復(fù)旦大學(xué)外國留學(xué)生入學(xué)申請表
- 長安汽車發(fā)動機水溫高故障案例分析處置
- 瞬時單位線法計算洪水
- 氣力輸灰安裝施工方案
評論
0/150
提交評論