第9章用戶自己建立數(shù)據(jù)類型_第1頁
第9章用戶自己建立數(shù)據(jù)類型_第2頁
第9章用戶自己建立數(shù)據(jù)類型_第3頁
第9章用戶自己建立數(shù)據(jù)類型_第4頁
第9章用戶自己建立數(shù)據(jù)類型_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第9 9章章 用戶自己建立數(shù)據(jù)類型用戶自己建立數(shù)據(jù)類型n9.1 9.1 定義和使用結(jié)構(gòu)體變量定義和使用結(jié)構(gòu)體變量n9.2 9.2 使用結(jié)構(gòu)體數(shù)組使用結(jié)構(gòu)體數(shù)組n9.3 9.3 結(jié)構(gòu)體指針結(jié)構(gòu)體指針n9.4 9.4 用指針處理鏈表用指針處理鏈表n9.5 9.5 共用體類型共用體類型n9.6 9.6 使用枚舉類型使用枚舉類型n9.7 9.7 用用typedeftypedef聲明新類型名聲明新類型名第十一章 結(jié)構(gòu)體與共用體提出問題提出問題 一個學生有學號、姓名、性別、年齡、地址等屬性。一個學生有學號、姓名、性別、年齡、地址等屬性。 intint num; num;char name20;char

2、name20; char sex; char sex; intint age; age;char addr30; char addr30; 如果將這些屬性分別定義為互相獨立的簡單變量,則難以反如果將這些屬性分別定義為互相獨立的簡單變量,則難以反映它們之間的內(nèi)在聯(lián)系(同一個學生的屬性)。映它們之間的內(nèi)在聯(lián)系(同一個學生的屬性)。 結(jié)構(gòu)體的定義結(jié)構(gòu)體的定義 結(jié)構(gòu)體結(jié)構(gòu)體是邏輯上相互聯(lián)系的一組分量的集合。是邏輯上相互聯(lián)系的一組分量的集合。 結(jié)構(gòu)體中的分量可以是不同類型的數(shù)據(jù),結(jié)構(gòu)體中的分結(jié)構(gòu)體中的分量可以是不同類型的數(shù)據(jù),結(jié)構(gòu)體中的分量稱為量稱為結(jié)構(gòu)體的成員結(jié)構(gòu)體的成員。 在使用結(jié)構(gòu)體之前,首先要對

3、結(jié)構(gòu)體的組成進行描述,在使用結(jié)構(gòu)體之前,首先要對結(jié)構(gòu)體的組成進行描述,稱為稱為結(jié)構(gòu)體的定義結(jié)構(gòu)體的定義。結(jié)構(gòu)體定義說明了該結(jié)構(gòu)體的組成成。結(jié)構(gòu)體定義說明了該結(jié)構(gòu)體的組成成員,以及每個成員的類型。員,以及每個成員的類型。n9.1 定義和使用結(jié)構(gòu)體變量定義和使用結(jié)構(gòu)體變量第十一章 結(jié)構(gòu)體與共用體結(jié)構(gòu)體定義的一般形式結(jié)構(gòu)體定義的一般形式structstruct 結(jié)構(gòu)體類型名稱結(jié)構(gòu)體類型名稱 數(shù)據(jù)類型數(shù)據(jù)類型 成員名成員名1; 1; 數(shù)據(jù)類型數(shù)據(jù)類型 成員名成員名2; 2; 數(shù)據(jù)類型數(shù)據(jù)類型 成員名成員名n n; ; ; 說明:說明: structstruct 為關(guān)鍵字。為關(guān)鍵字。 結(jié)構(gòu)體類型名稱結(jié)構(gòu)

4、體類型名稱是所定義的結(jié)構(gòu)體類型標識,由用戶自是所定義的結(jié)構(gòu)體類型標識,由用戶自己定義;己定義; 中包圍的是組成該中包圍的是組成該結(jié)構(gòu)體的成員結(jié)構(gòu)體的成員; 每個成員的每個成員的數(shù)據(jù)類型數(shù)據(jù)類型既可以是簡單的數(shù)據(jù)類型既可以是簡單的數(shù)據(jù)類型( (intint、charchar、floatfloat、doubledouble.).),也可以是復雜的數(shù)據(jù)類型也可以是復雜的數(shù)據(jù)類型( (數(shù)數(shù)組類型或結(jié)構(gòu)體類型組類型或結(jié)構(gòu)體類型) )。n9.1 定義和使用結(jié)構(gòu)體變量定義和使用結(jié)構(gòu)體變量第十一章 結(jié)構(gòu)體與共用體結(jié)構(gòu)體定義實例結(jié)構(gòu)體定義實例例例1 1:為了描述日期可以定義如下結(jié)構(gòu)體:為了描述日期可以定義如下結(jié)

5、構(gòu)體: structstruct date date intint year; / year; /* * 年。整型作為結(jié)構(gòu)體中的成員年。整型作為結(jié)構(gòu)體中的成員 * */ / intint month; month; / /* * 月月 * */ / intint day; day; / /* * 日日 * */ / ; ; 例例2 2:為了處理為了處理學生成績學生成績,可以定義如下結(jié)構(gòu)體:可以定義如下結(jié)構(gòu)體: structstruct student student char num8; / char num8; /* *學號學號. .字符數(shù)組作為結(jié)構(gòu)體中的成員字符數(shù)組作為結(jié)構(gòu)體中的成員* *

6、/ / char name10; char name10; / /* * 姓名姓名 * */ / char sex; char sex; / /* * 性別性別 * */ / float score10; /float score10; /* * 存放十門功課的成績存放十門功課的成績 * */ / float average; /float average; /* * 存放平均分存放平均分* */ / ; ;n9.1 定義和使用結(jié)構(gòu)體變量定義和使用結(jié)構(gòu)體變量第十一章 結(jié)構(gòu)體與共用體結(jié)構(gòu)體結(jié)構(gòu)體類型類型變量的變量的定義定義v結(jié)構(gòu)體的定義描述了結(jié)構(gòu)體的組成。結(jié)構(gòu)體的定義描述了結(jié)構(gòu)體的組成。 v要使

