第1章結(jié)構(gòu)共用型和_第1頁(yè)
第1章結(jié)構(gòu)共用型和_第2頁(yè)
第1章結(jié)構(gòu)共用型和_第3頁(yè)
第1章結(jié)構(gòu)共用型和_第4頁(yè)
第1章結(jié)構(gòu)共用型和_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第10章章 結(jié)構(gòu)、共用型和枚舉型結(jié)構(gòu)、共用型和枚舉型n10.1 結(jié)構(gòu)類型及結(jié)構(gòu)變量的定義結(jié)構(gòu)類型及結(jié)構(gòu)變量的定義n為將不同數(shù)據(jù)類型、但相互關(guān)聯(lián)的一組數(shù)據(jù),組合成一個(gè)有機(jī)整體使用,c語(yǔ)言提供一種稱為“結(jié)構(gòu)”的數(shù)據(jù)結(jié)構(gòu)。nc語(yǔ)言中的結(jié)構(gòu)類型,相當(dāng)于其它高級(jí)語(yǔ)言中的“記錄”類型。n10.1.1 結(jié)構(gòu)類型定義結(jié)構(gòu)類型定義n定義一個(gè)結(jié)構(gòu)體類數(shù)據(jù)類型的一般格式如下:nstruct 結(jié)構(gòu)類型名 /* struct是結(jié)構(gòu)類型關(guān)鍵字*/n 數(shù)據(jù)類型標(biāo)識(shí)符 數(shù)據(jù)項(xiàng)1;n 數(shù)據(jù)類型標(biāo)識(shí)符 數(shù)據(jù)項(xiàng)2;n n 數(shù)據(jù)類型標(biāo)識(shí)符 數(shù)據(jù)項(xiàng);n ; /* 注意此行“”后的“;”不能少!*/n例題例題10.1 定義一個(gè)關(guān)于學(xué)生

2、基本情況的結(jié)構(gòu)類型,用以存學(xué)生的相關(guān)信息。n/*功能:定義一個(gè)記錄學(xué)生成績(jī)的結(jié)構(gòu)類型*/nstruct date n int year; nint month;nint day;n ;n/*記錄學(xué)生成績(jī)的結(jié)構(gòu)類型:由學(xué)號(hào)、姓名、成績(jī)和考試日期4項(xiàng)組成*/nstruct student_scoren char num9;n char name11; n struct date exam_daten float score;n ; n注意:注意:學(xué)號(hào)若為8位,則num數(shù)組要為num9,多留1位存放字符串結(jié)束符。同理姓名數(shù)組name11 也多留了1位(即實(shí)際姓名最多只能用10位)。n(1)“結(jié)構(gòu)類型

3、名”和“數(shù)據(jù)項(xiàng)”的命名規(guī)則,與變量名相同。n(2)數(shù)據(jù)類型相同的數(shù)據(jù)項(xiàng),既可逐個(gè)、逐行分別定義,也可合并成一行定義。n 例如,本例題代碼中的日期結(jié)構(gòu)類型,也可改為如下形式:nstruct date n int year, month, day;n ;n(3)結(jié)構(gòu)類型中的數(shù)據(jù)項(xiàng),既可以是基本數(shù)據(jù)類型,也允許是另一個(gè)已經(jīng)定義的結(jié)構(gòu)類型。n例如,上述例題代碼中的結(jié)構(gòu)類型,其數(shù)據(jù)項(xiàng)“exam_date”就是一個(gè)已經(jīng)定義的日期結(jié)構(gòu)類型date。n(4)通常將個(gè)數(shù)據(jù)項(xiàng)稱為結(jié)構(gòu)類型的個(gè)數(shù)據(jù)項(xiàng)(或1個(gè)成員)。10.1.2 定義結(jié)構(gòu)體類型變量定義結(jié)構(gòu)體類型變量n1先定義結(jié)構(gòu)類型、再定義結(jié)構(gòu)變量先定義結(jié)構(gòu)類型、再

4、定義結(jié)構(gòu)變量n我們?cè)诶}10.1中定義了一個(gè)用于存放學(xué)生成績(jī)的結(jié)構(gòu)類型student _score,還沒有定義該類型的變量,只有定義該結(jié)構(gòu)類型的變量后,系統(tǒng)才能為其分配內(nèi)存單元,進(jìn)而才能在變量中存放數(shù)據(jù)。以下就用例題10.1定義中定義結(jié)構(gòu)類型student _score定義一個(gè)學(xué)生成績(jī)結(jié)構(gòu)類型變量stud1_score,來說明結(jié)構(gòu)體類型變量的定義方法:nstruct student _score stud1_score, stud2_score;n 結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量名n結(jié)構(gòu)變量stud1_score和stud2_score:擁有student _score結(jié)構(gòu)類型的全部成員,其中exa

