C語(yǔ)言程序設(shè)計(jì)教程修訂本 結(jié)構(gòu)體與聯(lián)合體PPT學(xué)習(xí)教案_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程修訂本 結(jié)構(gòu)體與聯(lián)合體PPT學(xué)習(xí)教案_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程修訂本 結(jié)構(gòu)體與聯(lián)合體PPT學(xué)習(xí)教案_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程修訂本 結(jié)構(gòu)體與聯(lián)合體PPT學(xué)習(xí)教案_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程修訂本 結(jié)構(gòu)體與聯(lián)合體PPT學(xué)習(xí)教案_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、會(huì)計(jì)學(xué)1C語(yǔ)言程序設(shè)計(jì)教程修訂本語(yǔ)言程序設(shè)計(jì)教程修訂本 結(jié)構(gòu)體與聯(lián)結(jié)構(gòu)體與聯(lián)合體合體8.1 程序與程序文件程序與程序文件8.1.1 結(jié)構(gòu)體類型變量的定義結(jié)構(gòu)體類型變量的定義 定義結(jié)構(gòu)類型變量包括兩個(gè)方面:首先要定義結(jié)構(gòu)體類型,以便確定該類型中有哪些成員,各成員屬于什么數(shù)據(jù)類型;然后再定義屬于該結(jié)構(gòu)體類型的變量。定義結(jié)構(gòu)類型變量包括兩個(gè)方面:首先要定義結(jié)構(gòu)體類型,以便確定該類型中有哪些成員,各成員屬于什么數(shù)據(jù)類型;然后再定義屬于該結(jié)構(gòu)體類型的變量。第2頁(yè)/共45頁(yè)第1頁(yè)/共45頁(yè)1定義結(jié)構(gòu)體類型定義結(jié)構(gòu)體類型 定義結(jié)構(gòu)體類型的一般形式如下:定義結(jié)構(gòu)體類型的一般形式如下: struct 結(jié)構(gòu)體類型

2、名結(jié)構(gòu)體類型名 成員表成員表; 其中在其中在“成員表成員表”中定義了該類型中有哪些成員,各成員屬于什么數(shù)據(jù)類型。中定義了該類型中有哪些成員,各成員屬于什么數(shù)據(jù)類型。第3頁(yè)/共45頁(yè)第2頁(yè)/共45頁(yè)2定義結(jié)構(gòu)體類型變量定義結(jié)構(gòu)體類型變量 定義結(jié)構(gòu)體類型變量的一般形式為定義結(jié)構(gòu)體類型變量的一般形式為 struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 變量表;變量表; 定義結(jié)構(gòu)體類型與定義結(jié)構(gòu)體類型變量是分開(kāi)說(shuō)明的。定義結(jié)構(gòu)體類型與定義結(jié)構(gòu)體類型變量是分開(kāi)說(shuō)明的。C語(yǔ)言還允許在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體類型變量。其形式為語(yǔ)言還允許在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體類型變量。其形式為 struct 結(jié)構(gòu)體類型

3、名結(jié)構(gòu)體類型名 成員表成員表 變量表;變量表;第3頁(yè)/共45頁(yè) 如果在函數(shù)體外定義了一個(gè)結(jié)構(gòu)體類型,則從定義位置開(kāi)始到整個(gè)程序文件結(jié)束之間的所有函數(shù)中均可定義該類型的變量;但在函數(shù)體內(nèi)所定義的結(jié)構(gòu)體類型,只能在該函數(shù)體內(nèi)能定義該類型的變量。即結(jié)構(gòu)體類型的定義與普通變量定義的作用域是相同的。如果在函數(shù)體外定義了一個(gè)結(jié)構(gòu)體類型,則從定義位置開(kāi)始到整個(gè)程序文件結(jié)束之間的所有函數(shù)中均可定義該類型的變量;但在函數(shù)體內(nèi)所定義的結(jié)構(gòu)體類型,只能在該函數(shù)體內(nèi)能定義該類型的變量。即結(jié)構(gòu)體類型的定義與普通變量定義的作用域是相同的。第4頁(yè)/共45頁(yè)88.11.2 2 結(jié)構(gòu)體類型變量的引用結(jié)構(gòu)體類型變量的引用 在程序

4、中定義了某結(jié)構(gòu)體類型的變量后就可以被引用。在程序中定義了某結(jié)構(gòu)體類型的變量后就可以被引用。 結(jié)構(gòu)體變量的一般引用方式如下:結(jié)構(gòu)體變量的一般引用方式如下:結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員名成員名其中其中“.”為結(jié)構(gòu)體成員運(yùn)算符,它的優(yōu)先級(jí)最高。為結(jié)構(gòu)體成員運(yùn)算符,它的優(yōu)先級(jí)最高。第5頁(yè)/共45頁(yè)88.11.3 3 結(jié)構(gòu)體的嵌套結(jié)構(gòu)體的嵌套C C語(yǔ)言規(guī)定,結(jié)構(gòu)體類型的定義可以嵌套。語(yǔ)言規(guī)定,結(jié)構(gòu)體類型的定義可以嵌套。 第6頁(yè)/共45頁(yè)88.11.4 4 結(jié)構(gòu)體類型變量的初始化結(jié)構(gòu)體類型變量的初始化 與普通變量一樣,在定義結(jié)構(gòu)體類型變量的同時(shí)也可以對(duì)結(jié)構(gòu)體類型變量賦初值。但與普通變量一樣,在定義結(jié)構(gòu)體