7、用該結(jié)構(gòu)體就要使用該結(jié)構(gòu)體就必須說明必須說明結(jié)構(gòu)體類型的結(jié)構(gòu)體類型的變量變量。 v定義結(jié)構(gòu)體是定義了一種由成員組成的復合類型,而用這定義結(jié)構(gòu)體是定義了一種由成員組成的復合類型,而用這種類型說明了一個變量,才會產(chǎn)生種類型說明了一個變量,才會產(chǎn)生具體的實體具體的實體。 結(jié)構(gòu)體變量結(jié)構(gòu)體變量定義定義的一般形式的一般形式 1. 先聲明結(jié)構(gòu)體類型再定義變量名先聲明結(jié)構(gòu)體類型再定義變量名 v系統(tǒng)為所說明的結(jié)構(gòu)體變量按照結(jié)構(gòu)體定義時說明的組成系統(tǒng)為所說明的結(jié)構(gòu)體變量按照結(jié)構(gòu)體定義時說明的組成(成員分量),分配存儲數(shù)據(jù)的實際內(nèi)存單元。(成員分量),分配存儲數(shù)據(jù)的實際內(nèi)存單元。 v例:將變量例:將變量today

8、說明為說明為date型的結(jié)構(gòu)體變量:型的結(jié)構(gòu)體變量: struct date today; 說明多個說明多個student型的結(jié)構(gòu)體變量:型的結(jié)構(gòu)體變量: struct student wang, li, zhang; n9.1 定義和使用結(jié)構(gòu)體變量定義和使用結(jié)構(gòu)體變量第十一章 結(jié)構(gòu)體與共用體結(jié)構(gòu)體變量結(jié)構(gòu)體變量定義定義的一般形式的一般形式 2.在聲明結(jié)構(gòu)體類型的同時定義變量在聲明結(jié)構(gòu)體類型的同時定義變量 3.直接定義結(jié)構(gòu)體類型變量直接定義結(jié)構(gòu)體類型變量 例:例:structstruct date date intint year; year; intint month; month; int

9、int day; day; today,tomorrowtoday,tomorrow; ; 例:例:structstruct intint year; year; intint month; month; intint day; day; today,tomorrowtoday,tomorrow; ; n9.1 定義和使用結(jié)構(gòu)體變量定義和使用結(jié)構(gòu)體變量第十一章 結(jié)構(gòu)體與共用體結(jié)構(gòu)體變量占用內(nèi)存情況結(jié)構(gòu)體變量占用內(nèi)存情況 結(jié)構(gòu)體變量的各個成員分量在內(nèi)存中占用連續(xù)存儲區(qū)域,結(jié)構(gòu)體變量的各個成員分量在內(nèi)存中占用連續(xù)存儲區(qū)域,所占內(nèi)存大小為所占內(nèi)存大小為。2字節(jié)字節(jié)2字節(jié)字節(jié)2字節(jié)字節(jié)today (占

10、占6個字節(jié)個字節(jié))yearmonthday wang ( 占占63個字節(jié)個字節(jié))8字節(jié)字節(jié)10字節(jié)字節(jié)1字節(jié)字節(jié)40字節(jié)字節(jié)4字節(jié)字節(jié)numnamesexscoreaverage 求結(jié)構(gòu)體變量占用內(nèi)存大小求結(jié)構(gòu)體變量占用內(nèi)存大小 使用使用sizeofsizeof運算。運算。sizeofsizeof是單目運算,其功能是求出運算是單目運算,其功能是求出運算對象所占的內(nèi)存空間的字節(jié)數(shù)目。對象所占的內(nèi)存空間的字節(jié)數(shù)目。 使用的一般形式為:使用的一般形式為:sizeofsizeof( (變量或類型說明符變量或類型說明符) ) 如:如:sizeof(struct student)n9.1 定義和使用結(jié)構(gòu)體

11、變量定義和使用結(jié)構(gòu)體變量第十一章 結(jié)構(gòu)體與共用體關(guān)于結(jié)構(gòu)體類型的說明關(guān)于結(jié)構(gòu)體類型的說明 v類型與變量是不同的概念。類型與變量是不同的概念。 v在定義結(jié)構(gòu)體變量時一般先定義一個結(jié)構(gòu)體類型,然后再在定義結(jié)構(gòu)體變量時一般先定義一個結(jié)構(gòu)體類型,然后再說明變量為該類型。說明變量為該類型。 v只能對變量賦值、存取或運算,而不能對一個類型賦值、只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算。存取或運算。 v在編譯時,對類型是不分配空間的,只對變量分配空間。在編譯時,對類型是不分配空間的,只對變量分配空間。 v對結(jié)構(gòu)體中的成員,可以單獨使用,它的作用與地位相當對結(jié)構(gòu)體中的成員,可以單獨使用,它

12、的作用與地位相當于普通變量。于普通變量。 v成員也可以是結(jié)構(gòu)體變量。成員也可以是結(jié)構(gòu)體變量。 v成員名可以與程序中的變量名相同,二者代表不同的對象。成員名可以與程序中的變量名相同,二者代表不同的對象。n9.1 定義和使用結(jié)構(gòu)體變量定義和使用結(jié)構(gòu)體變量第十一章 結(jié)構(gòu)體與共用體例如:例如: structstruct date date intint m; m; intint d; d; intint y; y; ; ; structstruct student student intint num; num; char name20; char name20; char sex; char sex