5、m_date成員是一個(gè)日期結(jié)構(gòu)類型,它又由3個(gè)成員構(gòu)成。n在這個(gè)例子中,我們先定義了結(jié)構(gòu)類型student_score、再定義結(jié)構(gòu)變量stud1_score和stud2_score。注意,此種方法在定義結(jié)構(gòu)變量時(shí),必須指定結(jié)構(gòu)類型名。n另外,還可以在定義結(jié)構(gòu)類型的同時(shí),定義結(jié)構(gòu)變量。n2在定義結(jié)構(gòu)類型的同時(shí),定義結(jié)構(gòu)變量在定義結(jié)構(gòu)類型的同時(shí),定義結(jié)構(gòu)變量n對(duì)例題10.1的結(jié)構(gòu)類型變量stud1-score的定義可以改為如下形式:nstruct student _scoren char num9;n char name11; n struct date exam_daten float scor

6、e;n stud1_score, stud2_score; n這種方法定義的作用和上一種方法相同,所不同的是后者將結(jié)構(gòu)類型的定義和結(jié)構(gòu)變量的聲明同時(shí)完成。n同時(shí)定義結(jié)構(gòu)類型及其結(jié)構(gòu)變量的一般格式如下:n struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名n n 成員表列成員表列n 結(jié)構(gòu)變量表列;結(jié)構(gòu)變量表列;n提示:提示:n(1)結(jié)構(gòu)類型與結(jié)構(gòu)變量是兩個(gè)不同的概念。通常變量可以被賦值、參加運(yùn)算,而不能對(duì)一個(gè)類型賦值或運(yùn)算。例如對(duì)int型變量x可以有x=1,y=x+1等操作,而不能對(duì)int類型本身進(jìn)行這些操作,例如,int=6是錯(cuò)誤的。n(2)結(jié)構(gòu)體類型中的成員也可以是一個(gè)結(jié)構(gòu)體變量。n(3)結(jié)構(gòu)體類型中的

7、成員名,可以與程序中的變量同名,它們代表不同的對(duì)象,互不相關(guān)。10.2 結(jié)構(gòu)變量的引用與初始化結(jié)構(gòu)變量的引用與初始化n利用例題10.1中定義的結(jié)構(gòu)類型struct student_score,并由此結(jié)構(gòu)類型定義一個(gè)用于存儲(chǔ)和顯示學(xué)生的考試成績(jī)的結(jié)構(gòu)變量stud1_score。n例題例題10.2 結(jié)構(gòu)變量的引用實(shí)例n/*例題原代碼文件名:lt10_2.c。定義并初始化一個(gè)自定義結(jié)構(gòu)變量stud1_score */nstruct date n int year; nint month;nint day;n ;n/*記錄學(xué)生成績(jī)的結(jié)構(gòu)類型:由學(xué)號(hào)、姓名、成績(jī)和考試日期4項(xiàng)組成*/nstruct st

8、udent_scoren char num9;n char name11; n struct date exam_daten float score;n ; nstruct student_score stud1_score=“05000102”, “wang qiang”,2006,12,20,90;nmain()n printf(“xh: %sn”, stud1_score.num);n printf(“xm: %sn”, stud1_);n printf(“exam_date: %d.%d.%dn”, stud1_score.exam_date.year,n stud

9、1_score .exam_date.month, stud1_score.exam_date.day);nprintf(“score: %f n”, stud1_score.score);n程序運(yùn)行結(jié)果:xh: 05000102xm: wang qiangexam_date: 2006.12.20score: 90.0000001結(jié)構(gòu)變量的引用結(jié)構(gòu)變量的引用n通過例題10.2可以知道,對(duì)于結(jié)構(gòu)變量,要通過成員運(yùn)算符“.”,逐個(gè)訪問其成員,即結(jié)構(gòu)變量中成員的引用方式為:n結(jié)構(gòu)變量結(jié)構(gòu)變量成員名成員名 n例如例題10.2中引用結(jié)構(gòu)變量stud1_score.num中的num成員。如果某成員本身又

10、是一個(gè)結(jié)構(gòu)類型,則只能通過多個(gè)成員運(yùn)算符,一級(jí)一級(jí)地對(duì)最低一級(jí)的成員進(jìn)行引用。n例如例題10.2中,stud1_score結(jié)構(gòu)類型中的成員exam_date又是一個(gè)結(jié)構(gòu)類型,所以只能通過成員運(yùn)算符“.”繼續(xù)引用其下的子成員year、month和day:nstud1_score.exam_date.yearnstud1_score. exam_date.monthnstud1_score.exam_date.dayn關(guān)于結(jié)構(gòu)變量引用的說明:n(1)不能把一個(gè)結(jié)構(gòu)變量當(dāng)作一個(gè)整體進(jìn)行輸入輸出及相關(guān)運(yùn)算操作,而只能對(duì)其最低一級(jí)成員分別進(jìn)行類似于同類型的普通變量一樣的輸入輸出及相關(guān)運(yùn)算操作。n例如:n

