C語(yǔ)言從入門(mén)到精通,非常不錯(cuò)的課件第9章_第1頁(yè)
C語(yǔ)言從入門(mén)到精通,非常不錯(cuò)的課件第9章_第2頁(yè)
C語(yǔ)言從入門(mén)到精通,非常不錯(cuò)的課件第9章_第3頁(yè)
C語(yǔ)言從入門(mén)到精通,非常不錯(cuò)的課件第9章_第4頁(yè)
C語(yǔ)言從入門(mén)到精通,非常不錯(cuò)的課件第9章_第5頁(yè)
已閱讀5頁(yè),還剩47頁(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、返回9.1 9.1 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義9.2 9.2 結(jié)構(gòu)體類型變量結(jié)構(gòu)體類型變量9.3 9.3 結(jié)構(gòu)體類型數(shù)組結(jié)構(gòu)體類型數(shù)組9.4 9.4 結(jié)構(gòu)體類型指針結(jié)構(gòu)體類型指針9.5 9.5 結(jié)構(gòu)體與函數(shù)結(jié)構(gòu)體與函數(shù)9.6 9.6 鏈表鏈表 9.1 9.1 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義1. 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 struct struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 成員名成員名1 1; 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 成員名成員名2 2; 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 成員名成員名n n; ; 其中:其中: structstruct是關(guān)鍵字是關(guān)鍵字下一頁(yè)下一頁(yè)第9章

2、 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè)2. 2. 定義結(jié)構(gòu)體類型,定義結(jié)構(gòu)體類型, 描述下列數(shù)據(jù)描述下列數(shù)據(jù) 1) 1) 學(xué)生情況學(xué)生情況: : 包含學(xué)生的學(xué)號(hào)、包含學(xué)生的學(xué)號(hào)、 姓名、姓名、 性別、性別、 年年齡、齡、C C語(yǔ)言課程成績(jī):語(yǔ)言課程成績(jī): struct studentint no; /*學(xué)號(hào)學(xué)號(hào)*/ char name10; /*姓名姓名*/ char sex; /*性別性別*/ int age; /*年齡年齡*/ float score; /*C成績(jī)成績(jī)*/;struct student struct student 應(yīng)作為一個(gè)應(yīng)作為一個(gè)類型類型 整體整體name10name10

3、、sexsex、ageage、scorescore都是其成員都是其成員structstruct及花括號(hào)后的及花括號(hào)后的“;”不能省。不能省。下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表注意注意上一頁(yè)上一頁(yè)如考慮如考慮1010門(mén)課程成績(jī),加上總成績(jī)與平均成績(jī),門(mén)課程成績(jī),加上總成績(jī)與平均成績(jī),可作如下定義:可作如下定義: struct studentint no; /*學(xué)號(hào)學(xué)號(hào)*/ char name20; /*姓名姓名*/ char sex; /*性別性別*/ int age; /*年齡年齡*/ float score11; /*30門(mén)課程成績(jī)門(mén)課程成績(jī)*/ float tcj, acj; /*總

4、成績(jī),總成績(jī), 平均成績(jī)平均成績(jī)*/; 下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè) (2) (2) 個(gè)人數(shù)據(jù)個(gè)人數(shù)據(jù): : 包含姓名、性別、年齡、身高、體包含姓名、性別、年齡、身高、體 重、住址重、住址: : struct personchar name20; /*姓名姓名*/char sex; /*性別性別*/int age; /*年齡年齡*/float height; /*身高身高*/float weight; /*體重體重*/char addr50; /*住址住址*/; 下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè)(3) (3) 平面上的點(diǎn)平面上的點(diǎn): : struct

5、 point2float x; /*橫坐標(biāo)橫坐標(biāo)*/float y; /*縱坐標(biāo)縱坐標(biāo)*/;如考慮空間中的點(diǎn),如考慮空間中的點(diǎn), 可作如下定義:可作如下定義:struct point3float x; /*X坐標(biāo)坐標(biāo)*/float y; /*Y坐標(biāo)坐標(biāo)*/float z; /*Z坐標(biāo)坐標(biāo)*/; 下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè)(4) (4) 日期,包括年、月、日日期,包括年、月、日:struct dateint year; /*年年*/month; /*月月*/day; /*日日*/;結(jié)構(gòu)體類型可嵌套定義結(jié)構(gòu)體類型可嵌套定義 即一個(gè)結(jié)構(gòu)體類型中的即一個(gè)結(jié)構(gòu)體類型中的某些成員