5、類型變量的同時(shí)也可以對(duì)結(jié)構(gòu)體類型變量賦初值。但C語(yǔ)言規(guī)定,只能對(duì)全局的或靜態(tài)的局部結(jié)構(gòu)體類型變量進(jìn)行初始化。為了將結(jié)構(gòu)體類型變量定義為靜態(tài)存儲(chǔ)類型,在定義時(shí)應(yīng)加上語(yǔ)言規(guī)定,只能對(duì)全局的或靜態(tài)的局部結(jié)構(gòu)體類型變量進(jìn)行初始化。為了將結(jié)構(gòu)體類型變量定義為靜態(tài)存儲(chǔ)類型,在定義時(shí)應(yīng)加上static關(guān)鍵字。但是,目前在大部分計(jì)算機(jī)系統(tǒng)中,對(duì)結(jié)構(gòu)體類型變量初始化時(shí)不必加關(guān)鍵字。但是,目前在大部分計(jì)算機(jī)系統(tǒng)中,對(duì)結(jié)構(gòu)體類型變量初始化時(shí)不必加static關(guān)鍵字,其原理與普通數(shù)組的初始化一樣。關(guān)鍵字,其原理與普通數(shù)組的初始化一樣。第7頁(yè)/共45頁(yè)88.11.5 結(jié)構(gòu)體與函數(shù)結(jié)構(gòu)體與函數(shù)1結(jié)構(gòu)體類型變量的成員作為函

6、數(shù)參數(shù)結(jié)構(gòu)體類型變量的成員作為函數(shù)參數(shù) 與數(shù)組元素可以作為函數(shù)參數(shù)一樣,結(jié)構(gòu)體類型變量中的成員也可以作為函數(shù)參數(shù)。在這種情況下,在被調(diào)用函數(shù)中的形參是一般變量,而調(diào)用函數(shù)中的實(shí)參是結(jié)構(gòu)體類型變量中的一個(gè)成員,但要求它們的類型應(yīng)一致。與數(shù)組元素可以作為函數(shù)參數(shù)一樣,結(jié)構(gòu)體類型變量中的成員也可以作為函數(shù)參數(shù)。在這種情況下,在被調(diào)用函數(shù)中的形參是一般變量,而調(diào)用函數(shù)中的實(shí)參是結(jié)構(gòu)體類型變量中的一個(gè)成員,但要求它們的類型應(yīng)一致。第8頁(yè)/共45頁(yè)2結(jié)構(gòu)體類型變量作為函數(shù)參數(shù)結(jié)構(gòu)體類型變量作為函數(shù)參數(shù) 與一般變量可以作為函數(shù)參數(shù)一樣,結(jié)構(gòu)體類型的變量也可以作為函數(shù)參數(shù)。在這種情況下,在被調(diào)用函數(shù)中的形參是

7、結(jié)構(gòu)體類型的變量,調(diào)用函數(shù)中的實(shí)參也是結(jié)構(gòu)體類型的變量,但要求它們屬于同一個(gè)結(jié)構(gòu)體類型。與一般變量可以作為函數(shù)參數(shù)一樣,結(jié)構(gòu)體類型的變量也可以作為函數(shù)參數(shù)。在這種情況下,在被調(diào)用函數(shù)中的形參是結(jié)構(gòu)體類型的變量,調(diào)用函數(shù)中的實(shí)參也是結(jié)構(gòu)體類型的變量,但要求它們屬于同一個(gè)結(jié)構(gòu)體類型。第9頁(yè)/共45頁(yè)3結(jié)構(gòu)體類型的函數(shù)結(jié)構(gòu)體類型的函數(shù) 與定義標(biāo)準(zhǔn)數(shù)據(jù)類型函數(shù)一樣,與定義標(biāo)準(zhǔn)數(shù)據(jù)類型函數(shù)一樣,C語(yǔ)言也允許定義結(jié)構(gòu)體類型的函數(shù)。結(jié)構(gòu)體類型函數(shù)的返回值是結(jié)構(gòu)體類型的數(shù)據(jù)。語(yǔ)言也允許定義結(jié)構(gòu)體類型的函數(shù)。結(jié)構(gòu)體類型函數(shù)的返回值是結(jié)構(gòu)體類型的數(shù)據(jù)。第10頁(yè)/共45頁(yè)8.2 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組88.22.1