13、; intint age; age; structstruct date birthday; date birthday; char addr30; char addr30; student1, student2; student1, student2;dmybirthdayagesexnamenumaddr程序中可以另定義一個變量程序中可以另定義一個變量 numnum,它和它和 structstruct student student 中的成員中的成員 num num 是兩回事,互不干擾。是兩回事,互不干擾。n9.1 定義和使用結(jié)構(gòu)體變量定義和使用結(jié)構(gòu)體變量第十一章 結(jié)構(gòu)體與共用體引用結(jié)構(gòu)體

14、變量中的成員分量引用結(jié)構(gòu)體變量中的成員分量 v訪問結(jié)構(gòu)體中的成員是通過成員的名字,稱為訪問結(jié)構(gòu)體中的成員是通過成員的名字,稱為“按名引用按名引用”。v在程序中使用結(jié)構(gòu)體中成員的方法為:在程序中使用結(jié)構(gòu)體中成員的方法為: 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員名稱成員名稱 v例:將例:將“92/10/01”送入結(jié)構(gòu)體變量送入結(jié)構(gòu)體變量today,對其各個成員分對其各個成員分別賦值:別賦值: today.year = 92; today.month = 10; today.day = 1; v指明結(jié)構(gòu)體成員的符號指明結(jié)構(gòu)體成員的符號“.”是運算符,含義是訪問結(jié)構(gòu)體中是運算符,含義是訪問結(jié)構(gòu)體中的成員。的成

15、員。 v“.”操作的優(yōu)先級最高。結(jié)合性為從左到右。操作的優(yōu)先級最高。結(jié)合性為從左到右。9.1.3 結(jié)構(gòu)體變量的初始化和引用結(jié)構(gòu)體變量的初始化和引用第十一章 結(jié)構(gòu)體與共用體例:要用結(jié)構(gòu)體描述一個人的基本情況,可以定義如下結(jié)構(gòu)體:例:要用結(jié)構(gòu)體描述一個人的基本情況,可以定義如下結(jié)構(gòu)體: structstruct person person / /* * 定義定義personperson結(jié)構(gòu)體類型結(jié)構(gòu)體類型 * */ / char name 30; char name 30; char sex; char sex; structstruct date birthday date birthday;

16、/; /* * 結(jié)構(gòu)體的嵌套定義結(jié)構(gòu)體的嵌套定義 * */ / man; man; 如果要在變量如果要在變量manman中存入一個中存入一個19601960年年3 3月月2828日出生的日出生的zhangzhang先生,先生,可以采用如下賦值語句:可以采用如下賦值語句: strcpy(strcpy(, ”, ”zhangzhang”); ”); / /* *不能寫成不能寫成 =zhangzhang; ; * */ / man.sexman.sex = M; = M; / /* * 為結(jié)構(gòu)體中的字符成員賦值為結(jié)構(gòu)體中的字符成員賦值

17、* */ / man.birthday.yearman.birthday.year = 1960; = 1960; man.birthday.monthman.birthday.month = 3; = 3; man.birthday.dayman.birthday.day = 28; = 28; / /* *嵌套定義的結(jié)構(gòu)體中的成員賦值嵌套定義的結(jié)構(gòu)體中的成員賦值* */ /9.1.3 結(jié)構(gòu)體變量的初始化和引用結(jié)構(gòu)體變量的初始化和引用第十一章 結(jié)構(gòu)體與共用體結(jié)構(gòu)體類型的引用說明結(jié)構(gòu)體類型的引用說明 v不能將一個結(jié)構(gòu)體變量作為一個整體直接訪問。例如,已不能將一個結(jié)構(gòu)體變量作為一個整體直接訪問。

18、例如,已定義定義student1student1為結(jié)構(gòu)體變量并且已有值。不能這樣引用:為結(jié)構(gòu)體變量并且已有值。不能這樣引用: printfprintf (”% (”%s,%c,%d,%d,%dns,%c,%d,%d,%dn”, student1); ”, student1); v如果成員本身又是一個結(jié)構(gòu)體類型,則要用若干個成員運如果成員本身又是一個結(jié)構(gòu)體類型,則要用若干個成員運算符,一級一級地找到最低的一級的成員。算符,一級一級地找到最低的一級的成員。 v只能對最低級的成員進行賦值或存取以及運算。例如,對只能對最低級的成員進行賦值或存取以及運算。例如,對上面定義的結(jié)構(gòu)體變量上面定義的結(jié)構(gòu)體變量

19、student1student1,可以這樣訪問各個成員:可以這樣訪問各個成員: student1.sex student1.sex student1.birthday.month student1.birthday.month student1.birthday.day student1.birthday.day student1.birthday.yearstudent1.birthday.year9.1.3 結(jié)構(gòu)體變量的初始化和引用結(jié)構(gòu)體變量的初始化和引用第十一章 結(jié)構(gòu)體與共用體v對成員變量可以象普通變量一樣進行各種運算。對成員變量可