6、又是其他結(jié)構(gòu)體類型某些成員又是其他結(jié)構(gòu)體類型 。例如:。例如:第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表如職工信息結(jié)構(gòu)體類型為:如職工信息結(jié)構(gòu)體類型為:struct personchar name20; /*姓名姓名*/char address40; /*地址地址*/float salary; /*工資工資*/float cost; /*扣款扣款*/struct date hiredate; /*聘任日期聘任日期*/; 返回上一頁(yè)上一頁(yè)9.2 9.2 結(jié)構(gòu)體類型變量結(jié)構(gòu)體類型變量1. 1. 先定義結(jié)構(gòu)體類型,先定義結(jié)構(gòu)體類型, 再定義結(jié)構(gòu)體變量再定義結(jié)構(gòu)體變量 形式:形式: struct struct 結(jié)構(gòu)

7、體名結(jié)構(gòu)體名 結(jié)構(gòu)體變量名表;結(jié)構(gòu)體變量名表; 例如:對(duì)已定義的結(jié)構(gòu)體類型例如:對(duì)已定義的結(jié)構(gòu)體類型struct student struct student , 可以定義結(jié)構(gòu)體變量:可以定義結(jié)構(gòu)體變量: struct student zhang ,stu1struct student zhang ,stu1; struct person p50struct person p50; / /* *5050個(gè)職工人的數(shù)據(jù)個(gè)職工人的數(shù)據(jù)* */ /下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè)struct struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 成員名成員名1 1; 類型

8、標(biāo)識(shí)符類型標(biāo)識(shí)符 成員名成員名2 2; 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 成員名成員名n n; 變量名表變量名表; ;例如:例如:struct student char name20; char sex; int age; float score; stu1,stu2;下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表2. 2. 在定義結(jié)構(gòu)體類型的同時(shí)定義變量形式:在定義結(jié)構(gòu)體類型的同時(shí)定義變量形式:上一頁(yè)上一頁(yè)structstruct 類型標(biāo)示符類型標(biāo)示符 成員名成員名1 1; 類型標(biāo)示符類型標(biāo)示符 成員名成員名2 2; 類型標(biāo)示符類型標(biāo)示符 成員名成員名n n; 變量名表變量名表; ;例如:例如:struct

9、char name20; char sex; int age; float score; stu1,stu2;下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表3. 3. 用匿名形式直接定義結(jié)構(gòu)體類型變量(不出現(xiàn)結(jié)用匿名形式直接定義結(jié)構(gòu)體類型變量(不出現(xiàn)結(jié)構(gòu)體名)構(gòu)體名)上一頁(yè)上一頁(yè)(1 1)類型與變量是不同的概念,不要混同。對(duì)結(jié)構(gòu))類型與變量是不同的概念,不要混同。對(duì)結(jié)構(gòu)體變量來(lái)說(shuō),在定義時(shí)一般先定義一個(gè)結(jié)構(gòu)體類型體變量來(lái)說(shuō),在定義時(shí)一般先定義一個(gè)結(jié)構(gòu)體類型,然后定義變量為該類型。只能對(duì)變量賦值、存取,然后定義變量為該類型。只能對(duì)變量賦值、存取或運(yùn)算,而不能對(duì)一個(gè)類型賦值、存取或運(yùn)算。在或運(yùn)算,而不能

10、對(duì)一個(gè)類型賦值、存取或運(yùn)算。在編譯時(shí),對(duì)類型是不分配存儲(chǔ)空間的,只對(duì)變量分編譯時(shí),對(duì)類型是不分配存儲(chǔ)空間的,只對(duì)變量分配存儲(chǔ)空間。配存儲(chǔ)空間。(2 2)對(duì)結(jié)構(gòu)體中的成員,可以單獨(dú)使用,它的作用)對(duì)結(jié)構(gòu)體中的成員,可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量。與地位相當(dāng)于普通變量。(3 3)成員也可以是一個(gè)結(jié)構(gòu)體變量)成員也可以是一個(gè)結(jié)構(gòu)體變量 下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表說(shuō)明說(shuō)明上一頁(yè)上一頁(yè)struct datestruct dateint month;int month; int day; int day; int year; int year; ; 定義定義struct stud

11、entstruct student結(jié)構(gòu)體類型時(shí),成員結(jié)構(gòu)體類型時(shí),成員birthdaybirthday的類型定義為的類型定義為struct datestruct date類型。類型。(4 4)成員名可與程序中的變量同名,兩者不代表同)成員名可與程序中的變量同名,兩者不代表同一對(duì)象。例如,程序中可以另定義變量一對(duì)象。例如,程序中可以另定義變量nono,它與,它與struct studentstruct student中的中的nono是兩回事,互不干擾。是兩回事,互不干擾。struct studentstruct studentint no;int no; char name20; char na

