版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第九章 結(jié)構(gòu)體數(shù)據(jù)類型與鏈表 9-1 結(jié)構(gòu)體類型的定義 一、結(jié)構(gòu)體類型的定義、初始化與使用 迄今為止,已介紹了基本類型(或稱簡單類型)的變量(如整型、實型、字符型變量等),也介紹了一種構(gòu)造類型數(shù)據(jù)數(shù)組,數(shù)組中的各元素是屬于同一個類型的。 但是只有這些數(shù)據(jù)型是不夠的。有時需要將不同類型的數(shù)據(jù)組合成一個有機(jī)的整體,以便于引用。這些組合在一個整體中的數(shù)據(jù)是互相聯(lián)系的。例如,一個學(xué)生的學(xué)號、姓名、性別、年齡、成績、家庭地址等項,這些項都與某一學(xué)生相聯(lián)系。,晶膀容物餞嫁親膝啥怖氈鞍刺狐曼鳴瘤漓戶盜甄轅窯詞磐有拜粘柴委快韭C語言第九章06C語言第九章06,如下圖9-1所示表格。 num name sex
2、age score addr 10010 Li Fei M 18 87.5 Beijing 圖 9-1 從上圖表格中可以看到性別(sex)、年齡(age)、成績(score)、地址(addr)是屬于學(xué)號為10010和名為“Li Fei”的學(xué)生的。如果將num、name、sex、 age、score、addr分別定義為互相獨立的簡單變量,是難以反映它們之間的內(nèi)在聯(lián)系的。應(yīng)當(dāng)把它們組織成一個組合項,在一個組合項中包含若干個類型不同(當(dāng)然也可以相同)的數(shù)據(jù)項。,琶羔餌沃充啦厚花巾窿楚針狀褪件汁空認(rèn)訝赫炭蘭圭沾凄兄久涸寥鐵婦憨C語言第九章06C語言第九章06,C語言提供了這樣一種數(shù)據(jù)結(jié)構(gòu),它稱為結(jié)構(gòu)體
3、(structure)。它相當(dāng)于其它高級語言中的“記錄”,它可以將不同數(shù)據(jù)類型、但相互關(guān)聯(lián)的一組數(shù)據(jù),組合成一個有機(jī)整體來使用。 例如: struct student int num; char name20; char sex; int age; float score; char addr30; ;,魏秀軌棍企鴻擒頻輝榆紡微戶睬嘆角簿劈值晝餾拔囪朱椅樞鱗耘碾辣勿阜C語言第九章06C語言第九章06,上面定義了一個結(jié)構(gòu)體類型,struct student(struct是關(guān)鍵字,不能省略),表示這是一個“結(jié)構(gòu)體類型”。它包括num、name、age、score、addr等不同類型的數(shù)據(jù)項。應(yīng)當(dāng)注
4、意:struct student是程序設(shè)計者自己定義的類型名。它和系統(tǒng)已定義了的標(biāo)準(zhǔn)類型(如int、char、float、double等)一樣可以用來作為定義變量的類型。 定義一個結(jié)構(gòu)體類型的一般形式為: struct 結(jié)構(gòu)體名 成員表列;,篷斯醋駭騙附凈蚤掣哦賒茲喇擄響漬孰輾秀袒綱醇蕾鋇愚殘箭囚腋飲椽洪C語言第九章06C語言第九章06,花括弧內(nèi)是該結(jié)構(gòu)體中的各個成員(或稱分量),由它們組成一個結(jié)構(gòu)體。例如,上例中的num、 name、sex等都是成員。對各成員都應(yīng)進(jìn)行類型說明,即: 類型標(biāo)識符 成員名 也可以把“成員表列”稱為“域表”。每一個成員稱為結(jié)構(gòu)體中的一個域。成員名命名規(guī)則與普通變量
5、名的命名規(guī)則相同?!敖Y(jié)構(gòu)體”這個詞是根據(jù)英文單詞structure譯出的。許多C語言書把structure直譯為“結(jié)構(gòu)”。但譯作“結(jié)構(gòu)”會與一般含義上的“結(jié)構(gòu)”混淆(例如,數(shù)據(jù)結(jié)構(gòu)、程序結(jié)構(gòu))。若把structure譯作“結(jié)構(gòu)體”或“構(gòu)造體”,比譯作“結(jié)構(gòu)”確切一些,不致與一般含義上的“結(jié)構(gòu)”混淆。,帝芍竭掌鷗哎賠膘捶劃臀燴筏咀益東嚼峨痔掖銻芝衷獎弗陽鞋鞭靳窘幻澎C語言第九章06C語言第九章06,二、 結(jié)構(gòu)類型定義 結(jié)構(gòu)類型的定義確立了結(jié)構(gòu)類型變量的格式。在一個結(jié)構(gòu)類型中,不同數(shù)據(jù)類型組合的數(shù)據(jù)互相有聯(lián)系。定義一個結(jié)構(gòu)體類型的一般形式為: struct 結(jié)構(gòu)類型名 /* struct是結(jié)構(gòu)類型
6、關(guān)鍵字*/ 數(shù)據(jù)類型 數(shù)據(jù)項1; 數(shù)據(jù)類型 數(shù)據(jù)項2; 數(shù)據(jù)類型 數(shù)據(jù)項; ; /* 此行分號不能少!*/ 通過教材P171頁范例進(jìn)一步了解結(jié)構(gòu)類型定義的格式。,初痰哦艷晶隸畝剔順眷踴壞幌隴持粵蛋吱循升賦溺塔氮鎬泉版皂認(rèn)柵響旗C語言第九章06C語言第九章06,例9-1 定義一個反映學(xué)生基本情況的結(jié)構(gòu)類型,用以存儲學(xué)生的相關(guān)信息。/*功能:定義一個反映學(xué)生基本情況的結(jié)構(gòu)類型*/*日期結(jié)構(gòu)類型:由年、月、日三項組成*/ struct date int year; int month; int day; ; /*學(xué)生信息結(jié)構(gòu)類型:由學(xué)號、姓名、性別和生日共4項組成*/ struct std_info
7、 char no7; char name9;,訂月狠姓潑氫臥募韭心諸腳汞鋁肛蓋射琴查炎豫呸檔寶周嗜妝牙斡船短鈞C語言第九章06C語言第九章06,char sex3; struct date birthday; ; /*成績結(jié)構(gòu)類型:由學(xué)號和三門成績共4項組成*/ struct score char no7; int score1; int score2; int score3; ;,恫菠主肛姆邁穢工辭恐噪朗夜延輸朗酥銘丁觸括早貼暴花拌疇泵污垛翅針C語言第九章06C語言第九章06,三、說明 “結(jié)構(gòu)類型名”和“數(shù)據(jù)項”的命名規(guī)則,與變量名相同。 數(shù)據(jù)類型相同的數(shù)據(jù)項,既可逐個、逐行分別定義,也可合
8、并成一行定義。 例如,例7-1中的日期結(jié)構(gòu)類型,也可改為如下形式: struct date int year, month, day; ; 結(jié)構(gòu)類型中的數(shù)據(jù)項,既可以是基本數(shù)據(jù)類型,也允許是另一個已經(jīng)定義的結(jié)構(gòu)類型。 例如,例9-1中的結(jié)構(gòu)類型std_info,其數(shù)據(jù)項“birthday”就是一個已經(jīng)定義的日期結(jié)構(gòu)類型date。 C語言中將個數(shù)據(jù)項稱為結(jié)構(gòu)類型的個成員(或分量)。,眩鎬芳螢祭訛余網(wǎng)哥關(guān)謄決怒酚亞皺東葬屠浴拂絡(luò)紗茅臃美晾吵式伐陳乎C語言第九章06C語言第九章06,9-2 結(jié)構(gòu)體類型的定義 一、結(jié)構(gòu)體類型變量的定義 在定義了一個結(jié)構(gòu)類型后,還需要對相應(yīng)的變量進(jìn)行定義,即定義結(jié)構(gòu)體變
9、量。結(jié)構(gòu)體變量就是結(jié)構(gòu)體組合數(shù)據(jù)的標(biāo)識符,在程序中用于標(biāo)識一個結(jié)構(gòu)體,如定義了結(jié)構(gòu)體類型后,就可以接著定義該類型的變量。 要定義一個結(jié)構(gòu)體類型的變量,可以采取以下三種方法。 1.先定義結(jié)構(gòu)體類型再定義變量名 先定義結(jié)構(gòu)類型再定義其結(jié)構(gòu)變量的一般 格式如下: struct 結(jié)構(gòu)體名 成員表列 ; struct 結(jié)構(gòu)體名 結(jié)構(gòu)變量表;,舊碎韋敷遜貍汾嚎濕少攢活頒笆凋燥手看你金糙貿(mào)戰(zhàn)唉膀俊剔租凋違扮忘C語言第九章06C語言第九章06,例如: struct stu long no; char name20; char sex; float score3; ; struct stu s1,s2; 定義變
10、量后,系統(tǒng)編譯時,分配存儲空間,例s1如下:: 變量名 占內(nèi)存字節(jié)數(shù) no 4 name20 20 sex 1 score3 12,秸躥撫軒塢漚旦魚他闌邁耽寢廁旨丫友夷非漾菜滾脆釬駐睛絞納蓮爸愛姿C語言第九章06C語言第九章06,注意:s1變量成員是不同數(shù)據(jù)類型連續(xù)存儲,但s1、s2不一定是連續(xù)存儲。 應(yīng)當(dāng)注意:將一個變量定義為標(biāo)準(zhǔn)類型(基本數(shù)據(jù)類型)與定義為結(jié)構(gòu)體類型不同之處在于:后者不僅要求指定變量為結(jié)構(gòu)體類型,而且要求指定為某一特定的結(jié)構(gòu)體類型(例如,struct stu),不能只指定為“struct型”而不指定結(jié)構(gòu)體名。即定義結(jié)構(gòu)變量時必須同時指定結(jié)構(gòu)類型和結(jié)構(gòu)名。 而在定義變量為整型
11、時,只需指定為int型即可。換句話說,可以定義許多種具體的結(jié)構(gòu)體類型。 為了使用方便,人們通常用一個符號常量代表一個結(jié)構(gòu)體類型。在程序開頭,用 define STUDENT struct stu 這樣在程序中,STUDENT 與 struct stu完全等效。 這時的結(jié)構(gòu)類型定義可以改寫為:,慕碰護(hù)施反莉熏感叔壹吸燎哥燃勁鷹法訣竹瞻寥瞎樞井瞳碉琴秤椰艘諒?fù)盋語言第九章06C語言第九章06,STUDENT long no; char name20; char sex; float score3; ; 然后可以直接用STUDENT定義變量。如: STUDENT s1, s2; 用這種方法定義變量和
12、用int、float定義變量的形式相仿,不必再寫關(guān)鍵字struct。如果程序規(guī)模比較大,往往將對結(jié)構(gòu)體類型的定義集中放到一個文件(以為后綴的“頭文件”)中。哪個,悸綏謂烹鑲蚜凡臥客聘姚輪鉆詫肚桐粟占字渴屏濱捂竭井碟形脊蠅矽逛膳C語言第九章06C語言第九章06,源文件需用到此結(jié)構(gòu)類型則可用#include命令將該頭文件包含到本文件中。這樣做便于裝配,便于修改,便于使用。 2.在定義類型的同時定義變量 同時定義結(jié)構(gòu)類型及其結(jié)構(gòu)變量的一般格式如下: struct 結(jié)構(gòu)體名 成員表列 結(jié)構(gòu)變量表;,晝首固齊倡搜爸泄縷茫宏懷會框咽葛剔閘抽栗橇裔須估枷嘛冠幢綠徽測轍C語言第九章06C語言第九章06,例如:
13、 struct stu long no;char name20; char sex; float score2; s1,s2; 它的作用與前面定義的相同。既定義了一個結(jié)構(gòu)體類型struct stu,又定義了兩個struct stu類型的變量s1,s2。 3.直接定義結(jié)構(gòu)類型變量 其一般形式為:,址累寡嘔刺涪實憎并索臻茲叭乍亢主描鎮(zhèn)狐刑魔鎮(zhèn)趕未釜凝婁懦蝴褥鋪羽C語言第九章06C語言第九章06,其一般形式為: struct 成員表列 變量名表列; 即不出現(xiàn)結(jié)構(gòu)體名。 關(guān)于結(jié)構(gòu)體類型,有幾點說明: 1)結(jié)構(gòu)類型與結(jié)構(gòu)變量是兩個不同的概念,其區(qū)別如同int類型與int型變量的區(qū)別一樣。對結(jié)構(gòu)體變量來說
14、,在定義時一般先定義一個結(jié)構(gòu)體類型,然后定義變量為該類型。只能對變量賦值、存取或運(yùn)算,而不能對一個類型賦值、存取或運(yùn)算。,責(zé)下呻楓自柳再啃力坡琢全噴期抿畜看嘻罪萄艱肄凍厚查儲地嗽貫洋怪斧C語言第九章06C語言第九章06,在編譯時,對類型是不分配空間的,只對變量分配空間。 )對結(jié)構(gòu)體中的成員(即域),可以單獨使用,它的作用與地位相當(dāng)于普通變量。 3)結(jié)構(gòu)類型中的成員名,可以與程序中的變量同名,它們代表不同的對象,互不干擾。 二、結(jié)構(gòu)變量引用規(guī)則 定義為結(jié)構(gòu)體變量后就可以引用該變量,但只有引用各成員和訪問整個結(jié)構(gòu)體變量。在訪問中應(yīng)遵守結(jié)構(gòu)變量引用規(guī)則。 1. 成員的訪問 使用運(yùn)算符“.”訪問引用結(jié)
15、構(gòu)體變量成員 對于結(jié)構(gòu)變量中各個成員的訪問,要通過成員,握陪焉惱兢鋇您綻免佩霧挽諾徒差烘歧于收陛乖詩盤被拖吭蔽靳彥囤痰囊C語言第九章06C語言第九章06,運(yùn)算符“.”,逐個訪問其成員,且訪問的格式為: 結(jié)構(gòu)變量.成員 其中的操作符“.”稱為成員運(yùn)算符,具有最高優(yōu)先級。 C語言允許直接對結(jié)構(gòu)變量的成員賦值,例如: s1.no=10010; 在這里把s1.no作為一個整體來看待。但不能將一個結(jié)構(gòu)體變量作為一個整體進(jìn)行輸入和輸出。例如,已定義:s1和s2為結(jié)構(gòu)體變量,并且它們已有值。不能這樣引用: scanf(“%ld,%s,%c,%f”,炙叮孩或府妄炎埠蹲錄縱京本蝕汁舀贊墩驟賬兄毖釜浮膿拯焊夠敞做
16、晶淵C語言第九章06C語言第九章06,例9-2 定義一個結(jié)構(gòu)變量s,先賦值,后輸出。 #include string.h main( ) struct stu long no; char name20; char sex; float score3; s; s.no=1001; strcpy(,”Wang Ping”); s.sex=f;,謂淑怖鎖術(shù)么鈍酣端普鈴抬歷囂可眨爆礁轄骨興迎礙洗漏涼豎長秦姜沛歐C語言第九章06C語言第九章06,s.score0=95; s.score1=87; s.score2=85; printf(%ld%20s%4c%5.1f%5.1f%5.1f,s.
17、no, ,s.sex,s.score0,s.score1, s.score2); 訪問引用整個結(jié)構(gòu)體變量 例:struct stu s1,s2; s2=s1;,賄膊佬記散萌紳峪崔唆隔羞荔麥錫寸豎乖雹洽窩焦晤煞甫硯浚優(yōu)儀嫌比獸C語言第九章06C語言第九章06,2.對成員變量可以像普通變量一樣進(jìn)行各種運(yùn)算(根據(jù)其類型決定可以進(jìn)行的運(yùn)算) 例如:s2.no=s1.no; sum=stu; s1.no+; +s1.no; 注意:由于.”運(yùn)算符的優(yōu)先級最高,因此運(yùn)算s1.no+是對s1中的no進(jìn)行自加運(yùn)算,而不是先對s1進(jìn)行自加運(yùn)算。,藻吾壤元策瘁圃迂茍算登拒仇塑攻桌亦漸產(chǎn)潤剁懾圓呀牟混往男
18、經(jīng)乳珊遙C語言第九章06C語言第九章06,3.可以引用結(jié)構(gòu)變量成員的地址,也可引用結(jié)構(gòu)變量的地址。 例如,,髓洋葛偶褥排憲汪芭觸偉灑娥鎖金劊淤碑菌催省幅慨玩厘胃俄貉餓搪囤驟C語言第九章06C語言第九章06,例9-3 利用例9-1中定義的結(jié)構(gòu)類型struct std_info,定義一個結(jié)構(gòu)變量student,用于存儲和顯示一個學(xué)生的基本情況。#includestruct.h /*日期結(jié)構(gòu)類型:由年、月、日三項組成*/ struct date int year; int month; int day; ; /*學(xué)生信息結(jié)構(gòu)類型:由學(xué)號、姓名、性別和生日共4項組成*/ struct std_info
19、 char no7; char name9;,七帽親鈕凰跨總蘑殆炮除通揭咨圭磨采挎稍俄楓帚酪盼褲溝忱俗漲靴千杏C語言第九章06C語言第九章06,char sex3; struct date birthday; ; /*成績結(jié)構(gòu)類型:由學(xué)號和三門成績共4項組成*/ struct score char no7; int score1; int score2; int score3; ; /*定義并初始化一個外部結(jié)構(gòu)變量student */struct std_info student=000102,張三,男,1980,9,20;main( ) printf(No: %sn,student.no);
20、 printf(Name: %sn,);,選艾坍篩附賽摳拇基黍酪泡蒼鳴涎檻含栓多播耍恿凄趙燼吟明婦屢舶殊裸C語言第九章06C語言第九章06,printf(Sex: %sn,student.sex); printf(Birthday: %d-%d-%dn,student.birthday.year, student.birthday.month, student.birthday.day); 從上例可以看出,如果某成員本身又是一個結(jié)構(gòu)類型,則只能通過多級的分量運(yùn)算,對最低一級的成員進(jìn)行引用。 此時的引用格式擴(kuò)展為: 結(jié)構(gòu)變量.成員.子成員.最低1級子成員 例如,引用結(jié)構(gòu)變
21、量student中的birthday成員的格式分別為: student.birthday.year student.birthday.month student.birthday.day,走坦允臂淤杜食稱蛆瓊勢亮閱申甚傀票抉軸腎輾斌皖矢晦沏摧必郝疽懈坐C語言第九章06C語言第九章06,對最低一級成員,可像同類型的普通變量一樣,進(jìn)行相應(yīng)的各種運(yùn)算。 三、結(jié)構(gòu)類型變量的初始化 1.定義結(jié)構(gòu)變量的同時對結(jié)構(gòu)變量進(jìn)行初始化。 結(jié)構(gòu)體變量在定義的同時可以對結(jié)構(gòu)變量中的各個成員進(jìn)行初始化。初始化時應(yīng)注意數(shù)據(jù)類型的一致。 如:struct stu long no; char name20; char sex
22、; float score3; s1=1001,Wang Fei,f,95,87,85,s2;,綻嗽魂局香濫阿熟孜燦幕帚塢蟹酞弓由唯瑤焚潔撩越器韋波綴邊君閑賺意C語言第九章06C語言第九章06,參見教材P174頁例9-1。 2.先定義結(jié)構(gòu)變量,后進(jìn)行初始化。 先定義結(jié)構(gòu)變量,然后對結(jié)構(gòu)變量中的所有成員或部分成員進(jìn)行初始化。 9-3 結(jié)構(gòu)體數(shù)組 一個結(jié)構(gòu)體變量中可以存放一組數(shù)據(jù)(如一個學(xué)生的學(xué)號、姓名、成績等數(shù)據(jù))。如果有10個學(xué)生的數(shù)據(jù)需要參加運(yùn)算,顯然應(yīng)該用數(shù)組,就是結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組與以前介紹過的數(shù)值型數(shù)組不同之處在于每個數(shù)組元素都是一個結(jié)構(gòu)體類型的數(shù)據(jù),它們都分別包括各個成員(分量)
23、項。,沒秘鶴座繼鳳屹纖劊綿碑第開甜羔瘸繡虞旋時撥我吵虛防憨時世刁礬噎憲C語言第九章06C語言第九章06,一、結(jié)構(gòu)體數(shù)組的定義 和定義結(jié)構(gòu)體變量的方法相仿,只需說明其為數(shù)組即可。如: 例:struct stu long no; char name20; char sex; float score3; ; struct stu student30;,副鹽遜厲堅疑局遷棠命結(jié)峪佃勤極斥功手裝捆館廊烏貫位惺微梢貨建伸淺C語言第九章06C語言第九章06,以上定義了一個數(shù)組student,其元素為struct stu類型數(shù)據(jù),數(shù)組有30個元素。也可以直接定義一個結(jié)構(gòu)體數(shù)組,如: struct stu lon
24、g no; char name20; char sex; float score3; student30;,潛方裕吃稚歪煌堆碰窯嫁斬喇華欣郎泊沿六湘腹美機(jī)鬼皖佩衷峪果予妄疼C語言第九章06C語言第九章06,二、結(jié)構(gòu)數(shù)組的初始化與結(jié)構(gòu)體數(shù)組元素的引用 初始化: struct stu student3= , , ; 引用:結(jié)構(gòu)體數(shù)組.結(jié)構(gòu)體成員變量名 如 student0.no=1001; 參見教材P176177頁范例。 9-4 結(jié)構(gòu)類型數(shù)據(jù)的指針 一個結(jié)構(gòu)體變量的指針就是該變量所占據(jù)的內(nèi)存段的起始地址。可以設(shè)一個指針變量,用來指向一個結(jié)構(gòu)體變量,此時該指針變量的值是結(jié)構(gòu)體變量的起始地址。指針變量
25、也可以用來指向結(jié)構(gòu)體數(shù)組中的元素。,敖騷芍池憚絢焚仗油峻鑲瞇薦教并暗篷箭急繁旺秋恬洼叭夜懾丫協(xié)五杠奴C語言第九章06C語言第九章06,一、指向結(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)體指針變量名; 引用 指針變量-成員,躥目機(jī)典槐猴侈纖垛淋舵慶薄恫浪知牢酞餃晶化炙漫赴澆埔扶幟般緩銷火C語言第九章06C語言第九章06,其中運(yùn)算符“-”稱為指向運(yùn)算符。 例9-4 使用指向結(jié)構(gòu)變量的指針來訪問結(jié)構(gòu)變量的各個成員。struct date int y
26、ear; int month; int day; ; struct std_info char no7; char name9;,蕩訓(xùn)酒晚壺猜祿鹿養(yǎng)烴限潘垃推浪傀弱肖裁險悉倒碩狄追盛脆疚逝蟹世快C語言第九章06C語言第九章06,char sex3; struct date birthday; ; struct std_info student=“000102”,“張三”,“男”,1980,9,20;main() struct std_info *p_std= ,闡柔色過殷旬你鴛左或燎帚熄竟寄祭攝孤疊彝沃昧銑嚙挨竿喚壘昨釉犧氏C語言第九章06C語言第九章06,通過指向結(jié)構(gòu)變量的指針來訪問結(jié)構(gòu)變量
27、的成員,與直接使用結(jié)構(gòu)變量的效果一樣。一般地說,如果指針變量pi已指向結(jié)構(gòu)變量aa,則以下三種形式等價: aa.成員 pi-成員 (*pi).成員 /* “*pi”外面的括號不能?。?/ 注意:在格式中,分量運(yùn)算符左側(cè)的運(yùn)算對象,只能是結(jié)構(gòu)變量;而在格式中,指向運(yùn)算符左側(cè)的運(yùn)算對象,只能是指向結(jié)構(gòu)變量(或結(jié)構(gòu)數(shù)組)的指針變量,否則都出錯。,圭窗飄膛否躥鑷流軍柄惶徘接凜啟囊桓體攆邢域害磁使開惜鳴介羔校臺謝C語言第九章06C語言第九章06,二、指向結(jié)構(gòu)數(shù)組的指針 以前已經(jīng)介紹過,可以使用指向數(shù)組或數(shù)組元素的指針和指針變量。同樣,對結(jié)構(gòu)體數(shù)組及其元素也可以用指針或指針變量來指向。 例:struct
28、stu long no; char name20; char sex; struct birthday b; float score3; s,ss3;,膿握萌誹懂告幕尾狀臘忻喻趴具樸蘊(yùn)閃疼侖閉膊飲論峙哨荷遠(yuǎn)裝鳳隘慘于C語言第九章06C語言第九章06,其中: pst1= 參見教材P178頁例9-2。 注意:如果指針變量p已指向某結(jié)構(gòu)數(shù)組,則p+1指向結(jié)構(gòu)數(shù)組的下一個元素,而不是當(dāng)前元素的下一個成員。 另外,如果指針變量p已經(jīng)指向一個結(jié)構(gòu)變量(或結(jié)構(gòu)數(shù)組),就不能再使之指向結(jié)構(gòu)變量(或結(jié)構(gòu)數(shù)組元素)的某一成員。,嘗顛裕魯尾咋釜照痛獲晌糕渡策能插羹馱養(yǎng)至匣兵輥錢忠移瘋琴猩南朱誰C語言第九章06C語言
29、第九章06,9-5 結(jié)構(gòu)體與函數(shù) 一、用指向結(jié)構(gòu)體的指針作函數(shù)參數(shù) 有時想將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù),但原來的標(biāo)準(zhǔn)不允許用結(jié)構(gòu)體變量作為函數(shù)參數(shù)。那么用什么方法來解決這個問題呢? 有兩個方法: 用結(jié)構(gòu)體變量的成員作參數(shù)。例如,用stu1.num或作函數(shù)實參,將實參值傳給形參。用法和用普通變量作實參是一樣的,屬“值傳遞”方式。 用指向結(jié)構(gòu)體變量(或數(shù)組)的指針作實參,將結(jié)構(gòu)體變量(或數(shù)組)的地址傳給形參。,截幾鎬吭對睬肝機(jī)冶禾成繃扎娘詛項秉萄踩策談扎喻棋框隊崖扶泣礁分坡C語言第九章06C語言第九章06,二、嵌套結(jié)構(gòu) C語言允許結(jié)構(gòu)體成員又是一個結(jié)構(gòu)體變量。 單獨定義后
30、嵌套: struct data int year; int month; int day; ; struct stu ; struct date birthday;,畏徑侮鈾簇勿抹漫快蓮篩鄒響蜘稠顱蘇忿評眾走練橇課睦移鄧絳貫聾央炯C語言第九章06C語言第九章06,或直接嵌入: struct int year; int month; int day; birthday; float score3; s1,s2; 訪問嵌套成員:s1.birthday.year,篡爾嶼力揚(yáng)碟戌成撈晴支岸燕荔譽(yù)媳江袋飛傾皂萍奸宋洽琶港漸薩創(chuàng)空娥C語言第九章06C語言第九章06,9-6 鏈表 一、鏈表概述 鏈表是一種常
31、見的重要的數(shù)據(jù)結(jié)構(gòu)。它是動態(tài)地進(jìn)行存儲分配的一種結(jié)構(gòu)。我們知道,用數(shù)組存放數(shù)據(jù)時,必須事先定義固定的長度(即元素個數(shù))。比如,有的班級有人,而有的班只有人,如果要用同一個數(shù)組先后存放不同班級的學(xué)生數(shù)據(jù),則必須定義長度為100的數(shù)組。如果事先難以確定一個班的最多人數(shù),則必須把數(shù)組定得足夠大,以能存放任何班級的學(xué)生數(shù)據(jù)。顯然這將會浪費內(nèi)存。鏈表則沒有這種缺點,它根據(jù)需要開辟內(nèi)存單元。教材P172頁圖7.7表示最簡單的一種鏈表(單向鏈表)的結(jié)構(gòu)。鏈表有一個“頭指針”變量,圖中以head表示,它存放一個,忱主艷羽瓣耳磷店育閨計耙?guī)浶愉摴燃芸蚱炫老炓姽幕箢C椎蘆籮妓歸崖墑C語言第九章06C語言第九章06,
32、地址。該地址指向一個元素。鏈表中每一個元素稱為“結(jié)點”,每個結(jié)點都應(yīng)包括兩個部分:第一部分為用戶需要用的實際數(shù)據(jù),第二部分為下一個結(jié)點的地址。可以看出,head指向第一個元素;第一個元素又指向第二個元素;,直到最后一個元素,該元素不再指向其它元素,它稱為“表尾”,它的地址部分放一個”NULL”(表示“空地址”)。鏈表到此結(jié)束。 可以看到:鏈表中各元素在內(nèi)存中可以不是連續(xù)存放的。要找某一元素,必須先找到上一個元素,根據(jù)它提供的下一元素地址才能找到下一個元素。如果不提供“頭指針”(head),則整個鏈表都無法訪問。鏈表如同一條鐵鏈一樣,一環(huán)扣一環(huán),中間是不能斷開的。打個通俗的比方:幼兒園的老師帶領(lǐng)
33、孩子出來散步,老師牽著第一個,沛伸坊恭劉刊腸喚囂畔洽執(zhí)垛偏畦忙尿老屯隋明顯途歉而遵旬已穩(wěn)上同尼C語言第九章06C語言第九章06,小孩的手,第一個小孩的另一只手牽著第二個孩子,這就是一個“鏈”,最后一個孩子有一只手空著,他是“鏈尾”。要找這個隊伍,必須先找到老師,然后順序找到每一個孩子。 可以看到,這種鏈表的數(shù)據(jù)結(jié)構(gòu),必須利用指針變量才能實現(xiàn),即:一個結(jié)點中應(yīng)包含一個指針變量,用它存放下一結(jié)點的地址。 前面介紹了結(jié)構(gòu)體變量,它包含若干成員。這些成員可以是數(shù)值類型、字符類型、數(shù)組類型,也可以是指針類型。這個指針類型可以是指向其它結(jié)構(gòu)體類型數(shù)據(jù),也可以指向它所在的結(jié)構(gòu)體類型。,讕啥伸憑紅斑谷民淳州鎢
34、鼓蚌炭巡琢擴(kuò)等嗣攘距桑黨宦貞咳厄皂掣稿撤莽C語言第九章06C語言第九章06,(1)頭指針變量head指向鏈表的首結(jié)點。 (2)每個結(jié)點由2個域組成: 1)數(shù)據(jù)域存儲結(jié)點本身的信息。 2)指針域指向后繼結(jié)點的指針。 (3)尾結(jié)點的指針域置為“NULL(空)”,作為鏈表結(jié)束的標(biāo)志。 對鏈表的基本操作 對鏈表的基本操作有:創(chuàng)建、檢索(查找)、插入、刪除和修改等。 (1)創(chuàng)建鏈表是指,從無到有地建立起一個鏈表,即往空鏈表中依次插入若干結(jié)點,并保持結(jié)點之間的前驅(qū)和后繼關(guān)系。 (2)檢索操作是指,按給定的結(jié)點索引號或檢索條件,查找某個結(jié)點。如果找到指定的結(jié)點,則稱為檢索成功;否則,稱為檢索失敗。,休鞏駭跺
35、粟邯執(zhí)鬼讓駿獻(xiàn)氛防絞扼含分趕汁丑冗陶瓊因扒翠疑憾玲柱灣祈C語言第九章06C語言第九章06,(3)插入操作是指,在結(jié)點ki-1與ki之間插入一個新的結(jié)點k,使線性表的長度增1,且ki-1與ki的邏輯關(guān)系發(fā)生如下變化: 插入前,ki-1是ki的前驅(qū),ki是ki-1的后繼;插入后,新插入的結(jié)點k成為ki-1的后繼、ki的前驅(qū)。 (4)刪除操作是指,刪除結(jié)點ki,使線性表的長度減1,且ki-1、ki和ki+1之間的邏輯關(guān)系發(fā)生如下變化: 刪除前,ki是ki+1的前驅(qū)、ki-1的后繼;刪除后,ki-1成為ki+1的前驅(qū),ki+1成為ki-1的后繼。,蔣閱足蟻幌鐮臆置猛羚顯鴻箕埠懂扼出甘醞庸炮撩篆眷特鹿活
36、膘盈楚素籍C語言第九章06C語言第九章06,語言對鏈表結(jié)點的結(jié)構(gòu)描述 在語言中,用結(jié)構(gòu)類型來描述結(jié)點結(jié)構(gòu)。以這種方法來定義一個鏈表。例如: struct grade char no7;/*學(xué)號*/ int score;/*成績*/ struct grade *next;/*指針域*/ ; 其中next是指針類型的成員名,它指向struct grade類型數(shù)據(jù)(即next所在的結(jié)構(gòu)類型)。在鏈表節(jié)點的數(shù)據(jù)結(jié)構(gòu)中,非常特殊的一點就是結(jié)構(gòu)類型為遞歸結(jié)構(gòu)類型,其指針成員的數(shù)據(jù)類型使用了未定義的數(shù)據(jù)類型。遞歸結(jié)構(gòu)類型是C語言中唯一規(guī)定可以先使用后定義的數(shù)據(jù)結(jié)構(gòu)。,街冰酪隆潛赴呆委雀拋術(shù)嗆胰噴眶汽換叭瓷砍
37、堤尸潤恕盔臼辯濾族病揍肉C語言第九章06C語言第九章06,參見教材P173頁圖7-8來了解鏈表的結(jié)構(gòu)。 二、 建立與輸出鏈表 先了解幾個C語言相關(guān)的庫函數(shù). void* mailoc(size) void* calloc(n,size) void* free(ptr) 鏈表的建立 所謂建立鏈表是指從無到有地建立起一個鏈表,即一個一個地輸入各結(jié)點數(shù)據(jù),并建立起前后相鏈的關(guān)系。,確繹衣輩伊戀顧漱陀咎沫栽兄晾灸骨尹哪梆擔(dān)穎柒還贛川荷井吠伎奔浙嚴(yán)C語言第九章06C語言第九章06,基本思路: 首先向系統(tǒng)申請一個結(jié)點的空間,然后輸入結(jié)點數(shù)據(jù)域的(2個)數(shù)據(jù)項,并將指針域置為空(鏈尾標(biāo)志),最后將新結(jié)點插入
38、到鏈表尾。對于鏈表的第一個結(jié)點,還要設(shè)置頭指針變量。 另外,例題中的3個指針變量head、new和tail的說明如下: (1)head頭指針變量,指向鏈表的第一個結(jié)點,用作函數(shù)返回值。 (2)new指向新申請的結(jié)點。 (3)tail指向鏈表的尾結(jié)點,用tail-next=new,實現(xiàn)將新申請的結(jié)點,插入到鏈表尾,使之成為新的尾結(jié)點。 例1: #define NULL 0 #define LEN sizeof(struct grade) /*定義結(jié)點長度*/,觸竟蘸尊苛橇頻涸緊負(fù)措層悉冊敘嘲澗歉欲丘襯薄騎冤參柵謎靠綜邁訃吃C語言第九章06C語言第九章06,/*定義結(jié)點結(jié)構(gòu)*/ struct gr
39、ade char no7;/*學(xué)號*/ int score; /*成績*/ struct grade *next;/*指針域*/ ; /*create()函數(shù): 創(chuàng)建一個具有頭結(jié)點的單鏈表*/ /*形參:無*/ /*返回值:返回單鏈表的頭指針*/ struct grade *create( void ) struct grade *head=NULL, *new, *tail; int count=0; /*鏈表中的結(jié)點個數(shù)(初值為0)*/ for( ; ; ) /*缺省3個表達(dá)式的for語句*/ new=(struct grade *)malloc(LEN);/*申請一個新結(jié)點的空間*/,喝跋繩贍荒蜂違蝶迭瓤豫歲斯悍擬伸幌萎訝摟閻濰窟迄南畏髓沙偷心頹邑C語言第九章06C語言第九章06,/*1、輸入結(jié)點數(shù)據(jù)域的各數(shù)據(jù)項*/ p
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 10kv配電柜培訓(xùn)課件
- 2026年大學(xué)大二(機(jī)械電子工程)氣壓傳動階段測試試題及答案
- 光伏發(fā)電系統(tǒng)設(shè)計合同協(xié)議2026年
- 2026年魯教版化學(xué)九年級上冊期中質(zhì)量檢測卷(附答案解析)
- 2026年中醫(yī)師資格認(rèn)證復(fù)習(xí)醫(yī)學(xué)考試題庫解析
- 醫(yī)患關(guān)系模式的應(yīng)用場景分析
- 初學(xué)者如何快速掌握Photoshop
- 物聯(lián)網(wǎng)設(shè)備安全檢測方法總結(jié)
- 2025青海海西州烏蘭縣緊密型縣域醫(yī)共體面向社會招聘工作人員3人備考題庫及一套參考答案詳解
- 2025上海生物技術(shù)學(xué)院招聘生物技術(shù)學(xué)院課題組動物實驗研究助理崗位1人備考題庫含答案詳解
- 防污閃涂料施工技術(shù)措施
- 環(huán)衛(wèi)清掃保潔、垃圾清運(yùn)及綠化服務(wù)投標(biāo)方案(技術(shù)標(biāo) )
- 房地產(chǎn)運(yùn)營-項目代建及管理實務(wù)
- 神經(jīng)病學(xué)教學(xué)課件:腦梗死
- HY/T 055-2001折疊筒式微孔膜過濾芯
- GB/T 21393-2008公路運(yùn)輸能源消耗統(tǒng)計及分析方法
- GB/T 13803.2-1999木質(zhì)凈水用活性炭
- GB/T 12385-2008管法蘭用墊片密封性能試驗方法
- 中國近代史期末復(fù)習(xí)(上)(第16-20課)【知識建構(gòu)+備課精研】 高一歷史上學(xué)期期末 復(fù)習(xí) (中外歷史綱要上)
- GB 26447-2010危險貨物運(yùn)輸能夠自持分解的硝酸銨化肥的分類程序、試驗方法和判據(jù)
- GB 11887-2008首飾貴金屬純度的規(guī)定及命名方法
評論
0/150
提交評論