20、以象普通變量一樣進行各種運算。 student2.birthday.year = student1.birthday.year; student2.birthday.year = student1.birthday.year; sum = student1.birthday.month + 12; sum = student1.birthday.month + 12; student1.age +; student1.age +; v可以引用成員的地址,也可以引用結(jié)構(gòu)體變量的地址。如:可以引用成員的地址,也可以引用結(jié)構(gòu)體變量的地址。如: scanfscanf (”%d”, &stude

21、nt1.num); (”%d”, &student1.num); printf(”%oprintf(”%o”, &student1); ”, &student1); 但不能用以下語句整體讀入結(jié)構(gòu)體變量,如:但不能用以下語句整體讀入結(jié)構(gòu)體變量,如: scanfscanf (”% (”%d,%s,%c,%d,%d,%d,%sd,%s,%c,%d,%d,%d,%s”, &student1);”, &student1);vC C語言中能夠?qū)Y(jié)構(gòu)體進行語言中能夠?qū)Y(jié)構(gòu)體進行整體操作整體操作的運算不多,只有賦的運算不多,只有賦值值“= =”和取地址和取地址“&

22、; &”操作。操作。 例如:例如: structstruct date date sundaysunday, today; , today; sundaysunday = today; = today; / /* * 結(jié)構(gòu)體變量整體賦值結(jié)構(gòu)體變量整體賦值 * */ /9.1.3 結(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)體類型名稱 結(jié)構(gòu)體變量初始化數(shù)據(jù);結(jié)構(gòu)體

23、變量初始化數(shù)據(jù); 中的初始化數(shù)據(jù)用逗號分隔。中的初始化數(shù)據(jù)用逗號分隔。 初始化數(shù)據(jù)的個數(shù)與結(jié)構(gòu)體成員的個數(shù)應(yīng)相同,它們是按成初始化數(shù)據(jù)的個數(shù)與結(jié)構(gòu)體成員的個數(shù)應(yīng)相同,它們是按成員的先后順序一一對應(yīng)賦值的。員的先后順序一一對應(yīng)賦值的。 每個初始化數(shù)據(jù)必須符合與其對應(yīng)的成員的數(shù)據(jù)類型。每個初始化數(shù)據(jù)必須符合與其對應(yīng)的成員的數(shù)據(jù)類型。 例:例:structstruct date date intint year, month, day; year, month, day; today = 92, 10, 1 ; today = 92, 10, 1 ; structstruct person pers

24、on char name 14, sex; char name 14, sex; structstruct date birthday; date birthday; man= man= zhaozhao, M, 1960,3,28 ;, M, 1960,3,28 ; 9.1.3 結(jié)構(gòu)體變量的初始化和引用結(jié)構(gòu)體變量的初始化和引用第十一章 結(jié)構(gòu)體與共用體結(jié)構(gòu)體與數(shù)組的關(guān)系結(jié)構(gòu)體與數(shù)組的關(guān)系在結(jié)構(gòu)體中使用數(shù)組類型作為結(jié)構(gòu)體的一個成員;在結(jié)構(gòu)體中使用數(shù)組類型作為結(jié)構(gòu)體的一個成員; 用結(jié)構(gòu)體類型作為數(shù)組元素的基類型構(gòu)成數(shù)組。用結(jié)構(gòu)體類型作為數(shù)組元素的基類型構(gòu)成數(shù)組。 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組是一個數(shù)組,數(shù)

25、組中的每一個元素都是結(jié)構(gòu)體是一個數(shù)組,數(shù)組中的每一個元素都是結(jié)構(gòu)體類型。類型。 說明結(jié)構(gòu)體數(shù)組的方法:先定義一個結(jié)構(gòu)體,再用結(jié)構(gòu)體說明結(jié)構(gòu)體數(shù)組的方法:先定義一個結(jié)構(gòu)體,再用結(jié)構(gòu)體類型說明一個數(shù)組變量。類型說明一個數(shù)組變量。 例:為記錄例:為記錄100個人的基本情況??梢哉f明一個有個人的基本情況??梢哉f明一個有100個個元素的數(shù)組。數(shù)組的基類型為結(jié)構(gòu)體,在說明數(shù)組時可元素的數(shù)組。數(shù)組的基類型為結(jié)構(gòu)體,在說明數(shù)組時可以寫成:以寫成: structstruct person man100; person man100; man就是有就是有100個元素的結(jié)構(gòu)體數(shù)組,數(shù)組的每個元素為個元素的結(jié)構(gòu)體數(shù)組

26、,數(shù)組的每個元素為 person 型。型。9.2 使用結(jié)構(gòu)體數(shù)組使用結(jié)構(gòu)體數(shù)組第十一章 結(jié)構(gòu)體與共用體要訪問結(jié)構(gòu)體數(shù)組中的具體元素,必須遵守數(shù)組使用的規(guī)定,要訪問結(jié)構(gòu)體數(shù)組中的具體元素,必須遵守數(shù)組使用的規(guī)定,按下標進行訪問;按下標進行訪問; 要訪問結(jié)構(gòu)體數(shù)組中某個具體元素下的成員,又要遵守有關(guān)要訪問結(jié)構(gòu)體數(shù)組中某個具體元素下的成員,又要遵守有關(guān)訪問結(jié)構(gòu)體成員的規(guī)定,使用訪問結(jié)構(gòu)體成員的規(guī)定,使用“. .”訪問運算符和成員名。訪問運算符和成員名。 例如:要將數(shù)組例如:要將數(shù)組manman中的中的 3 3 號元素賦值為:號元素賦值為: FangjinFangjin, M, 1963, 9, 13