12、me20; char sex; char sex; int age; int age; struct date birthday; struct date birthday;char addr40;char addr40;stu1,stu2stu1,stu2; ;下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè) 由結(jié)構(gòu)體變量名引用其成員的標(biāo)記形式為:由結(jié)構(gòu)體變量名引用其成員的標(biāo)記形式為: 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名. .成員名成員名其中圓點(diǎn)運(yùn)算符是其中圓點(diǎn)運(yùn)算符是成員運(yùn)算符成員運(yùn)算符,它的運(yùn)算級(jí)別最高,它的運(yùn)算級(jí)別最高 例如定義結(jié)構(gòu)體變量例如定義結(jié)構(gòu)體變量stu1,stu2: struct

13、student stu1;stu1.age 表示引用結(jié)構(gòu)體變量表示引用結(jié)構(gòu)體變量stu1中的中的age成員,因該成成員,因該成員的類型為員的類型為int型,所以可以對(duì)它執(zhí)行任何型,所以可以對(duì)它執(zhí)行任何int型變量可以型變量可以執(zhí)行的運(yùn)算。例如:執(zhí)行的運(yùn)算。例如:stu1.age=20; scanf(%d,&stu1.age);下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè) (1) 結(jié)構(gòu)體類型變量的各結(jié)構(gòu)體類型變量的各成員(分量)成員(分量)必須單獨(dú)引必須單獨(dú)引用用,成員運(yùn)算符成員運(yùn)算符“”具有最高優(yōu)先級(jí)。具有最高優(yōu)先級(jí)。 (2) (2) 不允許對(duì)結(jié)構(gòu)體變量進(jìn)行不允許對(duì)結(jié)構(gòu)體變量進(jìn)

14、行整體整體的輸入輸出的輸入輸出 如:如:scanf(“%s%c%d%f”,&stu1); (3) 如果結(jié)構(gòu)體變量類型相同,可以互相賦值如果結(jié)構(gòu)體變量類型相同,可以互相賦值。 stu1=stu2; (4) 嚴(yán)格區(qū)分類型與變量的概念。嚴(yán)格區(qū)分類型與變量的概念。 下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表說(shuō)明說(shuō)明上一頁(yè)上一頁(yè)(5) 如果結(jié)構(gòu)體成員本身又是結(jié)構(gòu)體類型的,則可如果結(jié)構(gòu)體成員本身又是結(jié)構(gòu)體類型的,則可繼續(xù)使用成員運(yùn)算符取結(jié)構(gòu)體成員的結(jié)構(gòu)體成員,繼續(xù)使用成員運(yùn)算符取結(jié)構(gòu)體成員的結(jié)構(gòu)體成員,逐級(jí)向下,引用最低一級(jí)的成員。程序逐級(jí)向下,引用最低一級(jí)的成員。程序只能對(duì)最低只能對(duì)最低一級(jí)的成員

15、進(jìn)行運(yùn)算一級(jí)的成員進(jìn)行運(yùn)算。下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表 對(duì)對(duì)stu1某些成員的訪問(wèn):某些成員的訪問(wèn):例如例如上一頁(yè)上一頁(yè) 結(jié)構(gòu)體變量可以在定義時(shí)初始化。結(jié)構(gòu)體變量可以在定義時(shí)初始化。1. 1. 初始化格式:初始化格式: 存儲(chǔ)類別存儲(chǔ)類別 struct struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員表成員表 結(jié)構(gòu)體變量結(jié)構(gòu)體變量=初始化數(shù)據(jù)表初始化數(shù)據(jù)表 ; 初始化數(shù)據(jù)表是相應(yīng)成員的初值表。初始化數(shù)據(jù)表是相應(yīng)成員的初值表。 下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè)2. 2. 初始化示例初始化示例 struct student char name20; char sex; int

16、age; float score; stu1,stu2=“Wangwu”,m,20,88.5;下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè)stru110001020100110231026name20sexagescore3.3.結(jié)構(gòu)體變量存儲(chǔ)分配示意圖結(jié)構(gòu)體變量存儲(chǔ)分配示意圖下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè)求某同學(xué)上學(xué)期求某同學(xué)上學(xué)期8 8門(mén)課程的總成績(jī)與平均成績(jī)。門(mén)課程的總成績(jī)與平均成績(jī)。 程序如下:程序如下:main( ) int i; struct st char xm8; float cj9; float tcj, acj; stu;scanf(%s, s

17、tu.xm);); /*輸入輸入*/ 下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表例9.1上一頁(yè)上一頁(yè)for(i=1; i=8;i+) scan(%f, &stu.cji);); stu.tcj=0.0; /*求總成績(jī)求總成績(jī)*/for(i=1; i-成員名成員名-為指向運(yùn)算符,上面示例為指向運(yùn)算符,上面示例(* *pstu).name,(pstu).name,(* *pstu).agepstu).age。可以??梢缘葍r(jià)表示為:等價(jià)表示為: pstu-name, pstu-agepstu-name, pstu-age上一頁(yè)上一頁(yè)例如,如下變量定義:例如,如下變量定義: struct poi

