




已閱讀5頁,還剩112頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第9章用戶自己建立數(shù)據(jù)類型 9 1定義和使用結構體變量9 2使用結構體數(shù)組9 3結構體指針9 4用指針處理鏈表9 5共用體類型9 6使用枚舉類型9 7用typedef聲明新類型名 9 1定義和使用結構體變量 9 1 1自己建立結構體類型9 1 2定義結構體類型變量9 1 3結構體變量的初始化和引用 9 1 1自己建立結構體類型 用戶自己建立由不同類型數(shù)據(jù)組成的組合型的數(shù)據(jù)結構 它稱為結構體例如 一個學生的學號 姓名 性別 年齡 成績 家庭地址等項 是屬于同一個學生的 因此組成一個組合數(shù)據(jù) 如student 1的變量 反映它們之間的內在聯(lián)系 9 1 1自己建立結構體類型 structStudent intnum charname 20 charsex intage floatscore charaddr 30 由程序設計者指定了一個結構體類型structStudent它包括num name sex age score addr等不同類型的成員 9 1 1自己建立結構體類型 聲明一個結構體類型的一般形式為 struct結構體名 成員表列 類型名成員名 9 1 1自己建立結構體類型 說明 1 結構體類型并非只有一種 而是可以設計出許多種結構體類型 例如structTeacherstructWorkerstructDate等結構體類型各自包含不同的成員 9 1 1自己建立結構體類型 說明 2 成員可以屬于另一個結構體類型 structDate intmonth intday intyear structStu intnum charname 20 charsex intage structDatebirthday charaddr 30 9 1 1自己建立結構體類型 說明 2 成員可以屬于另一個結構體類型 9 1 2定義結構體類型變量 前面只是建立了一個結構體類型 它相當于一個模型 并沒有定義變量 其中并無具體數(shù)據(jù) 系統(tǒng)對之也不分配存儲單元 相當于設計好了圖紙 但并未建成具體的房屋 為了能在程序中使用結構體類型的數(shù)據(jù) 應當定義結構體類型的變量 并在其中存放具體的數(shù)據(jù) 9 1 2定義結構體類型變量 1 先聲明結構體類型 再定義該類型變量聲明結構體類型structStudent 可以用它來定義變量structStudentstudent1 student2 結構體類型名 結構體變量名 9 1 2定義結構體類型變量 1 先聲明結構體類型 再定義該類型變量聲明結構體類型structStudent 可以用它來定義變量structStudentstudent1 student2 student1 student2 9 1 2定義結構體類型變量 2 在聲明類型的同時定義變量structStudent intnum charname 20 charsex intage floatscore charaddr 30 student1 student2 9 1 2定義結構體類型變量 3 不指定類型名而直接定義結構體類型變量其一般形式為 struct 成員表列 變量名表列 指定了一個無名的結構體類型 9 1 2定義結構體類型變量 1 結構體類型與結構體變量是不同的概念 不要混同 只能對變量賦值 存取或運算 而不能對一個類型賦值 存取或運算 在編譯時 對類型是不分配空間的 只對變量分配空間 9 1 2定義結構體類型變量 2 結構體類型中的成員名可以與程序中的變量名相同 但二者不代表同一對象 3 對結構體變量中的成員 即 域 可以單獨使用 它的作用與地位相當于普通變量 例9 1把一個學生的信息 包括學號 姓名 性別 住址 放在一個結構體變量中 然后輸出這個學生的信息 解題思路 自己建立一個結構體類型 包括有關學生信息的各成員用它定義結構體變量 同時賦以初值輸出該結構體變量的各成員 9 1 3結構體變量的初始化和引用 includeintmain structStudent longintnum charname 20 charsex charaddr 20 a 10101 LiLin M 123BeijingRoad printf NO ld nname s nsex c naddress s n a num a name a sex a addr return0 includeintmain structStudent longintnum charname 20 charsex charaddr 20 a 10101 LiLin M 123BeijingRoad printf NO ld nname s nsex c naddress s n a num a name a sex a addr return0 includeintmain structStudent longintnum charname 20 charsex charaddr 20 a 10101 LiLin M 123BeijingRoad a num 10010 對 printf s n a 不對 includeintmain structStudent longintnum charname 20 charsex charaddr 20 a 10101 LiLin M 123BeijingRoad b a 對 structStudentb b num 對 includeintmain structStudent longintnum charname 20 charsex charaddr 20 a 10101 LiLin M 123BeijingRoad scanf ld 對 printf o 對 scanf ld s c s n 錯 includeintmain structDate intmonth intday intyear structStu intnum charname 20 charsex intage structDatebirthday charaddr 30 a b a birthday month 12 對 a age 10 b age 9 對 sum a age b age 對 例9 2輸入兩個學生的學號 姓名和成績 輸出成績較高學生的學號 姓名和成績解題思路 1 定義兩個結構相同的結構體變量student1和student2 2 分別輸入兩個學生的學號 姓名和成績 3 比較兩個學生的成績 如果學生1的成績高于學生2 就輸出學生1的全部信息 如果學生2的成績高于學生1 就輸出學生2的全部信息 如果二者相等 輸出2個學生的全部信息 includeintmain structStudent intnum charname 20 floatscore student1 student2 scanf d s f 不能加 printf Thehigherscoreis n if student1 score student2 score printf d s 6 2f n student1 num student1 name student1 score elseif student1 score student2 score printf d s 6 2f n student2 num student2 name student2 score else printf d s 6 2f n student1 num student1 name student1 score printf d s 6 2f n student2 num student2 name student2 score return0 9 2使用結構體數(shù)組 9 2 1定義結構體數(shù)組9 2 2結構體數(shù)組的應用舉例 9 2 1定義結構體數(shù)組 例9 3有3個候選人 每個選民只能投票選一人 要求編一個統(tǒng)計選票的程序 先后輸入被選人的名字 最后輸出各人得票結果 9 2 1定義結構體數(shù)組 解題思路 設一個結構體數(shù)組 數(shù)組中包含3個元素每個元素中的信息應包括候選人的姓名 字符型 和得票數(shù) 整型 輸入被選人的姓名 然后與數(shù)組元素中的 姓名 成員比較 如果相同 就給這個元素中的 得票數(shù) 成員的值加1輸出所有元素的信息 include includestructPerson charname 20 intcount leader 3 Li 0 Zhang 0 Sun 0 全局的結構體數(shù)組 name count leader 0 Li 0 Zhang 0 Sun 0 intmain inti j charleader name 20 for i 1 i 10 i scanf s leader name for j 0 j 3 j if strcmp leader name leader j name 0 leader j count for i 0 i 3 i printf 5s d n leader i name leader i count return0 leader j count leader j count 1 intmain inti j charleader name 20 for i 1 i 10 i scanf s leader name for j 0 j 3 j if strcmp leader name leader j name 0 leader j count for i 0 i 3 i printf 5s d n leader i name leader i count return0 說明 1 定義結構體數(shù)組一般形式是 struct結構體名 成員表列 數(shù)組名 數(shù)組長度 先聲明一個結構體類型 然后再用此類型定義結構體數(shù)組 結構體類型數(shù)組名 數(shù)組長度 如 structPersonleader 3 說明 2 對結構體數(shù)組初始化的形式是在定義數(shù)組的后面加上 初值表列 如 structPersonleader 3 Li 0 Zhang 0 Fun 0 9 2 2結構體數(shù)組的應用舉例 例9 4有n個學生的信息 包括學號 姓名 成績 要求按照成績的高低順序輸出各學生的信息 解題思路 用結構體數(shù)組存放n個學生信息 采用選擇法對各元素進行排序 進行比較的是各元素中的成績 includestructStudent intnum charname 20 floatscore intmain structStudentstu 5 10101 Zhang 78 10103 Wang 98 5 10106 Li 86 10108 Ling 73 5 10110 Fun 100 structStudenttemp constintn 5 inti j k 常變量 若人數(shù)變?yōu)?0 30 includestructStudent intnum charname 20 floatscore intmain structStudentstu 5 10101 Zhang 78 10103 Wang 98 5 10106 Li 86 10108 Ling 73 5 10110 Fun 100 structStudenttemp constintn 5 inti j k defineN5 注意temp的類型 printf Theorderis n for i 0 istu k score k j temp stu k stu k stu i stu i temp for i 0 i n i printf 6d 8s 6 2f n stu i num stu i name stu i score printf n return0 寫法上與普通變量一致 9 3結構體指針 9 3 1指向結構體變量的指針9 3 2指向結構體數(shù)組的指針9 3 3用結構體變量和結構體變量的指針作函數(shù)參數(shù) 9 3 1指向結構體變量的指針 指向結構體對象的指針變量既可以指向結構體變量 也可以用來指向結構體數(shù)組中的元素 指針變量的基類型必須與結構體變量的類型相同 例如 structStudent pt 9 3 1指向結構體變量的指針 例9 5通過指向結構體變量的指針變量輸出結構體變量中成員的信息 解題思路 在已有的基礎上 本題要解決兩個問題 怎樣對結構體變量成員賦值 怎樣通過指向結構體變量的指針訪問結構體變量中成員 include includeintmain structStudent longnum charname 20 charsex floatscore structStudentstu 1 structStudent p p stu 1 10101LiLinM89 5 p structStudentstu 1 structStudent p p stu 1 10101LiLinM89 5 p 說明 為了使用方便和直觀 C語言允許把 p num用p num來代替 p name等價于p name如果p指向一個結構體變量stu 以下等價 stu 成員名 如stu num p 成員名 如 p num p 成員名 如p num 9 3 2指向結構體數(shù)組的指針 例9 6有3個學生的信息 放在結構體數(shù)組中 要求輸出全部學生的信息 解題思路 用指向結構體變量的指針處理 1 聲明structStudent 并定義結構體數(shù)組 初始化 2 定義指向structStudent類型指針p 3 使p指向數(shù)組首元素 輸出元素中各信息 4 使p指向下一個元素 輸出元素中各信息 5 再使p指向結構體數(shù)組的下一個元素 輸出它指向的元素中的有關信息 includestructStudent intnum charname 20 charsex intage structStudentstu 3 10101 LiLin M 18 10102 ZhangFun M 19 10104 WangMin F 20 intmain structStudent p printf No Namesexage n for p stu pnum p name p sex p age return0 stu 0 stu 1 stu 2 intmain structStudent p printf No Namesexage n for p stu pnum p name p sex p age return0 p stu 0 stu 1 stu 2 intmain structStudent p printf No Namesexage n for p stu pnum p name p sex p age return0 p stu 0 stu 1 stu 2 intmain structStudent p printf No Namesexage n for p stu pnum p name p sex p age return0 p stu 0 stu 1 stu 2 9 3 3用結構體變量和結構體變量的指針作函數(shù)參數(shù) 將一個結構體變量的值傳遞給另一個函數(shù) 有3個方法 1 用結構體變量的成員作參數(shù) 例如 用stu 1 num或stu 2 name作函數(shù)實參 將實參值傳給形參 用法和用普通變量作實參是一樣的 屬于 值傳遞 方式 應當注意實參與形參的類型保持一致 2 用結構體變量作實參 用結構體變量作實參時 將結構體變量所占的內存單元的內容全部按順序傳遞給形參 形參也必須是同類型的結構體變量在函數(shù)調用期間形參也要占用內存單元 這種傳遞方式在空間和時間上開銷較大在被調用函數(shù)期間改變形參 也是結構體變量 的值 不能返回主調函數(shù)一般較少用這種方法 3 用指向結構體變量 或數(shù)組元素 的指針作實參 將結構體變量 或數(shù)組元素 的地址傳給形參 例9 7有n個結構體變量 內含學生學號 姓名和3門課程的成績 要求輸出平均成績最高的學生的信息 包括學號 姓名 3門課程成績和平均成績 解題思路 將n個學生的數(shù)據(jù)表示為結構體數(shù)組 按照功能函數(shù)化的思想 分別用3個函數(shù)來實現(xiàn)不同的功能 用input函數(shù)輸入數(shù)據(jù)和求各學生平均成績用max函數(shù)找平均成績最高的學生用print函數(shù)輸出成績最高學生的信息在主函數(shù)中先后調用這3個函數(shù) 用指向結構體變量的指針作實參 最后得到結果 本程序假設n 3 include defineN3structStudent intnum charname 20 floatscore 3 floataver 4個成員 輸入前3個成員值 計算最后成員值 intmain voidinput structStudentstu structStudentmax structStudentstu voidprint structStudentstu structStudentstu N p stu input p print max p return0 voidinput structStudentstu inti printf 請輸入各學生的信息 學號 姓名 三門課成績 n for i 0 i N i scanf d s f f f 輸入第1個成員值 輸入第2個成員值 stu 0 stu 1 stu 2 stu 10101 Li 788998 88 33 i 0 voidinput structStudentstu inti printf 請輸入各學生的信息 學號 姓名 三門課成績 n for i 0 i N i scanf d s f f f 輸入第1個成員值 輸入第2個成員值 stu 0 stu 1 stu 2 stu 10101 Li 788998 88 33 10103 Wang 98 58769 84 83 i 1 voidinput structStudentstu inti printf 請輸入各學生的信息 學號 姓名 三門課成績 n for i 0 i N i scanf d s f f f 輸入第1個成員值 輸入第2個成員值 stu 0 stu 1 stu 2 stu 10101 Li 788998 88 33 10103 Wang 98 58769 84 83 10106 Sun 8876 589 84 5 i 2 structStudentmax structStudentstu inti m 0 for i 0 istu m aver m i returnstu m stu 0 stu 1 stu 2 stu 10101 Li 788998 88 33 10103 Wang 98 58769 84 83 10106 Sun 8876 589 84 5 最大 返回 voidprint structStudentstud printf n成績最高的學生是 n printf 學號 d n姓名 s n三門課成績 5 1f 5 1f 5 1f n平均成績 6 2f n stud num stud name stud score 0 stud score 1 stud score 2 stud aver stud 10101 Li 788998 88 33 10103 Wang 98 58769 84 83 10106 Sun 8876 589 84 5 num name score aver stu 0 stu 1 stu 2 以上3個函數(shù)的調用 情況各不相同 調用input函數(shù)時 實參是指針變量 形參是結構體數(shù)組 傳遞的是結構體元素的地址 函數(shù)無返回值 調用max函數(shù)時 實參是指針變量 形參是結構體數(shù)組 傳遞的是結構體元素的地址 函數(shù)的返回值是結構體類型數(shù)據(jù) 調用print函數(shù)時 實參是結構體變量 形參是結構體變量 傳遞的是結構體變量中各成員的值 函數(shù)無返回值 9 4用指針處理鏈表 9 4 1什么是鏈表9 4 2建立簡單的靜態(tài)鏈表9 4 3建立動態(tài)鏈表9 4 4輸出鏈表 9 4 1什么是鏈表 鏈表是一種常見的重要的數(shù)據(jù)結構它是動態(tài)地進行存儲分配的一種結構 head 1249 1249 A 1356 1356 1475 B 1475 C 1021 1021 D 0 頭指針 各結點地址不連續(xù) 各結點含有兩個部分 表尾 9 4 1什么是鏈表 鏈表是一種常見的重要的數(shù)據(jù)結構它是動態(tài)地進行存儲分配的一種結構鏈表必須利用指針變量才能實現(xiàn) structStudent intnum floatscore structStudent next a b c a結點 b結點 c結點 a next b next num score next 9 4 2建立簡單的靜態(tài)鏈表 例9 8建立一個如圖所示的簡單鏈表 它由3個學生數(shù)據(jù)的結點組成 要求輸出各結點中的數(shù)據(jù) a結點 b結點 c結點 num score next 9 4 2建立簡單的靜態(tài)鏈表 解題思路 a結點 b結點 c結點 num score next head head a next b next NULL c next NULL includestructStudent intnum floatscore structStudent next intmain structStudenta b c head p a num 10101 a score 89 5 b num 10103 b score 90 c num 10107 c score 85 head p head do printf ld 5 1f n p num p score p p next while p NULL return0 a結點 b結點 c結點 num score next head NULL p 相當于p p head do printf ld 5 1f n p num p score p p next while p NULL return0 a結點 b結點 c結點 num score next head NULL p 相當于p p head do printf ld 5 1f n p num p score p p next while p NULL return0 a結點 b結點 c結點 num score next head NULL p 相當于p p head do printf ld 5 1f n p num p score p p next while p NULL return0 a結點 b結點 c結點 num score next head NULL p 相當于p p head do printf ld 5 1f n p num p score p p next while p NULL return0 a結點 b結點 c結點 num score next head NULL p 相當于p NULL 靜態(tài)鏈表 9 4 3建立動態(tài)鏈表 所謂建立動態(tài)鏈表是指在程序執(zhí)行過程中從無到有地建立起一個鏈表 即一個一個地開辟結點和輸入各結點數(shù)據(jù) 并建立起前后相鏈的關系 9 4 3建立動態(tài)鏈表 例9 9寫一函數(shù)建立一個有3名學生數(shù)據(jù)的單向動態(tài)鏈表 解題思路 定義3個指針變量 head p1和p2 它們都是用來指向structStudent類型數(shù)據(jù) structStudent head p1 p2 解題思路 用malloc函數(shù)開辟第一個結點 并使p1和p2指向它 p1 p1 p2 structStudent malloc LEN p2 解題思路 讀入一個學生的數(shù)據(jù)給p1所指的第一個結點 p1 scanf ld f p2 1010189 5 解題思路 讀入一個學生的數(shù)據(jù)給p1所指的第一個結點使head也指向新開辟的結點 head p1 p2 scanf ld f 1010189 5 解題思路 再開辟另一個結點并使p1指向它 接著輸入該結點的數(shù)據(jù) head p1 p2 1010189 5 解題思路 再開辟另一個結點并使p1指向它 接著輸入該結點的數(shù)據(jù) head p1 p2 1010189 5 p1 structStudent malloc LEN scanf ld f 1010390 解題思路 使第一個結點的next成員指向第二個結點 即連接第一個結點與第二個結點使p2指向剛才建立的結點 head p1 p2 1010189 5 p2 next p1 1010390 解題思路 使第一個結點的next成員指向第二個結點 即連接第一個結點與第二個結點使p2指向剛才建立的結點 head p1 p2 1010189 5 p2 next p1 1010390 p2 p1 解題思路 再開辟另一個結點并使p1指向它 接著輸入該結點的數(shù)據(jù) head p1 p2 1010189 5 1010390 解題思路 再開辟另一個結點并使p1指向它 接著輸入該結點的數(shù)據(jù) head p1 p2 1010189 5 1010390 p1 structStudent malloc LEN scanf ld f 1010785 解題思路 使第二個結點的next成員指向第三個結點 即連接第二個結點與第三個結點使p2指向剛才建立的結點 head p1 p2 1010189 5 1010390 1010785 p2 next p1 解題思路 使第二個結點的next成員指向第三個結點 即連接第二個結點與第三個結點使p2指向剛才建立的結點 head p1 p2 1010189 5 1010390 1010785 p2 next p1 p2 p1 解題思路 再開辟另一個結點并使p1指向它 接著輸入該結點的數(shù)據(jù) head p1 p2 1010189 5 1010390 1010785 解題思路 再開辟另一個結點并使p1指向它 接著輸入該結點的數(shù)據(jù) head p1 p2 1010189 5 1010390 1010785 p1 structStudent malloc LEN scanf ld f 解題思路 輸入的學號為0 表示建立鏈表的過程完成 該結點不應連接到鏈表中 head p1 p2 1010189 5 1010390 1010785 NULL p2 next NULL include include defineLENsizeof structStudent structStudent longnum floatscore structStudent next intn structStudent類型數(shù)據(jù)的長度 structStudent creat void structStudent head p1 p2 n 0 p1 p2 structStudent malloc LEN scanf ld f p1總是開辟新結點p2總是指向最后結點用p2和p1連接兩個結點 intmain structStudent pt pt creat printf nnum ld nscore 5 1f n pt num pt score return0 9 4 4輸出鏈表 例9 10編寫一個輸出鏈表的函數(shù)print 100167 5 100387 100599 NULL p 解題思路 輸出p所指的結點使p后移一個結點 p 100167 5 100387 100599 NULL printf ld 5 1f n p num p score 100167 5 100387 100599 NULL p p next 解題思路 輸出p所指的結點使p后移一個結點 printf ld 5 1f n p num p score p 100167 5 100387 100599 NULL 解題思路 輸出p所指的新結點使p后移一個結點 printf ld 5 1f n p num p score p 100167 5 100387 100599 NULL p p next 解題思路 輸出p所指的新結點使p后移一個結點 printf ld 5 1f n p num p score p 100167 5 100387 100599 NULL p p next 解題思路 輸出p所指的新結點使p后移一個結點 printf ld 5 1f n p num p score p 相當于p NULL voidprint structStudent p printf nThese drecordsare n n if p NULL do printf ld 5 1f n p num p score p p next while p NULL 9 7用typedef聲明新類型名 1 簡單地用一個新的類型名代替原有的類型名typedefi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年地理學專業(yè)研究生入學考試試卷及答案
- 2025年非全日制研究生入學考試試題及答案
- 建筑工程項目設計及施工合作協(xié)議
- 分析零售業(yè)的客戶細分市場及其營銷策略
- 快遞代收代派管理協(xié)議書
- 農業(yè)智能化種植管理技術服務協(xié)議
- 2025年木工鋸機項目提案報告模板
- 2025年輕小型起重設備項目申請報告
- 2025年德語TestDaF口語模擬試卷:歷年真題與模擬測試
- 2025年抗艾滋病用藥項目提案報告
- 工程材料與應用完整版教學課件全書電子講義(最新)
- 消防工程擬投入主要施工設備機具表
- (完整版)形式發(fā)票模版(國際件通用)
- 橋梁工程支座智能化發(fā)展
- T∕CFA 0203141-2021 綠色鑄造設計產品 球墨鑄鐵管水冷金屬型離心機通用技術要求
- 【2020-2021自招】江蘇蘇州實驗中學初升高自主招生數(shù)學模擬試卷【4套】【含解析】
- 監(jiān)理報審表(第六版)-江蘇省建設工程監(jiān)理現(xiàn)場用表
- 圓通快遞借殼上市案例分析(課堂PPT)
- 25公斤級平焊法蘭及螺栓規(guī)格尺寸
- 配電網工程典型設計10kV電纜分冊
- 中文版EN-12546
評論
0/150
提交評論