8、1 結(jié)構(gòu)體數(shù)組的定義與引用結(jié)構(gòu)體數(shù)組的定義與引用 與整型數(shù)組、實(shí)型數(shù)組、字符型數(shù)組一樣,在程序中也可以定義結(jié)構(gòu)體類型的數(shù)組。但與整型數(shù)組、實(shí)型數(shù)組、字符型數(shù)組一樣,在程序中也可以定義結(jié)構(gòu)體類型的數(shù)組。但C語(yǔ)言規(guī)定,同一個(gè)結(jié)構(gòu)體數(shù)組中的元素應(yīng)為同一種結(jié)構(gòu)體類型。語(yǔ)言規(guī)定,同一個(gè)結(jié)構(gòu)體數(shù)組中的元素應(yīng)為同一種結(jié)構(gòu)體類型。第11頁(yè)/共45頁(yè)例如,例如,struct student int num; char name10; char sex; int age; float score3; stu10; 定義了定義了“學(xué)生情況學(xué)生情況”型的一個(gè)數(shù)組型的一個(gè)數(shù)組stu,可存放,可存放10個(gè)學(xué)生的情況。每一

9、個(gè)學(xué)生的情況包括:學(xué)號(hào)個(gè)學(xué)生的情況。每一個(gè)學(xué)生的情況包括:學(xué)號(hào)(num)、姓名、姓名(name10)、性別、性別(sex)、年齡、年齡(age)、3個(gè)成績(jī)個(gè)成績(jī)(score3)。實(shí)際上,定義了該數(shù)組后,相當(dāng)于開(kāi)辟了一個(gè)如表。實(shí)際上,定義了該數(shù)組后,相當(dāng)于開(kāi)辟了一個(gè)如表8.1所示的表格空間。所示的表格空間。第12頁(yè)/共45頁(yè)表8.1學(xué)生情況型的數(shù)組表格空間num學(xué) 號(hào)name姓 名sex性 別age年 齡score0成績(jī)1score1成績(jī)2score2成績(jī)3 第13頁(yè)/共45頁(yè)88.22.2 2 結(jié)構(gòu)體數(shù)組作為函數(shù)參數(shù)結(jié)構(gòu)體數(shù)組作為函數(shù)參數(shù) 與普通數(shù)組一樣,結(jié)構(gòu)體類型數(shù)組也能作為函數(shù)參數(shù),并且形

10、參與實(shí)參結(jié)合的方式完全一樣。如果在被調(diào)用函數(shù)中改變了結(jié)構(gòu)體類型形參數(shù)組元素中各成員值,實(shí)際上也就改變了結(jié)構(gòu)體類型實(shí)參數(shù)組元素中的各成員值。因?yàn)榻Y(jié)構(gòu)體類型形參數(shù)組與結(jié)構(gòu)體類型實(shí)參數(shù)組是同一個(gè)存儲(chǔ)空間。與普通數(shù)組一樣,結(jié)構(gòu)體類型數(shù)組也能作為函數(shù)參數(shù),并且形參與實(shí)參結(jié)合的方式完全一樣。如果在被調(diào)用函數(shù)中改變了結(jié)構(gòu)體類型形參數(shù)組元素中各成員值,實(shí)際上也就改變了結(jié)構(gòu)體類型實(shí)參數(shù)組元素中的各成員值。因?yàn)榻Y(jié)構(gòu)體類型形參數(shù)組與結(jié)構(gòu)體類型實(shí)參數(shù)組是同一個(gè)存儲(chǔ)空間。第14頁(yè)/共45頁(yè)8.3 結(jié)構(gòu)體與指針結(jié)構(gòu)體與指針88.33.1 1 結(jié)構(gòu)體類型指針變量的定義與引用結(jié)構(gòu)體類型指針變量的定義與引用 結(jié)構(gòu)體類型的指針變

11、量指向結(jié)構(gòu)體類型變量或數(shù)組結(jié)構(gòu)體類型的指針變量指向結(jié)構(gòu)體類型變量或數(shù)組(或數(shù)組元素或數(shù)組元素)的起始地址。的起始地址。例如,例如,struct student int num; char name10; char sex; int age; float score; ;struct student st1, st2, st10, *p; 其中定義了一個(gè)指向結(jié)構(gòu)體其中定義了一個(gè)指向結(jié)構(gòu)體“學(xué)生情況學(xué)生情況”型的指針型的指針p。第15頁(yè)/共45頁(yè) 由上所述,當(dāng)結(jié)構(gòu)體類型的指針變量由上所述,當(dāng)結(jié)構(gòu)體類型的指針變量p指向一個(gè)結(jié)構(gòu)體類型變量后,下列指向一個(gè)結(jié)構(gòu)體類型變量后,下列3種表示是等價(jià)的:種表示是

12、等價(jià)的: 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員成員 (*p).成員成員 p成員成員 它們都表示結(jié)構(gòu)體變量中的一個(gè)成員。它們都表示結(jié)構(gòu)體變量中的一個(gè)成員。第16頁(yè)/共45頁(yè)88.33.2 2 結(jié)構(gòu)體類型指針作為函數(shù)參數(shù)結(jié)構(gòu)體類型指針作為函數(shù)參數(shù) 結(jié)構(gòu)體類型指針可以指向結(jié)構(gòu)體類型的變量,因此,當(dāng)形參是結(jié)構(gòu)體類型指針變量時(shí),實(shí)參也可以是結(jié)構(gòu)體類型指針(即地址)。在結(jié)構(gòu)體類型指針作為函數(shù)參數(shù)的情況下,由于傳送的是地址,因此,如果在被調(diào)用函數(shù)中改變了結(jié)構(gòu)體類型形參指針?biāo)赶虻牡刂分械闹?,?shí)際上也就改變了結(jié)構(gòu)體類型實(shí)參指針?biāo)赶虻牡刂分械闹怠=Y(jié)構(gòu)體類型指針可以指向結(jié)構(gòu)體類型的變量,因此,當(dāng)形參是結(jié)構(gòu)體類型指針變