18、nt float x; float y; p,*pt; 定義了一個(gè)結(jié)構(gòu)體變量定義了一個(gè)結(jié)構(gòu)體變量p,一個(gè)指向該結(jié)構(gòu)體的指針,一個(gè)指向該結(jié)構(gòu)體的指針變量變量pt,分析以下語(yǔ)句:,分析以下語(yǔ)句:p.x=12.2; p.y=30; pt=&p;(*pt).x=12.2; (*pt).y=30;采用指向運(yùn)算符采用指向運(yùn)算符-的表示形式為:的表示形式為:pt-x=12.2; pt-y=30;下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表例例9.3比較結(jié)構(gòu)體成員的幾種引用方式比較結(jié)構(gòu)體成員的幾種引用方式點(diǎn)擊點(diǎn)擊查看程序請(qǐng)查看程序請(qǐng) 結(jié)構(gòu)體成員變量引用方

19、式結(jié)構(gòu)體成員變量引用方式 結(jié)構(gòu)體變量結(jié)構(gòu)體變量. .成員名成員名 ( (* *p).p).成員名成員名 p-p-成員名成員名 其中,其中,-稱為指向運(yùn)算符稱為指向運(yùn)算符思思考考 請(qǐng)分析下列幾種運(yùn)算:請(qǐng)分析下列幾種運(yùn)算: p-n p-n p-n+p-n+ +p-n+p-n總結(jié)總結(jié)上一頁(yè)上一頁(yè) 一個(gè)指針變量可以指向一個(gè)結(jié)構(gòu)體數(shù)組元素一個(gè)指針變量可以指向一個(gè)結(jié)構(gòu)體數(shù)組元素(將該將該結(jié)構(gòu)體數(shù)組的數(shù)組元素地址賦給此指針變量結(jié)構(gòu)體數(shù)組的數(shù)組元素地址賦給此指針變量)。例如:。例如: struct int a; float b; arr3,*p; p=arr; 此時(shí)使此時(shí)使p指向指向arr數(shù)組的第一個(gè)元素,數(shù)

20、組的第一個(gè)元素,“p=arr;”等等價(jià)于價(jià)于“p=&arr0;”。若執(zhí)行。若執(zhí)行“p+;”則此時(shí)指針變量則此時(shí)指針變量p此時(shí)指向此時(shí)指向arr1。下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表例例9.4輸出數(shù)組中各元素中各成員的值。輸出數(shù)組中各元素中各成員的值。點(diǎn)擊點(diǎn)擊查看程序請(qǐng)查看程序請(qǐng)指針移動(dòng)示意圖:10101ZhangM1810102Li M1910103WangF20stu0stu1stu2PPP”上一頁(yè)上一頁(yè)如果如果p p的初值為的初值為stustu,即指向第一個(gè)元素,則,即指向第一個(gè)元素,則p+1p+1后指向下一個(gè)元素的起始地址

21、。請(qǐng)區(qū)別:后指向下一個(gè)元素的起始地址。請(qǐng)區(qū)別:(+p)-num (+p)-num 和和 (p+)-num (p+)-num指針指針p p已定義為指向已定義為指向struct studentstruct student類型的數(shù)據(jù),類型的數(shù)據(jù),它只能指向該結(jié)構(gòu)體類型數(shù)據(jù),而不能指向一它只能指向該結(jié)構(gòu)體類型數(shù)據(jù),而不能指向一元素的某一成員(即元素的某一成員(即p p的地址不能是成員的地的地址不能是成員的地址)。如下面的賦值是錯(cuò)誤的:址)。如下面的賦值是錯(cuò)誤的:p=&p=&第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表注意注意返回上一頁(yè)上一頁(yè)有時(shí)需要將一個(gè)結(jié)構(gòu)體變量的值傳