27、, M, 1963, 9, 13 就可以使用下列語句:就可以使用下列語句: strcpystrcpy ( , ( , FangjinFangjin” ); ” ); man3.sex = M; man3.sex = M; man3.birthday.year = 1963; man3.birthday.year = 1963; man3.birthday.month = 9; man3.birthday.month = 9; man3.birthday.day = 13; man3.birthday.day = 13; / /* * 為數(shù)組中一個元素的一個成

28、員賦值為數(shù)組中一個元素的一個成員賦值 * */ /9.2 使用結(jié)構(gòu)體數(shù)組使用結(jié)構(gòu)體數(shù)組第十一章 結(jié)構(gòu)體與共用體對結(jié)構(gòu)數(shù)組可以作對結(jié)構(gòu)數(shù)組可以作初始化初始化賦值。賦值。例如:例如:structstruct stustu intint num; num; char char * *name;name; char sex; char sex; float score; float score; boy5= boy5= 101,Li ping,M,45, 101,Li ping,M,45, 102,Zhang ping,M,62.5, 102,Zhang ping,M,62.5, 103,He fan

29、g,F,92.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 104,Cheng ling,F,87, 105,Wang ming,M,58; 105,Wang ming,M,58; 當對全部元素作初始化賦值時,也可不給出數(shù)組長度當對全部元素作初始化賦值時,也可不給出數(shù)組長度9.2 使用結(jié)構(gòu)體數(shù)組使用結(jié)構(gòu)體數(shù)組第十一章 結(jié)構(gòu)體與共用體例:分析結(jié)果例:分析結(jié)果 structstruct s s intint x; x; intint * *y; y; / /* * y: y: 結(jié)構(gòu)體中的成員是指向整型的指針結(jié)構(gòu)體中的成員是指向整型的指針 * */ /int

30、int data5=10, 20, 30, 40, 50; data5=10, 20, 30, 40, 50; structstruct s s array5 = 100,&data0, 200,&data1, array5 = 100,&data0, 200,&data1, 300,&data2, 400,&data3, 500,&data4 ; 300,&data2, 400,&data3, 500,&data4 ; / /* * array: array: 結(jié)構(gòu)體數(shù)組,初始化結(jié)構(gòu)體數(shù)組,初始化 * */ /

31、結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組arrayarray的每個元素有兩個成員,初始化后的狀態(tài)如的每個元素有兩個成員,初始化后的狀態(tài)如下下:1002003004005001020304050array0array1array2array3array4data0data1data2data3data49.2 使用結(jié)構(gòu)體數(shù)組使用結(jié)構(gòu)體數(shù)組第十一章 結(jié)構(gòu)體與共用體 + + arrayi.xarrayi.x + + * * arrayi.yarrayi.y array +i .x array +i .x * * + + arrayi.yarrayi.y1002003004005001020304050array0arr

32、ay1array2array3array4data0data1data2data3data41001011011i0 120030取取arrayiarrayi 的的x x的值,的值,x x加加1 1后輸出后輸出 101 101取取arrayiarrayi 的的y y所指的內(nèi)容加所指的內(nèi)容加1 1后輸出后輸出 i i先加先加1 1后取后取array1array1的成員的成員x x的值的值 200 200將將arrayiarrayi 的指針的指針y y先加先加1 1后再取后再取y y所所指的內(nèi)容輸出指的內(nèi)容輸出 30 309.2 使用結(jié)構(gòu)體數(shù)組使用結(jié)構(gòu)體數(shù)組第十一章 結(jié)構(gòu)體與共用體例:對候選人得票

33、的統(tǒng)計程序。設(shè)有例:對候選人得票的統(tǒng)計程序。設(shè)有3 3個候選人,每次輸入一個得個候選人,每次輸入一個得票的候選人的名字,要求最后輸出各人得票結(jié)果。票的候選人的名字,要求最后輸出各人得票結(jié)果。 #include #include structstruct person person char name20; char name20; intint count; count; leader3leader3=“Li”,0,”Zhang”,0,Fun”,0;=“Li”,0,”Zhang”,0,Fun”,0; main() main() intint i,ji,j; char leader_name20