13、量時(shí),實(shí)參也可以是結(jié)構(gòu)體類型指針(即地址)。在結(jié)構(gòu)體類型指針作為函數(shù)參數(shù)的情況下,由于傳送的是地址,因此,如果在被調(diào)用函數(shù)中改變了結(jié)構(gòu)體類型形參指針?biāo)赶虻牡刂分械闹?,?shí)際上也就改變了結(jié)構(gòu)體類型實(shí)參指針?biāo)赶虻牡刂分械闹怠?第17頁(yè)/共45頁(yè)例例8.7 用結(jié)構(gòu)體類型指針作為函數(shù)參數(shù)。用結(jié)構(gòu)體類型指針作為函數(shù)參數(shù)。 在下面的程序中,主函數(shù)的功能是定義了一個(gè)結(jié)構(gòu)體在下面的程序中,主函數(shù)的功能是定義了一個(gè)結(jié)構(gòu)體student型的變量型的變量st,同時(shí)為之初始化,然后輸出變量,同時(shí)為之初始化,然后輸出變量st中各成員的值,將結(jié)構(gòu)體類型變量中各成員的值,將結(jié)構(gòu)體類型變量st的地址(即的地址(即&st)作

14、為實(shí)參調(diào)用函數(shù))作為實(shí)參調(diào)用函數(shù)chang()后再輸出變量后再輸出變量st中各成員的值;函數(shù)中各成員的值;函數(shù)chang()的功能是修改結(jié)構(gòu)體類型形參指針的功能是修改結(jié)構(gòu)體類型形參指針t所指向的結(jié)構(gòu)體類型數(shù)據(jù)中成員所指向的結(jié)構(gòu)體類型數(shù)據(jù)中成員tscore的值,并輸出修改前后結(jié)構(gòu)體類型指針?biāo)赶虻臄?shù)據(jù)中各成員的值。的值,并輸出修改前后結(jié)構(gòu)體類型指針?biāo)赶虻臄?shù)據(jù)中各成員的值。第18頁(yè)/共45頁(yè)#include stdio.hstruct student int num; char name10; char sex; int age; float score; ; void chang(t) str

15、uct student *t; printf(t%6d%8s%3c%4d%7.2fn, tnum,tname,tsex,tage,tscore); tscore95.0; printf(t%6d%8s%3c%4d%7.2fn, tnum,tname,tsex,tage,tscore); 第19頁(yè)/共45頁(yè)main() static struct student st101,Zhang,M,19,89.0; printf(st%6d%8s%3c%4d%7.2fn, st.num,,st.sex,st.age,st.score); chang(&st); printf(st%6d%8

16、s%3c%4d%7.2fn, st.num,,st.sex,st.age,st.score);第20頁(yè)/共45頁(yè) 結(jié)構(gòu)體類型指針也可以指向數(shù)組或數(shù)組元素,因此,當(dāng)形參是結(jié)構(gòu)體類型指針變量時(shí),實(shí)參也可以是結(jié)構(gòu)體類型數(shù)組名或數(shù)組元素的地址。結(jié)構(gòu)體類型指針也可以指向數(shù)組或數(shù)組元素,因此,當(dāng)形參是結(jié)構(gòu)體類型指針變量時(shí),實(shí)參也可以是結(jié)構(gòu)體類型數(shù)組名或數(shù)組元素的地址。 與標(biāo)準(zhǔn)數(shù)據(jù)類型的數(shù)組與指針一樣,在結(jié)構(gòu)體類型數(shù)組指針作函數(shù)參數(shù)時(shí),也可以有以下與標(biāo)準(zhǔn)數(shù)據(jù)類型的數(shù)組與指針一樣,在結(jié)構(gòu)體類型數(shù)組指針作函數(shù)參數(shù)時(shí),也可以有以下4種情況:種情況:(1)實(shí)參與形參都用結(jié)構(gòu)體類型數(shù)組名;)實(shí)參與形參都

17、用結(jié)構(gòu)體類型數(shù)組名;(2)實(shí)參用結(jié)構(gòu)體類型數(shù)組名,形參用結(jié)構(gòu)體類型指針變量;)實(shí)參用結(jié)構(gòu)體類型數(shù)組名,形參用結(jié)構(gòu)體類型指針變量;(3)實(shí)參與形參都用結(jié)構(gòu)體類型指針變量;)實(shí)參與形參都用結(jié)構(gòu)體類型指針變量;(4)實(shí)參用結(jié)構(gòu)體類型指針變量,形參用結(jié)構(gòu)體類型數(shù)組名。)實(shí)參用結(jié)構(gòu)體類型指針變量,形參用結(jié)構(gòu)體類型數(shù)組名。第21頁(yè)/共45頁(yè)8.4 鏈鏈 表表88.44.1 1 鏈表的基本概念鏈表的基本概念1鏈表的一般結(jié)構(gòu)鏈表的一般結(jié)構(gòu) 鏈表由結(jié)點(diǎn)元素組成。為了適應(yīng)鏈表的存儲(chǔ)結(jié)構(gòu),計(jì)算機(jī)存儲(chǔ)空間被劃分為一個(gè)一個(gè)小塊,每一小塊占若干字節(jié),通常稱這些小塊為存儲(chǔ)結(jié)點(diǎn)。鏈表由結(jié)點(diǎn)元素組成。為了適應(yīng)鏈表的存儲(chǔ)結(jié)構(gòu),計(jì)