22、遞給另一個(gè)函數(shù)有時(shí)需要將一個(gè)結(jié)構(gòu)體變量的值傳遞給另一個(gè)函數(shù)可以:可以:v 用結(jié)構(gòu)體變量的成員作參數(shù)。用法和普通變量作實(shí)用結(jié)構(gòu)體變量的成員作參數(shù)。用法和普通變量作實(shí)參是一樣的,屬參是一樣的,屬“值傳遞值傳遞”方式。方式。v形參與實(shí)參都用結(jié)構(gòu)體變量形參與實(shí)參都用結(jié)構(gòu)體變量直接將實(shí)參結(jié)構(gòu)體變量的各個(gè)成員的值全部傳遞直接將實(shí)參結(jié)構(gòu)體變量的各個(gè)成員的值全部傳遞給形參的結(jié)構(gòu)體變量。給形參的結(jié)構(gòu)體變量。 注意:實(shí)參和形參類型應(yīng)當(dāng)完全一致注意:實(shí)參和形參類型應(yīng)當(dāng)完全一致。9.5 9.5 結(jié)構(gòu)體與函數(shù)結(jié)構(gòu)體與函數(shù)下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè) 用指向結(jié)構(gòu)體變量(或數(shù)組)的指針作實(shí)參,將用指

23、向結(jié)構(gòu)體變量(或數(shù)組)的指針作實(shí)參,將結(jié)構(gòu)體變量(或數(shù)組)的地址傳結(jié)構(gòu)體變量(或數(shù)組)的地址傳 給形參。給形參。 形參為指針變量,實(shí)參為結(jié)構(gòu)體變量的地址或指形參為指針變量,實(shí)參為結(jié)構(gòu)體變量的地址或指向結(jié)構(gòu)體變量的指針。向結(jié)構(gòu)體變量的指針。 下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表例例9.5有一個(gè)結(jié)構(gòu)體變量有一個(gè)結(jié)構(gòu)體變量stu,內(nèi)含學(xué)生學(xué)號(hào)、姓名和三門(mén)課,內(nèi)含學(xué)生學(xué)號(hào)、姓名和三門(mén)課的成績(jī)。要求在的成績(jī)。要求在main函數(shù)中賦值,在另一函數(shù)函數(shù)中賦值,在另一函數(shù)print中中將它們打印輸出。將它們打印輸出。點(diǎn)擊點(diǎn)擊查看程序請(qǐng)查看程序請(qǐng)上一頁(yè)上一頁(yè) 值得指出的是,把一個(gè)完整的結(jié)構(gòu)體變量作為參值得指

24、出的是,把一個(gè)完整的結(jié)構(gòu)體變量作為參數(shù)傳遞,雖然合法,但要將全部成員值一個(gè)一個(gè)數(shù)傳遞,雖然合法,但要將全部成員值一個(gè)一個(gè)傳遞,既費(fèi)時(shí)間又費(fèi)空間,開(kāi)銷(xiāo)大,因此一般不傳遞,既費(fèi)時(shí)間又費(fèi)空間,開(kāi)銷(xiāo)大,因此一般不采用。采用。 例例9.5 的的print函數(shù)形參改用結(jié)構(gòu)體變量后程序如下函數(shù)形參改用結(jié)構(gòu)體變量后程序如下:注意:注意:ANSI CANSI C允許用整個(gè)結(jié)構(gòu)體作為函數(shù)的參數(shù)傳允許用整個(gè)結(jié)構(gòu)體作為函數(shù)的參數(shù)傳遞,但是必須保證實(shí)參與形參的類型相同。遞,但是必須保證實(shí)參與形參的類型相同。下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表點(diǎn)擊點(diǎn)擊上一頁(yè)上一頁(yè) ANSI C還允許函數(shù)返回結(jié)構(gòu)體類型的值。設(shè)有一個(gè)還