11、sum= stud1_score.score+ stud2_score.scorenstud1_score.exam_date.year=2005n(2)可以引用結(jié)構(gòu)變量成員的地址,也可引用結(jié)構(gòu)變量的地址。n例如:nprintf(“%x”, &stud1_score.num); /*輸出stud1_score.num的首地址*/nprintf(“%x”, &stud1_score); /*輸出stud1_score的首地址*/n結(jié)構(gòu)變量的地址一般用作函數(shù)的實(shí)參,用于傳遞結(jié)構(gòu)變量的數(shù)據(jù)。2.結(jié)構(gòu)變量的初始化結(jié)構(gòu)變量的初始化n與基本類型變量一樣,結(jié)構(gòu)變量可以在定義時(shí)賦初值,具體格式

12、如下:n struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名n n 成員表列成員表列n 結(jié)構(gòu)變量結(jié)構(gòu)變量=初值表初值表,結(jié)構(gòu)變量,結(jié)構(gòu)變量=初值表初值表;n或或 struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名n n 成員表列成員表列n ;nstruct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 結(jié)構(gòu)表列結(jié)構(gòu)表列n結(jié)構(gòu)變量結(jié)構(gòu)變量=初值表初值表n結(jié)構(gòu)變量初始化的格式,與一維數(shù)組類似,但在結(jié)構(gòu)變量的成員本身又是結(jié)構(gòu)類型時(shí),該成員的初值為一個(gè)初值表。n例如,例題10.2中的stud1_score=“05000102”, “wang qiang”,2006,12,20,90。n提示:提示:初值的數(shù)據(jù)類型,應(yīng)與結(jié)構(gòu)變量中相應(yīng)成員所要求的一

13、致,否則會(huì)出錯(cuò)。10.3結(jié)構(gòu)數(shù)組結(jié)構(gòu)數(shù)組n由例題10.1定義的結(jié)構(gòu)類型student _score只能存儲(chǔ)一個(gè)學(xué)生的成績(jī)數(shù)據(jù),如果要存儲(chǔ)一個(gè)班所有學(xué)生的成績(jī),則需要結(jié)構(gòu)數(shù)組。n10.3.1 結(jié)構(gòu)體數(shù)組的定義與初始化結(jié)構(gòu)體數(shù)組的定義與初始化n1結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)體數(shù)組的定義n與定義結(jié)構(gòu)類型變量的方法類似,但需要將其說明為數(shù)組。n定義一個(gè)結(jié)構(gòu)類型,并聲明一個(gè)具有3個(gè)元素,數(shù)組名為stud的結(jié)構(gòu)數(shù)組。nstruct stud_scoren char num9;n char name11; n float score;n ;n struct stud _score stud3 /*間接定義結(jié)構(gòu)體數(shù)組

14、stud3*/n以上定義的結(jié)構(gòu)體數(shù)組stud3中的每一個(gè)元素均為struct student_score類型數(shù)據(jù)。當(dāng)然,也可以直接定義一個(gè)結(jié)構(gòu)體數(shù)組stud3,例如:nstruct stud_scoren char num9;n char name11; n float score;n stud3;n注意:結(jié)構(gòu)數(shù)組中的各元素及其成員在內(nèi)存中都是連續(xù)存放的。2結(jié)構(gòu)體數(shù)組的初紿化結(jié)構(gòu)體數(shù)組的初紿化n對(duì)結(jié)構(gòu)體數(shù)組的初始化與其它類型的數(shù)組類似,當(dāng)然,結(jié)構(gòu)體數(shù)組初始化時(shí)要對(duì)其元素中的每一個(gè)成員初始化。n例如對(duì)以上定義的結(jié)構(gòu)數(shù)組進(jìn)行初始化。nstruct stud_score n char num9; n

15、 char name11; n float score;n stud3= “05001001”, “wang qiang”, 90.0,n“05001002”, “xu chen”,85.5, n“05001003”, “ zhang qing”, 86.0; n定義stud數(shù)組時(shí),元素的個(gè)數(shù)也可以不指定,即寫成如下形式:nstud = ,;n系統(tǒng)在編譯時(shí),根據(jù)給出初值結(jié)構(gòu)體常量的個(gè)數(shù)來確定數(shù)組元素的個(gè)數(shù)。數(shù)組的初始化還可以用下列形式初始化:nstruct stud_ infon char num9; n n n;nstruct stud_ info stud = ,;n因此,可以先聲明結(jié)構(gòu)類