18、算機(jī)存儲(chǔ)空間被劃分為一個(gè)一個(gè)小塊,每一小塊占若干字節(jié),通常稱這些小塊為存儲(chǔ)結(jié)點(diǎn)。 將存儲(chǔ)空間中的每一個(gè)存儲(chǔ)結(jié)點(diǎn)分為兩部分:一部分用于存儲(chǔ)數(shù)據(jù)元素的值,稱為數(shù)據(jù)域;另一部分用于存放下一個(gè)數(shù)據(jù)元素的存儲(chǔ)序號(hào)(即存儲(chǔ)結(jié)點(diǎn)的地址),稱為指針域。將存儲(chǔ)空間中的每一個(gè)存儲(chǔ)結(jié)點(diǎn)分為兩部分:一部分用于存儲(chǔ)數(shù)據(jù)元素的值,稱為數(shù)據(jù)域;另一部分用于存放下一個(gè)數(shù)據(jù)元素的存儲(chǔ)序號(hào)(即存儲(chǔ)結(jié)點(diǎn)的地址),稱為指針域。第22頁(yè)/共45頁(yè) 數(shù)據(jù)域 指針域 存放數(shù)據(jù)元素 存放下一個(gè)結(jié)點(diǎn)元素的地址 每一個(gè)結(jié)點(diǎn)的結(jié)構(gòu)如圖每一個(gè)結(jié)點(diǎn)的結(jié)構(gòu)如圖8.1所示。所示。圖8.1 鏈表的結(jié)點(diǎn)結(jié)構(gòu)第23頁(yè)/共45頁(yè) 在鏈表中,用一個(gè)專門的指針在鏈表

19、中,用一個(gè)專門的指針HEAD指向鏈表中第一個(gè)數(shù)據(jù)元素的結(jié)點(diǎn)(即存放第一個(gè)數(shù)據(jù)元素的存儲(chǔ)結(jié)點(diǎn)的序號(hào))。鏈表中最后一個(gè)元素后面已沒(méi)有結(jié)點(diǎn)元素,因此,鏈表中最后一個(gè)結(jié)點(diǎn)的指針域?yàn)榭眨ㄓ弥赶蜴湵碇械谝粋€(gè)數(shù)據(jù)元素的結(jié)點(diǎn)(即存放第一個(gè)數(shù)據(jù)元素的存儲(chǔ)結(jié)點(diǎn)的序號(hào))。鏈表中最后一個(gè)元素后面已沒(méi)有結(jié)點(diǎn)元素,因此,鏈表中最后一個(gè)結(jié)點(diǎn)的指針域?yàn)榭眨ㄓ肗ULL或或0表示),表示鏈表終止。鏈表的邏輯結(jié)構(gòu)如圖表示),表示鏈表終止。鏈表的邏輯結(jié)構(gòu)如圖8.2所示。所示。 數(shù)據(jù) 1 HEAD 數(shù)據(jù) 2 數(shù)據(jù) n NULL 圖8.2 鏈表的邏輯結(jié)構(gòu)第24頁(yè)/共45頁(yè)2結(jié)點(diǎn)結(jié)構(gòu)體類型的定義結(jié)點(diǎn)結(jié)構(gòu)體類型的定義 在在C語(yǔ)言中,定義鏈表