25、允許函數(shù)返回結(jié)構(gòu)體類型的值。設(shè)有一個(gè) struct student 類型,結(jié)構(gòu)體變量定義如下:類型,結(jié)構(gòu)體變量定義如下: struct student stud30;若函數(shù)若函數(shù)input()的功能是輸入一個(gè)學(xué)生結(jié)構(gòu)體數(shù)據(jù),并將的功能是輸入一個(gè)學(xué)生結(jié)構(gòu)體數(shù)據(jù),并將 其返回給第其返回給第i個(gè)學(xué)生記錄個(gè)學(xué)生記錄studi,即:即: for (k=0;k30;k+) studk=input();input()函數(shù)定義如下:函數(shù)定義如下:struct student input() int k; struct student stud; scanf(%d,&stud.num); gets(st

26、); for(k=0;k3;k+) scanf(%f,&stud.scorek); return stud; 第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表返回上一頁(yè)上一頁(yè)v 所謂鏈表是指若干個(gè)數(shù)據(jù)項(xiàng)(每個(gè)數(shù)據(jù)項(xiàng)稱為一個(gè)所謂鏈表是指若干個(gè)數(shù)據(jù)項(xiàng)(每個(gè)數(shù)據(jù)項(xiàng)稱為一個(gè)“結(jié)結(jié)點(diǎn)點(diǎn)”)按一定的原則連接起來(lái)。每個(gè)數(shù)據(jù)項(xiàng)都包含有若干個(gè))按一定的原則連接起來(lái)。每個(gè)數(shù)據(jù)項(xiàng)都包含有若干個(gè)數(shù)據(jù)和一個(gè)指向下一個(gè)數(shù)據(jù)項(xiàng)的指針,依靠這些指針將所有數(shù)據(jù)和一個(gè)指向下一個(gè)數(shù)據(jù)項(xiàng)的指針,依靠這些指針將所有的數(shù)據(jù)項(xiàng)連接成一個(gè)鏈表。下圖表示了一個(gè)簡(jiǎn)單的鏈表。的數(shù)據(jù)項(xiàng)連接成一個(gè)鏈表。下圖表示了一個(gè)簡(jiǎn)單的鏈表。頭指針頭指針head

27、姓姓 名名1學(xué)學(xué) 號(hào)號(hào)1成成 績(jī)績(jī)1指指 針針1數(shù)據(jù)項(xiàng)數(shù)據(jù)項(xiàng)A數(shù)據(jù)項(xiàng)數(shù)據(jù)項(xiàng)C姓姓 名名2學(xué)學(xué) 號(hào)號(hào)2成成 績(jī)績(jī)2指指 針針2數(shù)據(jù)項(xiàng)數(shù)據(jù)項(xiàng)B姓姓 名名3學(xué)學(xué) 號(hào)號(hào)3成成 績(jī)績(jī)3指指 針針3下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表9.6 9.6 鏈表鏈表上一頁(yè)上一頁(yè)1620head李為李為2004101850586數(shù)據(jù)項(xiàng)數(shù)據(jù)項(xiàng)A數(shù)據(jù)項(xiàng)數(shù)據(jù)項(xiàng)C劉娜劉娜2004102933818數(shù)據(jù)項(xiàng)數(shù)據(jù)項(xiàng)B張三張三20041259501620 05863818下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表一個(gè)簡(jiǎn)單鏈表示例一個(gè)簡(jiǎn)單鏈表示例上一頁(yè)上一頁(yè)鏈表與數(shù)組的主要區(qū)別是鏈表與數(shù)組的主要區(qū)別是v 數(shù)組的元素個(gè)數(shù)是固定的,而

28、組成鏈表的結(jié)點(diǎn)個(gè)數(shù)數(shù)組的元素個(gè)數(shù)是固定的,而組成鏈表的結(jié)點(diǎn)個(gè)數(shù)可按需要增減;可按需要增減;v 數(shù)組元素的存貯單元在數(shù)組定義時(shí)分配,鏈表結(jié)點(diǎn)數(shù)組元素的存貯單元在數(shù)組定義時(shí)分配,鏈表結(jié)點(diǎn)的存貯單元在程序執(zhí)行時(shí)動(dòng)態(tài)向系統(tǒng)申請(qǐng);的存貯單元在程序執(zhí)行時(shí)動(dòng)態(tài)向系統(tǒng)申請(qǐng);v 數(shù)組中的元素順序關(guān)系由元素在數(shù)組中的位置(即數(shù)組中的元素順序關(guān)系由元素在數(shù)組中的位置(即下標(biāo))確定,鏈表中的結(jié)點(diǎn)順序關(guān)系由結(jié)點(diǎn)所包含的下標(biāo))確定,鏈表中的結(jié)點(diǎn)順序關(guān)系由結(jié)點(diǎn)所包含的指針來(lái)體現(xiàn)。指針來(lái)體現(xiàn)。v 對(duì)于不是固定長(zhǎng)度的列表,用可能最大長(zhǎng)度的數(shù)組對(duì)于不是固定長(zhǎng)度的列表,用可能最大長(zhǎng)度的數(shù)組來(lái)描述,會(huì)浪費(fèi)許多內(nèi)存空間。另外,對(duì)于元素