16、型,然后定義結(jié)構(gòu)數(shù)組,在定義數(shù)組時(shí)初始化。n3結(jié)構(gòu)數(shù)組的應(yīng)用結(jié)構(gòu)數(shù)組的應(yīng)用n結(jié)構(gòu)數(shù)組的引入為存儲(chǔ)和處理多個(gè)同類型的結(jié)構(gòu)體類型變量帶來方便。n例題例題10.3結(jié)構(gòu)數(shù)組的應(yīng)用。定義、初始化結(jié)構(gòu)數(shù)組,并輸出數(shù)組元素。nstruct date n int year; n int month;n int day;n ;nstruct stud_ info /*定義結(jié)構(gòu)類型stud_info*/n char num9; /*用于存放學(xué)生的學(xué)號(hào)成員*/n char name11; /*用于存放學(xué)生姓名成員*/n char sex3; /*用于存放學(xué)生的性別成員*/n struct date birthday

17、; /*用于存放學(xué)生生日成員*/n stud4= “05001001”, “王強(qiáng)”, “男”, 1984,3,10,n“05001002”, “李莉”, “女”, 1983,12,10, n“05001003”, “張芹”, “女”, 1984,6,10,n“05001004”, “徐誠(chéng)”, “男”, 1983,2,15; nmain()nint i;n/*打印表頭,“”表示1個(gè)空格*/nprintf(“學(xué)號(hào)姓名性別出生日期n”);n /*輸出學(xué)生信息*/nfor(i=0;inum);n printf(“姓名:%sn”, p_st-name);n printf(“性別:%sn”, p_st-s

18、ex);nprintf(“出生日期:%d-%d-%dn”,p_st-birthday.year,p_st-birthday.month, p_st-birthday.day);n 運(yùn)行結(jié)果如下:學(xué)號(hào):05001001姓名:王強(qiáng)性別:男出生日期:1984-3-10n通過指向結(jié)構(gòu)變量的指針來訪問結(jié)構(gòu)變量的成員,與直接使用結(jié)構(gòu)變量的效果一樣。一般地說,如果指針變量pointer已指向結(jié)構(gòu)變量,則以下三種形式等價(jià):n結(jié)構(gòu)變量名.成員npointer-成員 n(*pointer).成員 n提示:n(1)在格式中,分量運(yùn)算符左側(cè)的運(yùn)算對(duì)象,只能是結(jié)構(gòu)變量,不能是指針變量。n(2)在格式中,減號(hào)“-”與大于

19、號(hào)“”組成指向運(yùn)算符“-”,指向運(yùn)算符左側(cè)的運(yùn)算對(duì)象,只能是指向結(jié)構(gòu)變量(或結(jié)構(gòu)數(shù)組)的指針變量,而不能是結(jié)構(gòu)變量,否則都出錯(cuò)。另外,指向運(yùn)算符“-”中的符號(hào)“-”和“”之間不能有空格。n(3)在格式中,“*pointer”外面的括號(hào)不能??!,因?yàn)榉至窟\(yùn)算符“.”的優(yōu)先級(jí)高于指針運(yùn)算符“*”,如果不加括號(hào),則變成了*(pointer.成員),因而產(chǎn)生語(yǔ)法錯(cuò)誤。10.3.3 指向結(jié)構(gòu)數(shù)組的指針指向結(jié)構(gòu)數(shù)組的指針n現(xiàn)在我們知道,定義一指針變量,用來指向一個(gè)結(jié)構(gòu)變量,此時(shí)指針變量的值就是所指向的結(jié)構(gòu)變量的首地址。當(dāng)然,指針變量也可用來指向結(jié)構(gòu)數(shù)組中的元素。如果用指針變量來指向結(jié)構(gòu)數(shù)組元素,同樣也可以

20、達(dá)到方便訪問結(jié)構(gòu)數(shù)組元素及元素中成員的目的。n例題例題10.5使用指針來訪問結(jié)構(gòu)數(shù)組的元素。n/*例題原代碼文件名:lt10_5.c*/nstruct date n int year; n int month;n int day;n ;nstruct stud_info /*定義結(jié)構(gòu)類型stud_info*/n char num9; /*用于存放學(xué)生的學(xué)號(hào)成員*/n char name11; /*用于存放學(xué)生姓名成員*/n char sex3; /*用于存放學(xué)生的性別成員*/n struct date birthday; /*用于存放學(xué)生生日成員*/n;n/*定義并初始化結(jié)構(gòu)數(shù)組stud */