20、結(jié)點(diǎn)結(jié)構(gòu)的一般形式如下:語(yǔ)言中,定義鏈表結(jié)點(diǎn)結(jié)構(gòu)的一般形式如下: struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 數(shù)據(jù)成員表;數(shù)據(jù)成員表; struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 *指針變量名;指針變量名; ;第25頁(yè)/共45頁(yè)3結(jié)點(diǎn)的動(dòng)態(tài)分配結(jié)點(diǎn)的動(dòng)態(tài)分配 在在C語(yǔ)言中,可以利用語(yǔ)言中,可以利用 malloc 函數(shù)向系統(tǒng)申請(qǐng)分配鏈表結(jié)點(diǎn)的存儲(chǔ)空間,其形式為函數(shù)向系統(tǒng)申請(qǐng)分配鏈表結(jié)點(diǎn)的存儲(chǔ)空間,其形式為malloc(存儲(chǔ)區(qū)字節(jié)數(shù)存儲(chǔ)區(qū)字節(jié)數(shù)) 該函數(shù)返回存儲(chǔ)區(qū)的首地址。例如,該函數(shù)返回存儲(chǔ)區(qū)的首地址。例如,struct node int d; struct node *next;struct node *p;p(st

21、ruct node * )malloc(sizeof(struct node); 釋放存儲(chǔ)區(qū)用如下函數(shù):釋放存儲(chǔ)區(qū)用如下函數(shù):free(p);第26頁(yè)/共45頁(yè)88.44.2 2 鏈表的基本運(yùn)算鏈表的基本運(yùn)算 1在鏈表中查找指定元素在鏈表中查找指定元素 在對(duì)鏈表進(jìn)行插入或刪除的運(yùn)算中,總是首先需要找到插入或刪除的位置,這就需要對(duì)鏈表進(jìn)行掃描查找,在鏈表中尋找包含指定元素值的前一個(gè)結(jié)點(diǎn)。當(dāng)找到包含指定元素的前一個(gè)結(jié)點(diǎn)后,就可以在該結(jié)點(diǎn)后插入新結(jié)點(diǎn)或刪除該結(jié)點(diǎn)后的一個(gè)結(jié)點(diǎn)。在對(duì)鏈表進(jìn)行插入或刪除的運(yùn)算中,總是首先需要找到插入或刪除的位置,這就需要對(duì)鏈表進(jìn)行掃描查找,在鏈表中尋找包含指定元素值的前一

22、個(gè)結(jié)點(diǎn)。當(dāng)找到包含指定元素的前一個(gè)結(jié)點(diǎn)后,就可以在該結(jié)點(diǎn)后插入新結(jié)點(diǎn)或刪除該結(jié)點(diǎn)后的一個(gè)結(jié)點(diǎn)。第27頁(yè)/共45頁(yè) 下面是在非空鏈表中尋找包含指定元素值的前一個(gè)結(jié)點(diǎn)的下面是在非空鏈表中尋找包含指定元素值的前一個(gè)結(jié)點(diǎn)的C語(yǔ)言描述。語(yǔ)言描述。struct node /*定義結(jié)點(diǎn)類型定義結(jié)點(diǎn)類型*/ ET d; /*ET為數(shù)據(jù)元素類型名,下同為數(shù)據(jù)元素類型名,下同*/ struct node *next; /*在頭指針為在頭指針為head的非空鏈表中尋找包含元素的非空鏈表中尋找包含元素x的前一個(gè)結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)p(結(jié)點(diǎn)(結(jié)點(diǎn)p作作為函數(shù)值返回)為函數(shù)值返回)*/struct node *lookst(

23、head,x)ET x; struct node *head; struct node *p; phead; while(pnext!NULL)&(pnext)d)!x) ppnext; return(p);第28頁(yè)/共45頁(yè)2鏈表的插入鏈表的插入 鏈表的插入是指在原鏈表中的指定元素之前插入一個(gè)新元素。鏈表的插入是指在原鏈表中的指定元素之前插入一個(gè)新元素。 要在鏈表中包含元素要在鏈表中包含元素x的結(jié)點(diǎn)之前插入一個(gè)新元素的結(jié)點(diǎn)之前插入一個(gè)新元素b。其插入過(guò)程如下:。其插入過(guò)程如下:(1)用)用malloc()函數(shù)申請(qǐng)取得新結(jié)點(diǎn)函數(shù)申請(qǐng)取得新結(jié)點(diǎn)p,并置該結(jié)點(diǎn)的數(shù)據(jù)域?yàn)?,并置該結(jié)點(diǎn)的數(shù)據(jù)域?yàn)閎。即

24、令。即令pdb。(2)在鏈表中尋找包含元素)在鏈表中尋找包含元素x的前一個(gè)結(jié)點(diǎn),設(shè)該結(jié)點(diǎn)的存儲(chǔ)地址為的前一個(gè)結(jié)點(diǎn),設(shè)該結(jié)點(diǎn)的存儲(chǔ)地址為q。鏈表如圖。鏈表如圖8.3(b)所示。)所示。(3)最后將結(jié)點(diǎn))最后將結(jié)點(diǎn)p插入到結(jié)點(diǎn)插入到結(jié)點(diǎn)q之后。為了實(shí)現(xiàn)這一步,只要改變以下兩個(gè)結(jié)點(diǎn)的指針域內(nèi)容:之后。為了實(shí)現(xiàn)這一步,只要改變以下兩個(gè)結(jié)點(diǎn)的指針域內(nèi)容:第29頁(yè)/共45頁(yè) 使結(jié)點(diǎn)使結(jié)點(diǎn)p指向包含元素指向包含元素x的結(jié)點(diǎn)(即結(jié)點(diǎn)的結(jié)點(diǎn)(即結(jié)點(diǎn)q的后件結(jié)點(diǎn)),即令的后件結(jié)點(diǎn)),即令pnextqnext 使結(jié)點(diǎn)使結(jié)點(diǎn)q的指針域內(nèi)容改為指向結(jié)點(diǎn)的指針域內(nèi)容改為指向結(jié)點(diǎn)p,即令,即令qnextp第30頁(yè)/共45頁(yè)