34、; char leader_name20; for(ifor(i=1;i=10;i+)=1;i=10;i+) scanf(“%s”,leader_namescanf(“%s”,leader_name);); for(jfor(j=0;j3;j+)=0;j3;j+) if(strcmp(leader_name,if(strcmp(leader_name,)=0)=0) leaderj.countleaderj.count+; +; for(ifor(i=0;i3;i+)=0;i-”進行操作。進行操作。 v即:即:結(jié)構(gòu)體指針結(jié)構(gòu)體指針-成員名成員名

35、v“-”運算符優(yōu)先級是最高的運算符優(yōu)先級是最高的(1(1級級) ),從左至右結(jié)合,從左至右結(jié)合 v注:注:C C語言中優(yōu)先級為語言中優(yōu)先級為1 1的運算符有的運算符有4 4種:種: v( ) . - ( ) . - 通過結(jié)構(gòu)體指針通過結(jié)構(gòu)體指針pdatepdate訪問成員訪問成員yearyear的操作就可以寫成:的操作就可以寫成: pdatepdate-year = 1963; -year = 1963; 等價于:等價于:today.yeartoday.year = 1963; = 1963; ( (* * pdate).yearpdate).year = 1963; = 1963; 如果結(jié)構(gòu)

36、體指針如果結(jié)構(gòu)體指針p p指向一個結(jié)構(gòu)體數(shù)組,那么對指針指向一個結(jié)構(gòu)體數(shù)組,那么對指針p p的操作的操作等價于對數(shù)組下標的操作。等價于對數(shù)組下標的操作。9.3 結(jié)構(gòu)體指針結(jié)構(gòu)體指針第十一章 結(jié)構(gòu)體與共用體例:請分析程序的運算結(jié)果例:請分析程序的運算結(jié)果 structstruct s s intint x, x,* *y y; ; / /* * y: y:結(jié)構(gòu)體中的成員是指向整型的指針結(jié)構(gòu)體中的成員是指向整型的指針 * */ / * * p p; ;/ /* * p: p: 指向結(jié)構(gòu)體的指針指向結(jié)構(gòu)體的指針 * */ / intint data5=10, 20, 30, 40, 50,; dat

37、a5=10, 20, 30, 40, 50,;structstruct s array5= 100,&data0, 200,&data1, s array5= 100,&data0, 200,&data1, 300,&data2, 400,&data3, 500, &data4; 300,&data2, 400,&data3, 500, &data4; / /* * array: array: 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 * */ / main ( ) main ( ) p = array; / p = array; /

38、* * 指針指針p p指向結(jié)構(gòu)體數(shù)組的首地址指向結(jié)構(gòu)體數(shù)組的首地址 * */ / / /* *輸出輸出* */ / 9.3.1 指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針第十一章 結(jié)構(gòu)體與共用體結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 array array 的初始化后的狀態(tài)如下的初始化后的狀態(tài)如下:1002003004005001020304050array0array1array2array3array4data0data1data2data3data4p10010101 p-xp-x ( (* *p).xp).x * *p-yp-y * *( (* *p).yp).y +p-x +p-x取結(jié)構(gòu)體指針取結(jié)構(gòu)體指

39、針p p指向的結(jié)構(gòu)體成員指向的結(jié)構(gòu)體成員x x的值,輸出的值,輸出100100取結(jié)構(gòu)體指針取結(jié)構(gòu)體指針p p的內(nèi)容的成員的內(nèi)容的成員x x的值,輸出的值,輸出 100 100取結(jié)構(gòu)體指針取結(jié)構(gòu)體指針p p的指針成員的指針成員y y的內(nèi)容,輸出的內(nèi)容,輸出 10 10取指針取指針p p的內(nèi)容的指針成員的內(nèi)容的指針成員y y的內(nèi)容,輸出的內(nèi)容,輸出 10 10p p所指的所指的 x x 加加1 1,x x先加先加1 1后再輸出后再輸出 101 101。p p不加不加1 19.3.1 指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針第十一章 結(jié)構(gòu)體與共用體1012003004005001020304050a

40、rray0array1array2array3array4data0data1data2data3data4p200201202122 (+ (+p)-xp)-x p-x+ p-x+ p-x p-x +( +(* *p-y) p-y) + + * *p-yp-yp p先加先加1 1后再取后再取x x的值,的值,x x不加不加1 1,輸出,輸出 200 200先取先取x x的值,然后的值,然后x x再加再加1 1,輸出,輸出 200 200輸出輸出 201 201p p所指的所指的y y的內(nèi)容先加的內(nèi)容先加1 1,輸出,輸出2121。p p不加不加1 1,y y不加不加1 1同上,由運算的結(jié)合性

41、隱含了括號,輸出同上,由運算的結(jié)合性隱含了括號,輸出 22 229.3.1 指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針第十一章 結(jié)構(gòu)體與共用體 * * + + p-y p-y p-x p-x * *(+p)-y (+p)-y p-x p-x * * p-y + p-y + p-x p-x1012013004005001022304050array0array1array2array3array4data0data1data2data3data4p30201300p p所指的所指的y y先加先加1 1后再取后再取y y的內(nèi)容,輸出的內(nèi)容,輸出 30 30,p p不不加加1 1,y y的內(nèi)容不加的內(nèi)

42、容不加1 1輸出輸出 201 201p p先加先加1 1后再取所指后再取所指y y的內(nèi)容,輸出的內(nèi)容,輸出 30 30輸出輸出 300 300取取p p所指的所指的y y的內(nèi)容,輸出的內(nèi)容,輸出3030,然后,然后p p所指的所指的y y加加1 1輸出輸出 300 3009.3.1 指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針第十一章 結(jié)構(gòu)體與共用體例例: :可用結(jié)構(gòu)體表示學生的學號和成績,編寫程序,可用結(jié)構(gòu)體表示學生的學號和成績,編寫程序,對班中對班中3030名學生按成績進行排序,并輸出排序后的學名學生按成績進行排序,并輸出排序后的學號、成績和全班平均分。號、成績和全班平均分。 structst

43、ruct stuinfstuinf intint stidstid; ;/ /* * 學生學號學生學號 * */ / intint score; score;/ /* * 學生成績學生成績 * */ / stustu STNUM ; STNUM ; / /* * stustu: : 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 * */ / structstruct stuinfstuinf * *pSTNUMpSTNUM; ; / /* * p p: :由指向結(jié)構(gòu)體的指針構(gòu)成的指針數(shù)組由指向結(jié)構(gòu)體的指針構(gòu)成的指針數(shù)組* */ /9.3.1 指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針第十一章 結(jié)構(gòu)體與共用體若是若是5個

44、學生的數(shù)據(jù),則在完成初始化操作后,數(shù)組的關(guān)系如下:個學生的數(shù)據(jù),則在完成初始化操作后,數(shù)組的關(guān)系如下:stu數(shù)組數(shù)組01020304059095857392p數(shù)組數(shù)組p0p1p2p3p4 算法分析:算法分析: 程序中使用結(jié)構(gòu)體數(shù)組程序中使用結(jié)構(gòu)體數(shù)組stu,指針數(shù)組指針數(shù)組p; 程序在結(jié)構(gòu)體數(shù)組和指針數(shù)組之間建立指針關(guān)系。程序在結(jié)構(gòu)體數(shù)組和指針數(shù)組之間建立指針關(guān)系。 程序中只用對指針數(shù)組進行排序,就可以實現(xiàn)對指向的成程序中只用對指針數(shù)組進行排序,就可以實現(xiàn)對指向的成績的排序(績的排序(選擇排序選擇排序)。)。stu數(shù)組數(shù)組01020304059095857392p數(shù)組數(shù)組p0p1p2p3p49

45、.3.1 指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針第十一章 結(jié)構(gòu)體與共用體# #define STNUM 5 define STNUM 5 . . main ( ) main ( ) structstruct stuinfstuinf * * ptempptemp, , * * pSTNUMpSTNUM; ; intint i, j, k, sum=0; i, j, k, sum=0; for ( i=0; i=STNUM-1; i+ ) for ( i=0; i=STNUM-1; i+ ) scanfscanf (% (%d%dd%d, &, &stui.stid,&

46、stui.scorestui.stid,&stui.score); ); pipi=&=&stuistui; ; sum += sum += stui.scorestui.score; ; for ( i =0; i = STNUM-2; i+ ) for ( i =0; i = STNUM-2; i+ ) k = i; k = i; for ( j = i; j = STNUM-1; j+ ) for ( j = i; j score score score ) k=j; -score ) k=j; if ( k != i ) if ( k != i ) ptempp