29、的插來(lái)描述,會(huì)浪費(fèi)許多內(nèi)存空間。另外,對(duì)于元素的插入、刪除操作非常頻繁的列表處理場(chǎng)合,用數(shù)組表示入、刪除操作非常頻繁的列表處理場(chǎng)合,用數(shù)組表示列表也是不適宜的。若用鏈表實(shí)現(xiàn),會(huì)使程序結(jié)構(gòu)清列表也是不適宜的。若用鏈表實(shí)現(xiàn),會(huì)使程序結(jié)構(gòu)清晰,處理的方法也較為簡(jiǎn)便晰,處理的方法也較為簡(jiǎn)便。 下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè)分配存儲(chǔ)空間函數(shù)分配存儲(chǔ)空間函數(shù)malloc( )分配存儲(chǔ)空間函數(shù)分配存儲(chǔ)空間函數(shù)calloc( ) 重新分配空間函數(shù)重新分配空間函數(shù) realloc ( )釋放空間函數(shù)釋放空間函數(shù) free ( )下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè) mall

30、oc ( ) 函數(shù)的原型為:函數(shù)的原型為:void *malloc ( unsigned size ) ;函數(shù)的作用是在內(nèi)存自由空間開(kāi)辟一塊大小為函數(shù)的作用是在內(nèi)存自由空間開(kāi)辟一塊大小為 size 字節(jié)的空間,并將此存儲(chǔ)空間的起始地址作為函數(shù)字節(jié)的空間,并將此存儲(chǔ)空間的起始地址作為函數(shù)值帶回。值帶回。例如,例如,malloc ( 10 ) 的結(jié)果是分配了一個(gè)長(zhǎng)度為的結(jié)果是分配了一個(gè)長(zhǎng)度為10字字節(jié)的內(nèi)存空間,若系統(tǒng)設(shè)定的此內(nèi)存空間的起始地節(jié)的內(nèi)存空間,若系統(tǒng)設(shè)定的此內(nèi)存空間的起始地址為址為1800,則,則 malloc ( 10 ) 的函數(shù)返回值就為的函數(shù)返回值就為1800。 下一頁(yè)下一頁(yè)第9

31、章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表(1) 分配存儲(chǔ)空間函數(shù)分配存儲(chǔ)空間函數(shù)malloc( )上一頁(yè)上一頁(yè)(2)分配存儲(chǔ)空間函數(shù)分配存儲(chǔ)空間函數(shù)calloc( ) 函數(shù)用于使已分配的空間改變大小,即重新分配,函數(shù)用于使已分配的空間改變大小,即重新分配,其原型為:其原型為: void *realloc ( void * ptr , unsigned newsize ) ; 下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表 calloc() 函數(shù)的原型為:函數(shù)的原型為: void *calloc ( unsigned n , unsigned size ) ; 所分配的存儲(chǔ)空間大小能容納多個(gè)元素,且每個(gè)所分配的存儲(chǔ)空

32、間大小能容納多個(gè)元素,且每個(gè)元素長(zhǎng)度一致元素長(zhǎng)度一致.(3) 重新分配空間函數(shù)重新分配空間函數(shù) realloc ( )上一頁(yè)上一頁(yè)該函數(shù)的原型為:該函數(shù)的原型為:void free ( void * ptr ) ;該函數(shù)的功能為:將指針該函數(shù)的功能為:將指針 ptr 指向的存儲(chǔ)空間釋放,指向的存儲(chǔ)空間釋放,交還給系統(tǒng),系統(tǒng)可以另行分配作它用。交還給系統(tǒng),系統(tǒng)可以另行分配作它用。 必須必須指出,指出, ptr 值不能是隨意的地址,而是只能值不能是隨意的地址,而是只能是程序在運(yùn)行時(shí)通過(guò)動(dòng)態(tài)申請(qǐng)分配到的存儲(chǔ)空間的是程序在運(yùn)行時(shí)通過(guò)動(dòng)態(tài)申請(qǐng)分配到的存儲(chǔ)空間的首地址。首地址。下面的做法是正確的:下面的做

33、法是正確的: pt = ( long * ) malloc ( 10 ) ; free (pt ) ;下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表(4)釋放空間函數(shù)釋放空間函數(shù) free ( )上一頁(yè)上一頁(yè)malloc( )和和free( )函數(shù)的使用實(shí)例函數(shù)的使用實(shí)例 #include “stdlib.h”#include “stdio.h”main( )int *p,t; p=(int *)malloc(40*sizeof(int); if (!p) printf(“t內(nèi)存已用完!內(nèi)存已用完!t”); exit(0); for(t=0;t40;+t) *(p+t)=t; for(t=0;t40