25、圖8.3 鏈表的插入 x HEAD 0 (a) 原來(lái)的鏈表 x HEAD 0 (b) 申請(qǐng)得到結(jié)點(diǎn) p,在鏈表中找到包含元素 x 的前一個(gè)結(jié)點(diǎn) q b p q x HEAD 0 (c) p 插入到 q 之后 b p q 第31頁(yè)/共45頁(yè)3鏈表的刪除鏈表的刪除 鏈表的刪除是指在鏈表中刪除包含指定元素的結(jié)點(diǎn)。鏈表的刪除是指在鏈表中刪除包含指定元素的結(jié)點(diǎn)。 為了在鏈表中刪除包含指定元素的結(jié)點(diǎn),首先要在鏈表中找到這個(gè)結(jié)點(diǎn),然后將要?jiǎng)h除結(jié)點(diǎn)放回到可利用棧。為了在鏈表中刪除包含指定元素的結(jié)點(diǎn),首先要在鏈表中找到這個(gè)結(jié)點(diǎn),然后將要?jiǎng)h除結(jié)點(diǎn)放回到可利用棧。 要在鏈表中刪除包含元素要在鏈表中刪除包含元素x的結(jié)

26、點(diǎn)。其刪除過(guò)程如下:的結(jié)點(diǎn)。其刪除過(guò)程如下: (1)在鏈表中尋找包含元素)在鏈表中尋找包含元素x的前一個(gè)結(jié)點(diǎn),設(shè)該結(jié)點(diǎn)地址為的前一個(gè)結(jié)點(diǎn),設(shè)該結(jié)點(diǎn)地址為q。則包含元素。則包含元素x的結(jié)點(diǎn)地址的結(jié)點(diǎn)地址pqnext。 (2)將結(jié)點(diǎn))將結(jié)點(diǎn)q后的結(jié)點(diǎn)后的結(jié)點(diǎn)p從鏈表中刪除,即讓結(jié)點(diǎn)從鏈表中刪除,即讓結(jié)點(diǎn)q的指針指向包含元素的指針指向包含元素x的結(jié)點(diǎn)的結(jié)點(diǎn)p的指針指向的結(jié)點(diǎn),即令的指針指向的結(jié)點(diǎn),即令qnextpnext (3)將包含元素)將包含元素x的結(jié)點(diǎn)的結(jié)點(diǎn)p釋放。此時(shí),鏈表的刪除運(yùn)算完成。釋放。此時(shí),鏈表的刪除運(yùn)算完成。第32頁(yè)/共45頁(yè)圖8.4 鏈表的刪除 x HEAD 0 (a) 原來(lái)的

27、鏈表 x HEAD 0 (b) 從鏈表中刪除包含元素 x 的結(jié)點(diǎn) p 后 q p 第33頁(yè)/共45頁(yè)8.5 聯(lián)聯(lián) 合合 體體 C語(yǔ)言中中的聯(lián)合數(shù)據(jù)類型可以滿足這種需要。聯(lián)合體又稱為共用體,意為各種不同數(shù)據(jù)共用同一段存儲(chǔ)空間。語(yǔ)言中中的聯(lián)合數(shù)據(jù)類型可以滿足這種需要。聯(lián)合體又稱為共用體,意為各種不同數(shù)據(jù)共用同一段存儲(chǔ)空間。 與結(jié)構(gòu)體類似,為了定義聯(lián)合體類型變量,首先要定義聯(lián)合體類型,說(shuō)明該聯(lián)合體類型中包括哪些成員,它們各屬于何數(shù)據(jù)類型,然后再定義該類型的變量。與結(jié)構(gòu)體類似,為了定義聯(lián)合體類型變量,首先要定義聯(lián)合體類型,說(shuō)明該聯(lián)合體類型中包括哪些成員,它們各屬于何數(shù)據(jù)類型,然后再定義該類型的變量。第

28、34頁(yè)/共45頁(yè) 定義聯(lián)合體數(shù)據(jù)類型的一般形式為定義聯(lián)合體數(shù)據(jù)類型的一般形式為union 聯(lián)合體名聯(lián)合體名 成員表成員表 ;例如,例如,union w int k; double d; char c; ;定義了一個(gè)聯(lián)合體類型定義了一個(gè)聯(lián)合體類型w,包括代表整型量的成員,包括代表整型量的成員k、代表雙精度型量的成員、代表雙精度型量的成員d和代表字符型量的成員和代表字符型量的成員c。 第35頁(yè)/共45頁(yè) 下面對(duì)聯(lián)合體類型變量作幾點(diǎn)說(shuō)明:下面對(duì)聯(lián)合體類型變量作幾點(diǎn)說(shuō)明: (1)由于一個(gè)聯(lián)合體變量中的各成員共用一段存儲(chǔ)空間,因此,在任一時(shí)刻,只能有一種類型的數(shù)據(jù)存放在該變量中,即在任一時(shí)刻,只有一個(gè)成