21、nstruct stud_info stud4= “05001001”, “王強(qiáng)”, “男”, 1984,3,10, n“05001002”, “李莉”, “女”, 1983,12,10, n“05001003”, “張芹”, “女”, 1984,6,10,n“05001002”, “徐誠(chéng)”, “男”, 1983,12,10;nmain()n struct stud_info *p_stu=stud; /*定義指針變量p_stu,并使其指向結(jié)構(gòu)數(shù)組stud*/n int i=0;n /*打印表頭*/n printf(“學(xué)號(hào)姓名性別出生日期n”);n /*輸出所有學(xué)生信息*/nfor(i=0;i

22、4;i+)nfor( ; inum, p_stu-name, p_stu-sex);n printf(“%4d .%2d .%2dn”, p_stu-birthday.year, p_stu-birthday.month,np_stu-birthday.day);n n 程序運(yùn)行結(jié)果與例題10.3相同。10.3.4 指向結(jié)構(gòu)數(shù)據(jù)的指針作函數(shù)參數(shù)指向結(jié)構(gòu)數(shù)據(jù)的指針作函數(shù)參數(shù)n 例題例題10.6編寫一個(gè)output函數(shù),要求在主函數(shù)中通過調(diào)用output函數(shù),來實(shí)現(xiàn)輸出stud結(jié)構(gòu)數(shù)組各元素內(nèi)容的目的。nstruct date n int year; n int month;n int day;n

23、 ;nstruct stud_ info n char num9; n char name10; n char sex3; n struct date birthday; n;n/*定義并初始化一個(gè)外部結(jié)構(gòu)數(shù)組stud */nstruct stud_info stud4= 05001001,”王強(qiáng)”, ”男”, 1984.3.10, n05001002,”李莉”,”女”, 1983.12.10, n05001003, ”張芹”, ”女”, 1984.6.10,n05001002,”徐誠(chéng)”,”男”, 1983.12.10;n/*主函數(shù)main()*/nmain()n void output();

24、/*函數(shù)說明*/n int i=0;n /*打印表頭*/nprintf(“學(xué)號(hào)姓名性別出生日期n”);n/*輸出內(nèi)容*/n for( ; inum, p_stu-name, p_stu-sex);n printf(“%4d .%2d .%2dn”, p_stu-birthday.year, p _stu-birthday.month, np_stu-birthday.day);nn本例題是用指針變量*p_stu作為形式參數(shù),通過循環(huán)實(shí)參傳遞的是數(shù)組stud4各元素的首地址值。10.4鏈表及其應(yīng)用鏈表及其應(yīng)用n10.4.1鏈表的概念鏈表的概念n鏈表結(jié)構(gòu)作為一種常用的、能夠?qū)崿F(xiàn)動(dòng)態(tài)存儲(chǔ)分配的數(shù)據(jù)結(jié)

25、構(gòu)。它根據(jù)需要分配存儲(chǔ)空間,以避免內(nèi)存的浪費(fèi)。n鏈表的定義:鏈表是一種數(shù)據(jù)結(jié)構(gòu),它由這樣的一組結(jié)點(diǎn)(node)的序列組成,其中每個(gè)結(jié)點(diǎn)(除最后一個(gè)結(jié)點(diǎn)之外)總是與它后面結(jié)點(diǎn)相鏈接。圖10-1是一個(gè)最簡(jiǎn)單的單鏈表結(jié)構(gòu):n由圖10-1可以知道:n(1)頭指針變量head指向鏈表的首結(jié)點(diǎn)。n(2)每個(gè)結(jié)點(diǎn)由2個(gè)域組成:n數(shù)據(jù)域存儲(chǔ)結(jié)點(diǎn)本身的信息。n指針域指向后繼結(jié)點(diǎn)的指針。n(3)尾結(jié)點(diǎn)的指針域置為“null(空)”,作為鏈表結(jié)束的標(biāo)志。n鏈表中各元素在內(nèi)存中可以不連續(xù)存放。因此,要訪問鏈表中一個(gè)元素,必須要知道其上一個(gè)元素,由上一個(gè)元素提供的該元素的地址,才能訪問這個(gè)元素,所以要不知道一個(gè)鏈表的頭

26、節(jié)點(diǎn)(頭指針head)的地址,則就無法訪問整個(gè)鏈表。10.4.2創(chuàng)建鏈表創(chuàng)建鏈表n創(chuàng)建鏈表是指生成一個(gè)新的空鏈表,并依次往新鏈表中插入若干結(jié)點(diǎn),且保持所有結(jié)點(diǎn)間的前驅(qū)和后繼之關(guān)系。系統(tǒng)提供了以下一些函數(shù),以幫助用戶創(chuàng)建鏈表。n1創(chuàng)建鏈表相關(guān)的函數(shù)創(chuàng)建鏈表相關(guān)的函數(shù)n(1)malloc函數(shù)nc語(yǔ)言提供的一個(gè)庫(kù)函數(shù)malloc(),其功能是向系統(tǒng)申請(qǐng)一片地址連續(xù)的存儲(chǔ)空間(字節(jié)數(shù)為len),用于存放一個(gè)新的結(jié)點(diǎn)。n函數(shù)malloc()的原型為:void*malloc(unsigned size)nmalloc是有參函數(shù),調(diào)用該函數(shù)時(shí)的實(shí)參通常是要求分配存儲(chǔ)空間的字節(jié)數(shù),所以是無符號(hào)數(shù)。函數(shù)的返回值