34、;+t) printf(“t%d”,*(p+t); free(p);下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表例例9.6上一頁(yè)上一頁(yè) 鏈表的基本操作包括建立鏈表、鏈表的插入、刪鏈表的基本操作包括建立鏈表、鏈表的插入、刪除、輸出和查找等。除、輸出和查找等。1. 建立鏈表建立鏈表所謂建立鏈表是指一個(gè)一個(gè)地輸入各結(jié)點(diǎn)數(shù)據(jù),所謂建立鏈表是指一個(gè)一個(gè)地輸入各結(jié)點(diǎn)數(shù)據(jù),并建立起各結(jié)點(diǎn)前后相鏈的關(guān)系。下面通過(guò)一個(gè)并建立起各結(jié)點(diǎn)前后相鏈的關(guān)系。下面通過(guò)一個(gè)例子來(lái)說(shuō)明如何建立一個(gè)鏈表。例子來(lái)說(shuō)明如何建立一個(gè)鏈表。兩種方式:兩種方式: 鏈表尾鏈表尾 插表頭插表頭下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表點(diǎn)擊點(diǎn)擊請(qǐng)請(qǐng)上

35、一頁(yè)上一頁(yè)建立鏈表,用鏈表存放學(xué)生數(shù)據(jù)建立鏈表,用鏈表存放學(xué)生數(shù)據(jù),表中每表中每一個(gè)數(shù)據(jù)項(xiàng)存放一個(gè)學(xué)生的數(shù)據(jù)。一個(gè)數(shù)據(jù)項(xiàng)存放一個(gè)學(xué)生的數(shù)據(jù)。下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表例例9.7點(diǎn)擊點(diǎn)擊查看程序請(qǐng)查看程序請(qǐng)鏈表的建立有鏈表尾與插表頭兩種方式,上面程鏈表的建立有鏈表尾與插表頭兩種方式,上面程序使用的是鏈表尾的方式。序使用的是鏈表尾的方式。用插表頭法建立一正整數(shù)鏈表用插表頭法建立一正整數(shù)鏈表例例9.8點(diǎn)擊點(diǎn)擊查看程序請(qǐng)查看程序請(qǐng)上一頁(yè)上一頁(yè)2. 鏈表的插入操作鏈表的插入操作將一個(gè)結(jié)點(diǎn)插入到一個(gè)已有的鏈表中。將一個(gè)結(jié)點(diǎn)插入到一個(gè)已有的鏈表中。分兩步:找到插入點(diǎn)分兩步:找到插入點(diǎn) 和和 插

36、入結(jié)點(diǎn)插入結(jié)點(diǎn)v 如果插入的位置為第一結(jié)點(diǎn)之前,要修改頭結(jié)點(diǎn)如果插入的位置為第一結(jié)點(diǎn)之前,要修改頭結(jié)點(diǎn)(head)指針。如果要插到表尾之后,應(yīng)將插入結(jié)點(diǎn))指針。如果要插到表尾之后,應(yīng)將插入結(jié)點(diǎn)的指針域賦的指針域賦NULL值。值。v 如果插入的位置既不在第一個(gè)結(jié)點(diǎn)之前,又不在表如果插入的位置既不在第一個(gè)結(jié)點(diǎn)之前,又不在表尾結(jié)點(diǎn)之后,則將相關(guān)指針域修改即可。尾結(jié)點(diǎn)之后,則將相關(guān)指針域修改即可。下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表插入結(jié)點(diǎn)的函數(shù)插入結(jié)點(diǎn)的函數(shù)insert()請(qǐng)()請(qǐng)點(diǎn)擊點(diǎn)擊上一頁(yè)上一頁(yè)指定的結(jié)點(diǎn)處插入一個(gè)結(jié)點(diǎn):指定的結(jié)點(diǎn)處插入一個(gè)結(jié)點(diǎn):void ins(struct linkli

37、st *head, int i, int x)/*插入結(jié)點(diǎn)*/int j; struct linklist *p, *q; p=head; j=1; while(p!=NULL)&(jnext; j+; q=(struct linklist *)malloc(sizeof(struct inklist); /*產(chǎn)生插入結(jié)點(diǎn)*/q-data=x; q-next=p-next; /*q插入p之后 */p-next=q; 下一頁(yè)下一頁(yè)第9章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表上一頁(yè)上一頁(yè)v要從鏈表中刪除一個(gè)結(jié)點(diǎn),不一定從內(nèi)存中真正要從鏈表中刪除一個(gè)結(jié)點(diǎn),不一定從內(nèi)存中真正把它刪除掉(當(dāng)然也可使用把它刪除掉(當(dāng)然也可使用free函數(shù)真正釋放),函數(shù)真正釋放),只要把它從鏈表中分離開(kāi)來(lái),即改變鏈表中

溫馨提示

  • 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)論