29、員的數(shù)據(jù)有意義,其他成員的數(shù)據(jù)是沒(méi)有意義的。)由于一個(gè)聯(lián)合體變量中的各成員共用一段存儲(chǔ)空間,因此,在任一時(shí)刻,只能有一種類型的數(shù)據(jù)存放在該變量中,即在任一時(shí)刻,只有一個(gè)成員的數(shù)據(jù)有意義,其他成員的數(shù)據(jù)是沒(méi)有意義的。 (2)在引用聯(lián)合體變量中的成員時(shí),必須保證數(shù)據(jù)的一致。)在引用聯(lián)合體變量中的成員時(shí),必須保證數(shù)據(jù)的一致。 (3)在定義聯(lián)合體變量時(shí)不能為其初始化,并且,聯(lián)合體變量不能作為函數(shù)參數(shù)。)在定義聯(lián)合體變量時(shí)不能為其初始化,并且,聯(lián)合體變量不能作為函數(shù)參數(shù)。 (4)聯(lián)合體類型與結(jié)構(gòu)體類型可以互相嵌套,即聯(lián)合體類型可以作為結(jié)構(gòu)體類型的成員,結(jié)構(gòu)體類型也可以作為聯(lián)合體類型的成員。)聯(lián)合體類型與

30、結(jié)構(gòu)體類型可以互相嵌套,即聯(lián)合體類型可以作為結(jié)構(gòu)體類型的成員,結(jié)構(gòu)體類型也可以作為聯(lián)合體類型的成員。第36頁(yè)/共45頁(yè)8.6 枚舉類型與自定義類型名枚舉類型與自定義類型名88.66.1 1 枚舉類型枚舉類型 (1)先定義枚舉類型,然后定義該枚舉類型的變量。)先定義枚舉類型,然后定義該枚舉類型的變量。 定義枚舉類型的一般形式為定義枚舉類型的一般形式為enum 枚舉類型名枚舉類型名 枚舉元素列表枚舉元素列表 ; 其中在枚舉元素列表中依次列出了該類型中所有的元素(即枚舉常量),如果在定義中沒(méi)有顯式地給出這些元素的值,這些元素依次取值為其中在枚舉元素列表中依次列出了該類型中所有的元素(即枚舉常量),如

31、果在定義中沒(méi)有顯式地給出這些元素的值,這些元素依次取值為0,1,2,。 (2)在定義枚舉類型的同時(shí)定義該枚舉類型的變量。)在定義枚舉類型的同時(shí)定義該枚舉類型的變量。 這種定義方法的一般形式為這種定義方法的一般形式為enum 枚舉類型名枚舉類型名 枚舉元素列表枚舉元素列表 變量表;變量表; (3)直接定義枚舉類型變量。)直接定義枚舉類型變量。 這種定義方法的一般形式為這種定義方法的一般形式為enum 枚舉元素列表枚舉元素列表 變量表;變量表;第37頁(yè)/共45頁(yè)在使用枚舉類型數(shù)據(jù)時(shí),要注意以下幾個(gè)問(wèn)題:在使用枚舉類型數(shù)據(jù)時(shí),要注意以下幾個(gè)問(wèn)題:(1)不能對(duì)枚舉元素賦值,因?yàn)槊杜e元素本身就是常量(即

32、枚舉常量)。)不能對(duì)枚舉元素賦值,因?yàn)槊杜e元素本身就是常量(即枚舉常量)。 (2)雖然在程序中不能對(duì)枚舉元素賦值,但實(shí)際上,每個(gè)枚舉元素都有一個(gè)確定的整型值。)雖然在程序中不能對(duì)枚舉元素賦值,但實(shí)際上,每個(gè)枚舉元素都有一個(gè)確定的整型值。 (3)C語(yǔ)言允許將一個(gè)整型值經(jīng)強(qiáng)制類型轉(zhuǎn)換后賦給枚舉類型變量。語(yǔ)言允許將一個(gè)整型值經(jīng)強(qiáng)制類型轉(zhuǎn)換后賦給枚舉類型變量。 第38頁(yè)/共45頁(yè)88.66.2 2 自定義類型名自定義類型名 在一個(gè)在一個(gè)C程序中,可以使用程序中,可以使用C提供的標(biāo)準(zhǔn)數(shù)據(jù)類型名(如提供的標(biāo)準(zhǔn)數(shù)據(jù)類型名(如int,char,float,double等),也可以使用用戶自己定義的數(shù)據(jù)類型名(

33、如結(jié)構(gòu)體類型,聯(lián)合體類型,枚舉類型等)。除此之外,等),也可以使用用戶自己定義的數(shù)據(jù)類型名(如結(jié)構(gòu)體類型,聯(lián)合體類型,枚舉類型等)。除此之外,C語(yǔ)言還允許用語(yǔ)言還允許用typedef聲明新的類型名來(lái)代表已有的類型名,稱為自定義類型名。聲明新的類型名來(lái)代表已有的類型名,稱為自定義類型名。 自定義類型名的一般形式為自定義類型名的一般形式為 typedef 原類型名原類型名 新類型名;新類型名;它指定用新類型名代表原類型名。它指定用新類型名代表原類型名。第39頁(yè)/共45頁(yè)8.7 程序舉例程序舉例 例例8.11 設(shè)有學(xué)生情況登記表如表設(shè)有學(xué)生情況登記表如表8.3所示。用選擇排序法對(duì)該表按成績(jī)從小到大進(jìn)行排序。所示。用選擇排

溫馨提示

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