27、是指向分配到的連續(xù)存儲(chǔ)空間首地址的一個(gè)指針。n(2)free函數(shù)nfree函數(shù)的原型為:nvoid free(void*p);n該函數(shù)的作用是釋放由p指向的一片連續(xù)的內(nèi)存存儲(chǔ)空間,讓這部分區(qū)域被其它變量使用。p是要釋放的這片存儲(chǔ)空間的首地址,是一個(gè)指針。n2創(chuàng)建鏈表的先決條件:創(chuàng)建鏈表的先決條件:n(1)根據(jù)需要?jiǎng)?chuàng)建的鏈表的結(jié)點(diǎn)的結(jié)構(gòu)構(gòu)造一結(jié)構(gòu)體數(shù)據(jù)類型n(2)必須有一個(gè)頭指針n(3)因?yàn)殒湵泶娣艑W(xué)生數(shù)據(jù)的結(jié)點(diǎn)在內(nèi)存中是不連續(xù)的,并且還沒有事先決定,所以應(yīng)使用malloc技術(shù)解決結(jié)點(diǎn)生成問題。n(4)各結(jié)點(diǎn)的鏈接是通過地址賦值實(shí)現(xiàn),所以實(shí)現(xiàn)地址賦值操作時(shí)將采用指針變量實(shí)現(xiàn)。n3新建鏈表舉例新建

28、鏈表舉例n例題例題10.7編寫一函數(shù)建立一個(gè)有3名學(xué)生數(shù)據(jù)的單向動(dòng)態(tài)鏈表n# define null 0 /*null代表0,用它表示空地址*/n# define len sizeof(struct student) /*定義鏈表中結(jié)點(diǎn)的長(zhǎng)度*/nstruct studentn long num;n float score;n struct student *next;n;nint n; /*n為全局變量,本文件模塊中各函數(shù)均可使用它*/nstruct student *creat(void)n struct student *head;nstruct student *p1,*p2;nn=0

29、;np1= p2=( struct student*)malloc(len); n/*開辟一個(gè)長(zhǎng)度為len的新結(jié)點(diǎn)。使malloc()函數(shù)返回的指針強(qiáng)制轉(zhuǎn)換為指向struct student 類型數(shù)據(jù)的指針,賦值給p1、p2 ,即p1、p2指向新結(jié)點(diǎn)*/nscanf(“%ld ,%f ”, &p1-num, &p1-score);nhead=null;nwhile(p1-num!=0) /*如果p1指向結(jié)點(diǎn)的學(xué)號(hào)成員值不為0則建立新結(jié)點(diǎn)*/n n=n+1;nif(n= =1) head=p1; /*若是第一個(gè)結(jié)點(diǎn)使head指向新開辟的結(jié)點(diǎn)*/nelse p2-next=p1;

30、/*使前一個(gè)結(jié)點(diǎn)的next指針指向后一個(gè)結(jié)點(diǎn)*/np2=p1; /*使p2指向剛建立的結(jié)點(diǎn)*/np1=( struct student*)malloc(len); /*p1指向新開辟的結(jié)點(diǎn)*/nscanf(“%ld ,%f n”, &p1-num, &p1-score);nnp2-next=null;n return(head); /*函數(shù)返回鏈表的頭地址*/n說明:說明:n(1) 函數(shù)首部*creat(void)的void表示沒有形參,不需要進(jìn)行數(shù)據(jù)傳遞。main()函數(shù)可以調(diào)用它.n(2) malloc函數(shù)開辟一個(gè)長(zhǎng)度為len的內(nèi)存區(qū),len前面已經(jīng)定義為sizeof(st

31、ruct student)即結(jié)構(gòu)體的長(zhǎng)度。malloc帶回的是不指向任何類型數(shù)據(jù)的指針。而p1、p2是指向struct student類型數(shù)據(jù)的指針變量,因此必須用強(qiáng)制類型轉(zhuǎn)換的方法使malloc返回的指針轉(zhuǎn)換為指向struct student類型數(shù)據(jù)的指針。在malloc(len)之前加“(struct student *)就是起這個(gè)作用。此處*表示轉(zhuǎn)換成指向struct student類型的指針。這樣才能使p1、p2指向它。n(3) head的值為null,這是鏈表為空時(shí)的情況。從鍵盤輸入一個(gè)學(xué)生的數(shù)據(jù)給第一個(gè)結(jié)點(diǎn)時(shí),如果輸入0約定表示建立鏈表的過程完成。如果輸入學(xué)號(hào)不為0,則進(jìn)入循環(huán)建立