47、temp = = pipi; ; pipi = = pkpk; ; pkpk = = ptempptemp; ; for (i=0; i=STNUM-1; i+) for (i=0; iscore); -score); printfprintf (average score = % (average score = %dndn, sum/STNUM); , sum/STNUM); 9.3.1 指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針第十一章 結(jié)構(gòu)體與共用體l將一個將一個結(jié)構(gòu)體結(jié)構(gòu)體變量的值傳遞給另一個變量的值傳遞給另一個函數(shù)函數(shù),有,有3 3個方法個方法:用用結(jié)構(gòu)體結(jié)構(gòu)體變量變量的成員的成員作

48、參數(shù)作參數(shù); 用法和用普通變量作實參是一樣的,屬于用法和用普通變量作實參是一樣的,屬于“值傳遞值傳遞”方式方式 用用結(jié)構(gòu)體結(jié)構(gòu)體變量作實參變量作實參; 采取的是采取的是“值傳遞值傳遞”的方式;的方式; 在函數(shù)調(diào)用期間形參也要占用內(nèi)存單元;在函數(shù)調(diào)用期間形參也要占用內(nèi)存單元; 這種傳遞方式在空間和時間上開銷較大;這種傳遞方式在空間和時間上開銷較大; 一般較少用這種方法一般較少用這種方法用指向用指向結(jié)構(gòu)體結(jié)構(gòu)體變量(或數(shù)組)變量(或數(shù)組)的指針的指針作實參,將結(jié)構(gòu)體變作實參,將結(jié)構(gòu)體變量(或數(shù)組)的地址傳給形參量(或數(shù)組)的地址傳給形參。例:(見書例:(見書P306P306P307P307) 9.

49、3.3 用結(jié)構(gòu)體變量和結(jié)構(gòu)體變量的指針作函數(shù)參數(shù)用結(jié)構(gòu)體變量和結(jié)構(gòu)體變量的指針作函數(shù)參數(shù)第十一章 結(jié)構(gòu)體與共用體鏈表鏈表概述概述v鏈表是一種最簡單、最常見的動態(tài)數(shù)據(jù)結(jié)構(gòu)體鏈表是一種最簡單、最常見的動態(tài)數(shù)據(jù)結(jié)構(gòu)體, 它通過指針(鏈)將一組它通過指針(鏈)將一組結(jié)點結(jié)點連接在一起。連接在一起。 v結(jié)點的定義結(jié)點的定義 結(jié)點結(jié)點包括兩部分:包括兩部分:信息部分信息部分和和鏈接結(jié)點的指針鏈接結(jié)點的指針 v例如:使用結(jié)點描述一個學生的信息(姓名)例如:使用結(jié)點描述一個學生的信息(姓名) structstruct student student char char name20 ; / name20 ;

50、/* * 信息信息 * */ / structstruct student student * *next ; /next ; /* * 指針指針 * */ / ; ;/ /* * 遞歸定義遞歸定義 * */ /9.4 用指針處理鏈表用指針處理鏈表第十一章 結(jié)構(gòu)體與共用體鏈表組成鏈表組成 指向鏈表表頭結(jié)點的指針指向鏈表表頭結(jié)點的指針( (表頭指針,也稱為頭指針表頭指針,也稱為頭指針) ) 表結(jié)點(數(shù)據(jù)結(jié)點,也稱為結(jié)點,保存數(shù)據(jù)信息)表結(jié)點(數(shù)據(jù)結(jié)點,也稱為結(jié)點,保存數(shù)據(jù)信息)表表尾尾結(jié)點(鏈表的結(jié)點(鏈表的最后最后一個結(jié)點,一個結(jié)點,指針部分為空指針部分為空) 鏈表的圖示表示鏈表的圖示表示NU

51、LL頭指針頭指針數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點9.4 用指針處理鏈表用指針處理鏈表第十一章 結(jié)構(gòu)體與共用體下圖為一最簡單鏈表的示意圖。下圖為一最簡單鏈表的示意圖。對鏈表的主要操作有以下幾種:對鏈表的主要操作有以下幾種: 1. 建立鏈表;建立鏈表; 2. 結(jié)點的查找與輸出;結(jié)點的查找與輸出; 3. 插入一個結(jié)點;插入一個結(jié)點; 4. 刪除一個結(jié)點;刪除一個結(jié)點;9.4 用指針處理鏈表用指針處理鏈表第十一章 結(jié)構(gòu)體與共用體 # #define NULL 0define NULL 0 #define LEN #define LEN sizeof(st

52、ructsizeof(struct stustu) ) structstruct stustu intint numnum,ageage; ; structstruct stustu * *next;next; ; ; structstruct stustu * *creat(intcreat(int n) n) structstruct stustu * *head,head,* *p1,p1,* *p2; p2; intint i; i; for(ifor(i=1;i=1;inum,&p1-age); scanf(%d%d,&p1-num,&p1-age); if(

53、iif(i=1) head=p1;=1) head=p1; else p2-next=p1; else p2-next=p1; p1-next=NULL; p2=p1; p1-next=NULL; p2=p1; return(headreturn(head);); 9.4.3 建立動態(tài)鏈表建立動態(tài)鏈表算法的思路:算法的思路:1 1、讓、讓P1P1指向新開的指向新開的結(jié)點;結(jié)點;2 2、p2p2指向鏈表中最指向鏈表中最后一個結(jié)點;后一個結(jié)點;3 3、把、把p1p1所指的結(jié)點所指的結(jié)點連接在連接在p2p2所指的結(jié)所指的結(jié)點后面點后面第十一章 結(jié)構(gòu)體與共用體訪問鏈表中全部數(shù)據(jù)結(jié)點訪問鏈表中全部數(shù)據(jù)結(jié)

54、點void void print(print(structstruct stustu * * head ) head ) structstruct stustu * *p; p; p = head; / p = head; /* * p p指向第一個數(shù)據(jù)結(jié)點指向第一個數(shù)據(jù)結(jié)點 * */ / while( p!=NULL ) while( p!=NULL ) print printf(%5d%5d,p-f(%5d%5d,p-num,pnum,p-age);-age); p = p-next ; p = p-next ; / /* * p p 指向下一個數(shù)據(jù)結(jié)點指向下一個數(shù)據(jù)結(jié)點 * */ / 9

55、.4.4 輸出輸出鏈表鏈表第十一章 結(jié)構(gòu)體與共用體在鏈表中刪除在鏈表中刪除指定指定結(jié)點(結(jié)點(基本原理基本原理)定位定位指針指針 p1 p1 指向指向要要刪除的結(jié)點刪除的結(jié)點,指針指針 p2 p2 指向指向p1p1的前的前一個一個結(jié)點結(jié)點;分離分離 p p2 2-link = p1-link ;-link = p1-link ;釋放釋放 p1 p1 結(jié)點結(jié)點 free(p1)free(p1)headD4D3D2D1D0數(shù)據(jù)數(shù)據(jù)結(jié)點結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點p2p1x第十一章 結(jié)構(gòu)體與共用體在鏈表中刪除在鏈表中刪除指定指定結(jié)點結(jié)點的函數(shù)的函數(shù)struct

56、struct stustu * *del(del(structstruct stustu * *head , head , intint num) num) structstruct stustu * *p1p1,* *p2; p2; p1 = head; p1 = head; while(numwhile(num!=p1-num & p1-next!=NULL) !=p1-num & p1-next!=NULL) p2=p1; p1 = p2=p1; p1 = p1p1-next; -next; / /* * 定位定位 * */ / if( num=p1-num) if( n

57、um=p1-num) if(p1=head) head=p1-next; if(p1=head) head=p1-next; else p2-next = p1-next; else p2-next = p1-next; / /* * 分離分離 * */ / printf(“delete:%dn”,numprintf(“delete:%dn”,num);); free(p1); / free(p1); /* * 釋放釋放 * */ / else else printf(“%dprintf(“%d not been found! not been found!n”,numn”,num);); r

58、eturn(headreturn(head);); 第十一章 結(jié)構(gòu)體與共用體在在有序有序鏈表鏈表中中插入新結(jié)點(基本原理)插入新結(jié)點(基本原理) 定位定位指針指針 p0 p0 指向需要指向需要插入插入的結(jié)點的結(jié)點,指針指針 p1 p1 指向指向 p0 p0 的的前一前一個結(jié)點,指針個結(jié)點,指針 p2 p2 指向指向 p0 p0 的后一的后一個結(jié)點個結(jié)點;鏈接后面指針鏈接后面指針 p0-next = p1 ; p0-next = p1 ; 鏈接前面指針鏈接前面指針 p2-next = p0 ;p2-next = p0 ;headD3D2D1D0數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)結(jié)點數(shù)據(jù)

59、結(jié)點數(shù)據(jù)結(jié)點p0p2xp1第十一章 結(jié)構(gòu)體與共用體在在有序有序鏈表鏈表中中插入新結(jié)點插入新結(jié)點的函數(shù)的函數(shù) structstruct stustu insert(structinsert(struct stustu * *head,structhead,struct stustu * *stud)stud) structstruct stustu * *p0,p0,* *p1,p1,* *p2;p2; p1=head; p0=stud; p1=head; p0=stud; if(headif(head=NULL) head=p0; p0-next=NULL; =NULL) head=p0; p

60、0-next=NULL; else else while( p0-num p1-num )&( p1-next!=NULL ) while( p0-num p1-num )&( p1-next!=NULL ) p2=p1; p1= p2=p1; p1=p1p1-next; -next; if( p0-num num ) if( p0-num num ) if(headif(head=p1) head=p0; else p2-next=p0;=p1) head=p0; else p2-next=p0; p0-next=p1; p0-next=p1; else p1-next=p0; p0-next=NULL; else p1-next=p0; p0-next=NULL; n=n+1; n=n+1; return(headreturn(head);); 第十一章 結(jié)構(gòu)體與共用體共用體與結(jié)構(gòu)體的異同共用體與結(jié)構(gòu)體的異同v共用體與結(jié)構(gòu)體都是由多個成員分量組成的一個整體;共用體

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論