32、鏈表。n(4) n是結(jié)點(diǎn)的個(gè)數(shù)。n(5)這個(gè)算法思路是讓p1指向新開辟的結(jié)點(diǎn),p2指向鏈表中最后一個(gè)結(jié)點(diǎn),把p1所指的結(jié)點(diǎn)連接在p2所指的結(jié)點(diǎn)后面,用p2-next=p1來實(shí)現(xiàn)。10.4.3對(duì)鏈表的操作對(duì)鏈表的操作n1.輸出鏈表輸出鏈表n依次輸出鏈表結(jié)點(diǎn)數(shù)據(jù)比較容易,首先知道head頭指針的值,設(shè)一個(gè)指針變量p,先指向第一個(gè)結(jié)點(diǎn),輸出p所指的結(jié)點(diǎn),然后使p后移一個(gè)結(jié)點(diǎn),再輸出,直到鏈表的尾結(jié)點(diǎn)。n例題例題10.8輸出例題10.7中創(chuàng)建的鏈表。nvoid output (struct student *head)n struct student *p;np=head;nif(head!=null

33、)ndon printf(%ld %5.1fn”,p-num,p-score);n p=p-next;n while(p!=null);n n2刪除鏈表中指定的結(jié)點(diǎn)刪除鏈表中指定的結(jié)點(diǎn)n對(duì)于已經(jīng)建立好的鏈表中的某個(gè)結(jié)點(diǎn)進(jìn)行刪除的方案:n以指定學(xué)號(hào)作為搜索要?jiǎng)h除結(jié)點(diǎn)的標(biāo)志,此學(xué)號(hào)用函數(shù)形參num接收從主函數(shù)傳來的實(shí)際值。定義p1、p2為兩結(jié)構(gòu)體類型的指針變量,p1用來搜索欲刪除結(jié)點(diǎn),采用p1=p1-next;語(yǔ)句實(shí)現(xiàn)搜索,p2緊隨其后,以p2=p1;實(shí)現(xiàn)。當(dāng)p1找到要輸出結(jié)點(diǎn),需考慮兩種情況:n(1)當(dāng)欲刪除的結(jié)點(diǎn)是頭結(jié)點(diǎn)時(shí),采用技術(shù)為:head=p1-next;見圖10-2(a)、 圖10-2

34、 (b)。n(2)當(dāng)欲刪除的結(jié)點(diǎn)是尾結(jié)點(diǎn)或鏈中其他結(jié)點(diǎn)時(shí),采用技術(shù)為:p2-next=p1-next;見圖10-3(a) 、圖10-3(b)。n例題例題10.9刪除例題10.8中創(chuàng)建的鏈表中一個(gè)指定學(xué)號(hào)的結(jié)點(diǎn)。n /*例題原代碼文件名:lt10_9.c*/nstruck student * erase(struck student *head,long num)n struck student *p1, *p2;nif(head=null)nprintf(“nlist null!n”); goto end;/*鏈表為空,結(jié)束操作*/np1= headnwhile(p1-num!=num&

35、;p1-next!=null) n/*p1指向的不是所找的結(jié)點(diǎn),并且后面還有結(jié)點(diǎn)*/n p2=p1;np1=p1-next;n /*p2緊跟p1,p1下移一個(gè)結(jié)點(diǎn)*/nif(p1-num = =num) /*找到了要?jiǎng)h除的結(jié)點(diǎn)*/nif(p1= =head) nhead=p1-next; /*若p1指向的是頭結(jié)點(diǎn),則把第二個(gè)結(jié)點(diǎn)地址賦給head */nelse np2-next=p1-next; /*否則下一個(gè)結(jié)點(diǎn)地址賦給前一個(gè)結(jié)點(diǎn)地址*/nprintf(“delete:%ldn”,num);nn=n-1; /*n為全局變量表示結(jié)點(diǎn)的個(gè)數(shù)*/nnelsenprintf(“%ld not bee

36、n found!n”,num);nend:nreturn(head); /*返回刪除后的鏈表頭指針*/n10.5共用型和枚舉型共用型和枚舉型n10.5.1共用型共用型n將若干個(gè)不同類型的變量存儲(chǔ)在同一段內(nèi)存空間的結(jié)構(gòu),稱為共用型數(shù)據(jù)結(jié)構(gòu)。n1共用體類型變量的定義方式共用體類型變量的定義方式n共用體類型變量的定義使用關(guān)鍵字union,其定義方式類似于結(jié)構(gòu)變量的定義方法,通常有以下兩種方式:n(1)先構(gòu)造共用體數(shù)據(jù)類型,再定義共用體數(shù)據(jù)類型變量n該方式定義格式如下:nunion 共用體數(shù)據(jù)類型名n 類型標(biāo)識(shí)符 成員名;n類型標(biāo)識(shí)符 成員名;n;nunion 共用體數(shù)據(jù)類型名 變量名表列n例如:n

37、union datan int i;n char ch;n float f;n ;n union data u1,u2;n(2)構(gòu)造共用體數(shù)據(jù)類型的同時(shí)定義共用體數(shù)據(jù)類型變量nunion 共用體數(shù)據(jù)類型名 /*此時(shí)數(shù)據(jù)類型名可缺省*/n 類型標(biāo)識(shí)符 成員名;n類型標(biāo)識(shí)符 成員名;n變量名表列;n例如:nunion data /*此時(shí)data可缺省*/n int i;n char ch;n float f;n u1,u2;n2共用體變量的引用共用體變量的引用n與訪問結(jié)構(gòu)體數(shù)據(jù)類型的變量相同,對(duì)共用體數(shù)據(jù)類型變量只能訪問其成員,而不能訪問共用體數(shù)據(jù)類型變量。訪問共用體數(shù)據(jù)類型變量成員的格式為:n

38、共用體數(shù)據(jù)類型名. 成員名n例如:u1.i、u1.ch;u2.i、u2.ch。n3共用體類型數(shù)據(jù)的特點(diǎn)共用體類型數(shù)據(jù)的特點(diǎn)n由于共用體數(shù)據(jù)類型的變量各成員被存儲(chǔ)在同一內(nèi)存空間中,因此共用變量的有如下特點(diǎn):n(1)在共用體有效作用范圍內(nèi),對(duì)共用體數(shù)據(jù)類型的變量或變量的任何成員取地址得到的結(jié)果相同。例如,& u1、&u1.i和&u1.ch的結(jié)果相同。n(2)由于共用體數(shù)據(jù)類型變量各成員共同使用同一個(gè)存儲(chǔ)空間,所以該存儲(chǔ)空間只能被各個(gè)成員分別使用,即在某一時(shí)刻,對(duì)變量的某個(gè)成員賦值后,該成員就獨(dú)占了此存儲(chǔ)空間,如果再對(duì)其他成員賦值,則前一成員的值就被覆蓋掉了,所以對(duì)共用體變量

39、的多個(gè)成員賦值時(shí)起作用的總是最后一個(gè)。也不能對(duì)共用體數(shù)據(jù)類型變量進(jìn)行初始化操作。n也不能對(duì)共用體數(shù)據(jù)類型變量進(jìn)行初始化操作。n(3)共用體數(shù)據(jù)類型的變量不能作為函數(shù)形參,函數(shù)也不能返回共用體數(shù)據(jù)類型的數(shù)據(jù),但可以使用指向共用體數(shù)據(jù)類型數(shù)據(jù)的指針變量作為函數(shù)的形參,并且函數(shù)也能返回指向共用體數(shù)據(jù)類型數(shù)據(jù)的指針。n(4)在構(gòu)造共用體數(shù)據(jù)類型時(shí)可以用結(jié)構(gòu)體數(shù)據(jù)類型的成員,同樣,在定義結(jié)構(gòu)體數(shù)據(jù)類型時(shí)也可以包含共用體數(shù)據(jù)類型的成員。n10.5.2枚舉型枚舉型n當(dāng)一個(gè)變量只有幾個(gè)可能的取值時(shí),就可以定義為枚舉型。枚舉型變量的值只能是列舉出來的值的范圍內(nèi)。n1定義枚舉類型定義枚舉類型n定義枚舉類型的關(guān)鍵字

40、是enum,其格式如下:nenum 枚舉類型名 取值表; /*取值表中的名數(shù)據(jù)項(xiàng)用“,”隔開*/n例如,enum weekdaysun, mon, tue, wed, thu, fri, sat;n2聲明枚舉型變量聲明枚舉型變量n定義了枚舉類型,就可以聲明枚舉型變量,與結(jié)構(gòu)體變量聲明方法類似,也有以下兩種:n(1)先定義枚舉類型,再聲明枚舉型變量。例如:nenum weekday sun, mon, tue, wed, thu, fri, sat;nenum weekday workday, freeday;n(2)在定義枚舉類型同時(shí)聲明枚舉型變量。例如:nenum weekdays /*此時(shí)枚舉類型名為可選項(xiàng)*/nsun, mon, tue, wed, thu, fri, satworkday, freeday;n3說明說明n(1)枚舉型變量的取值表中的值稱為枚舉元素,由于c編譯

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論