第09章用戶自己建立數(shù)據(jù)類型_第1頁
第09章用戶自己建立數(shù)據(jù)類型_第2頁
第09章用戶自己建立數(shù)據(jù)類型_第3頁
第09章用戶自己建立數(shù)據(jù)類型_第4頁
第09章用戶自己建立數(shù)據(jù)類型_第5頁
已閱讀5頁,還剩145頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、9.1 定義和使用結(jié)構(gòu)體變量定義和使用結(jié)構(gòu)體變量9.2 使用結(jié)構(gòu)體數(shù)組使用結(jié)構(gòu)體數(shù)組9.3 結(jié)構(gòu)體指針結(jié)構(gòu)體指針9.4 用指針處理鏈表用指針處理鏈表9.5 共用體類型共用體類型9.6 使用枚舉類型使用枚舉類型9.7 用用typedef聲明新類型名聲明新類型名9.1.1 自己建立結(jié)構(gòu)體類型自己建立結(jié)構(gòu)體類型9.1.2 定義結(jié)構(gòu)體類型變量定義結(jié)構(gòu)體類型變量9.1.3 結(jié)構(gòu)體變量的初始化和引用結(jié)構(gòu)體變量的初始化和引用用戶自己建立由不同類型數(shù)據(jù)組成的組用戶自己建立由不同類型數(shù)據(jù)組成的組合型的數(shù)據(jù)結(jié)構(gòu),它稱為合型的數(shù)據(jù)結(jié)構(gòu),它稱為結(jié)構(gòu)體結(jié)構(gòu)體例如,一個學(xué)生的學(xué)號、姓名、性別、例如,一個學(xué)生的學(xué)號、姓名、

2、性別、年齡、成績、家庭地址等項,是屬于同年齡、成績、家庭地址等項,是屬于同一個學(xué)生的一個學(xué)生的,因此,因此組成一個組合數(shù)據(jù),組成一個組合數(shù)據(jù),如如student_1的變量,反映它們之間的的變量,反映它們之間的內(nèi)在聯(lián)系內(nèi)在聯(lián)系struct student int num; char name20; char sex; int age; float score; char addr30; ;u由程序設(shè)計者指定了由程序設(shè)計者指定了一個結(jié)構(gòu)體類型一個結(jié)構(gòu)體類型struct studentu它包括它包括num,name,sex,age,score,addr等不同類等不同類型的成員型的成員聲明一個結(jié)構(gòu)體類

3、型的一般形式為:聲明一個結(jié)構(gòu)體類型的一般形式為: struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員表列成員表列 ; 類型名類型名 成員名成員名;說明:說明:(1)結(jié)構(gòu)體類型并非只有一種,而是可以設(shè)結(jié)構(gòu)體類型并非只有一種,而是可以設(shè)計出許多種結(jié)構(gòu)體類型,例如計出許多種結(jié)構(gòu)體類型,例如struct teacherstruct workerstruct date等結(jié)構(gòu)體類型等結(jié)構(gòu)體類型u各自包含不同的成員各自包含不同的成員說明:說明:(2) 成員可以屬于另一個結(jié)構(gòu)體類型。成員可以屬于另一個結(jié)構(gòu)體類型。 struct date int month; int day; int year; ;struct stu i

4、nt num;char name20; char sex;int age; struct date birthday; char addr30; ;說明:說明:(2) 成員可以屬于另一個結(jié)構(gòu)體類型。成員可以屬于另一個結(jié)構(gòu)體類型。 num name sex agebirthdayaddrmonth day year前面只是建立了一個結(jié)構(gòu)體類型,它相前面只是建立了一個結(jié)構(gòu)體類型,它相當于一個模型,并沒有定義變量,其中當于一個模型,并沒有定義變量,其中并無具體數(shù)據(jù),系統(tǒng)對之也不分配存儲并無具體數(shù)據(jù),系統(tǒng)對之也不分配存儲單元。單元。相當于設(shè)計好了圖紙,但并未建成具體相當于設(shè)計好了圖紙,但并未建成具體的

5、房屋。為了能在程序中使用結(jié)構(gòu)體類的房屋。為了能在程序中使用結(jié)構(gòu)體類型的數(shù)據(jù),應(yīng)當定義結(jié)構(gòu)體類型的變量型的數(shù)據(jù),應(yīng)當定義結(jié)構(gòu)體類型的變量,并在其中存放具體的數(shù)據(jù)。,并在其中存放具體的數(shù)據(jù)。1. 先聲明結(jié)構(gòu)體類型,再定義該類型變量先聲明結(jié)構(gòu)體類型,再定義該類型變量聲明結(jié)構(gòu)體類型聲明結(jié)構(gòu)體類型struct student,可可以用它來定義變量以用它來定義變量 struct student student1,student2;結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名 1. 先聲明結(jié)構(gòu)體類型,再定義該類型變量先聲明結(jié)構(gòu)體類型,再定義該類型變量聲明結(jié)構(gòu)體類型聲明結(jié)構(gòu)體類型struct studen

6、t,可可以用它來定義變量以用它來定義變量 struct student student1,student2;10001 zhang xin m 19 90.5 shanghaistudent110002wang lif 2098beijingstudent22.在聲明類型的同時定義變量在聲明類型的同時定義變量struct student int num; char name20; char sex; int age; float score; char addr30; student1,student2;3. 不指定類型名而直接定義結(jié)構(gòu)體類型變量不指定類型名而直接定義結(jié)構(gòu)體類型變量其一般形式為

7、其一般形式為: struct 成員表列成員表列 變量名表列變量名表列; 指定了一個無名的結(jié)構(gòu)體類型指定了一個無名的結(jié)構(gòu)體類型 。(1) 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量是不同的概結(jié)構(gòu)體類型與結(jié)構(gòu)體變量是不同的概念,不要混同。只能對變量賦值、存取念,不要混同。只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算,而不能對一個類型賦值、存取或運算。在編譯時,對類型是不分配空或運算。在編譯時,對類型是不分配空間的,只對變量分配空間。間的,只對變量分配空間。(2) 結(jié)構(gòu)體類型中的成員名可以與程序中的結(jié)構(gòu)體類型中的成員名可以與程序中的變量名相同變量名相同,但二者不代表同一對象。但二者不代表同一對象。(3)

8、 對結(jié)構(gòu)體變量中的成員(即對結(jié)構(gòu)體變量中的成員(即“域域”),),可以單獨使用,它的作用與地位相當于普可以單獨使用,它的作用與地位相當于普通變量。通變量。 例例9.1 把一個學(xué)生的信息把一個學(xué)生的信息(包括學(xué)號、姓名包括學(xué)號、姓名、性別、住址、性別、住址)放在一個結(jié)構(gòu)體變量中,然放在一個結(jié)構(gòu)體變量中,然后輸出這個學(xué)生的信息。后輸出這個學(xué)生的信息。解題思路:解題思路:u自己建立一個結(jié)構(gòu)體類型,包括有關(guān)學(xué)生信息自己建立一個結(jié)構(gòu)體類型,包括有關(guān)學(xué)生信息的各成員的各成員u用它定義結(jié)構(gòu)體變量,同時賦以初值用它定義結(jié)構(gòu)體變量,同時賦以初值u輸出該結(jié)構(gòu)體變量的各成員輸出該結(jié)構(gòu)體變量的各成員#include

9、int main()struct student long int num; char name20; char sex; char addr20; a=10101,“l(fā)i lin”,m, “123 beijing road”; printf(no.:%ldnname:%sn sex:%cnaddress:%sn, a.num,,a.sex,a.addr); return 0; #include int main()struct student long int num; char name20; char sex; char addr20; a=10101,“l(fā)i lin”,m,

10、 “123 beijing road”; printf(no.:%ldnname:%sn sex:%cnaddress:%sn, a.num,,a.sex,a.addr); return 0; #include int main()struct student long int num; char name20; char sex; char addr20; a=10101,“l(fā)i lin”,m, “123 beijing road”; a.num=10010; 對對printf(“%sn”,a); 不對不對#include int main()struct student lon

11、g int num; char name20; char sex; char addr20; a=10101,“l(fā)i lin”,m, “123 beijing road”; b=a; 對對struct student b;b.num+; 對對#include int main()struct student long int num; char name20; char sex; char addr20; a=10101,“l(fā)i lin”,m, “123 beijing road”; scanf(%ld,&a.num); 對對printf(%o,&a); 對對scanf(“%ld,%s,%c,

12、%sn”,&a); 錯錯#include int main() struct date int month; int day; int year; ;struct stu int num;char name20; char sex;int age; struct date birthday; char addr30; a,b;a.birthday.month=12; 對對a.age=10; b.age=9; 對對sum=a.age+b.age; 對對 例例9.2 輸入兩個學(xué)生的學(xué)號、姓名和成績輸入兩個學(xué)生的學(xué)號、姓名和成績,輸出成績較高學(xué)生的學(xué)號、姓名和成績,輸出成績較高學(xué)生的學(xué)號、姓名和成績

13、解題思路:解題思路:(1)定義兩個結(jié)構(gòu)相同的結(jié)構(gòu)體變量定義兩個結(jié)構(gòu)相同的結(jié)構(gòu)體變量student1和和student2;(2)分別輸入兩個學(xué)生的學(xué)號、姓名和成績;分別輸入兩個學(xué)生的學(xué)號、姓名和成績;(3)比較兩個學(xué)生的成績,如果學(xué)生比較兩個學(xué)生的成績,如果學(xué)生1的成績高的成績高于學(xué)生于學(xué)生2,就輸出學(xué)生,就輸出學(xué)生1的全部信息,如果學(xué)的全部信息,如果學(xué)生生2的成績高于學(xué)生的成績高于學(xué)生1,就輸出學(xué)生,就輸出學(xué)生2的全部信的全部信息。如果二者相等,輸出息。如果二者相等,輸出2個學(xué)生的全部信息個學(xué)生的全部信息#include int main() struct student int num; c

14、har name20; float score; student1,student2; scanf(%d%s%f,&student1.num, , &student1.score); scanf(“%d%s%f”,&student2.num, , &student2.score); 不能加不能加& printf(the higher score is:n); if (student1.scorestudent2.score) printf(%d %s %6.2fn,student1.num, , student1.s

15、core); else if (student1.scorestudent2.score) printf(%d %s %6.2fn,student2.num, , student2.score); else printf(%d %s %6.2fn,student1.num, , student1.score); printf(%d %s %6.2fn,student2.num, , student2.score); return 0;9.2.1定義結(jié)構(gòu)體數(shù)組定義結(jié)構(gòu)體數(shù)組9.2.2 結(jié)構(gòu)體數(shù)組的應(yīng)用舉例結(jié)構(gòu)體數(shù)組的應(yīng)

16、用舉例 例例9.3 有有3個候選人,每個選民只能個候選人,每個選民只能投票選一人,要求編一個統(tǒng)計選票的投票選一人,要求編一個統(tǒng)計選票的程序,先后輸入被選人的名字,最后程序,先后輸入被選人的名字,最后輸出各人得票結(jié)果。輸出各人得票結(jié)果。解題思路:解題思路:u設(shè)一個結(jié)構(gòu)體數(shù)組,數(shù)組中包含設(shè)一個結(jié)構(gòu)體數(shù)組,數(shù)組中包含3個元素個元素u每個元素中的信息應(yīng)包括候選人的姓名每個元素中的信息應(yīng)包括候選人的姓名(字符型字符型)和得票數(shù)和得票數(shù)(整型整型)u輸入被選人的姓名,然后與數(shù)組元素中的輸入被選人的姓名,然后與數(shù)組元素中的“姓名姓名”成員比較,如果相同,就給這個成員比較,如果相同,就給這個元素中的元素中的“

17、得票數(shù)得票數(shù)”成員的值加成員的值加1u輸出所有元素的信息輸出所有元素的信息#include #include struct person char name20; int count; leader3=“l(fā)i”,0,“zhang”,0,“sun”,0; 全局的結(jié)構(gòu)體數(shù)組全局的結(jié)構(gòu)體數(shù)組name countleader0li0zhang0sun0int main() int i,j; char leader_name20; for (i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name, leader

18、)=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn“,, leaderi.count); return 0;leaderj.count=leaderj.count+1;int main() int i,j; char leader_name20; for (i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name, )=0) leaderj.count+; for(i=0;i3;i+) prin

19、tf(%5s:%dn“,, leaderi.count); return 0;說明:說明:(1)定義結(jié)構(gòu)體數(shù)組一般形式是定義結(jié)構(gòu)體數(shù)組一般形式是 struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員表列成員表列 數(shù)組名數(shù)組名數(shù)組長度數(shù)組長度; 先聲明一個結(jié)構(gòu)體類型,然后再用此類型定先聲明一個結(jié)構(gòu)體類型,然后再用此類型定義結(jié)構(gòu)體數(shù)組:義結(jié)構(gòu)體數(shù)組: 結(jié)構(gòu)體類型結(jié)構(gòu)體類型 數(shù)組名數(shù)組名數(shù)組長度數(shù)組長度; 如:如: struct person leader3; 說明:說明:(2)對結(jié)構(gòu)體數(shù)組初始化的形式是在定義數(shù)對結(jié)構(gòu)體數(shù)組初始化的形式是在定義數(shù)組的后面加上:組的后面加上:初值表列初值表列;

20、 如:如:struct person leader3= li,0,zhang,0,fun,0; 例例9.4 有有n個學(xué)生的信息個學(xué)生的信息(包括學(xué)號、包括學(xué)號、姓名、成績姓名、成績),要求按照成績的高低順,要求按照成績的高低順序輸出各學(xué)生的信息。序輸出各學(xué)生的信息。解題思路:用結(jié)構(gòu)體數(shù)組存放解題思路:用結(jié)構(gòu)體數(shù)組存放n個學(xué)生個學(xué)生信息,采用選擇法對各元素進行排序信息,采用選擇法對各元素進行排序(進行比較的是各元素中的成績進行比較的是各元素中的成績)。#include struct student int num; char name20; float score; ; int main() s

21、truct student stu5=10101,zhang,78 , 10103,wang,98.5, 10106,li, 86 , 10108,“l(fā)ing”, 73.5, 10110,“fun”, 100 ; struct student temp; const int n = 5 ; int i,j,k;常變量常變量若人數(shù)變?yōu)槿羧藬?shù)變?yōu)?030#include struct student int num; char name20; float score; ; int main() struct student stu5=10101,zhang,78 , 10103,wang,98.5

22、, 10106,li, 86 , 10108,“l(fā)ing”, 73.5, 10110,“fun”, 100 ; struct student temp; const int n = 5 ; int i,j,k;#define n 5注意注意temp的類型的類型 printf(the order is:n); for(i=0;in-1;i+) k=i; for(j=i+1;jstuk.score) k=j; temp=stuk; stuk=stui; stui=temp; for(i=0;in;i+) printf(%6d %8s %6.2fn, stui.num,,stui.

23、score); printf(n); return 0;寫法上與普通變量一致寫法上與普通變量一致9.3.1 指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針9.3.2 指向結(jié)構(gòu)體數(shù)組的指針指向結(jié)構(gòu)體數(shù)組的指針9.3.3 用結(jié)構(gòu)體變量和結(jié)構(gòu)體變量的指用結(jié)構(gòu)體變量和結(jié)構(gòu)體變量的指針作函數(shù)參數(shù)針作函數(shù)參數(shù)指向結(jié)構(gòu)體對象的指針變量既可以指向指向結(jié)構(gòu)體對象的指針變量既可以指向結(jié)構(gòu)體變量,也可以用來指向結(jié)構(gòu)體數(shù)結(jié)構(gòu)體變量,也可以用來指向結(jié)構(gòu)體數(shù)組中的元素。組中的元素。指針變量的基類型必須與結(jié)構(gòu)體變量的指針變量的基類型必須與結(jié)構(gòu)體變量的類型相同。例如:類型相同。例如: struct student *pt; 例例9

24、.5 通過指向結(jié)構(gòu)體變量的指針變通過指向結(jié)構(gòu)體變量的指針變量輸出結(jié)構(gòu)體變量中成員的信息。量輸出結(jié)構(gòu)體變量中成員的信息。解題思路:在已有的基礎(chǔ)上,本題要解解題思路:在已有的基礎(chǔ)上,本題要解決兩個問題:決兩個問題:u怎樣對結(jié)構(gòu)體變量成員賦值;怎樣對結(jié)構(gòu)體變量成員賦值;u怎樣通過指向結(jié)構(gòu)體變量的指針訪問結(jié)構(gòu)怎樣通過指向結(jié)構(gòu)體變量的指針訪問結(jié)構(gòu)體變量中成員。體變量中成員。#include #include int main() struct student long num; char name20; char sex; float score; ; struct student stu_1; str

25、uct student * p; p=&stu_1; stu_1.num=10101; strcpy(stu_1.name,“l(fā)i lin”); stu_1.sex=m; stu_1.score=89.5; printf(no.:%ldn”,stu_1.num); printf(name:%sn,stu_1.name); printf(sex:%cn”,stu_1.sex); printf(”score:%5.1fn”,stu_1.score); return 0;stu_110101li linm89.5p struct student stu_1; struct student * p;

26、p=&stu_1; stu_1.num=10101; strcpy(stu_1.name,“l(fā)i lin”); stu_1.sex=m; stu_1.score=89.5; printf(no.:%ldn”,stu_1.num); printf(name:%sn,stu_1.name); printf(sex:%cn”,stu_1.sex); printf(”score:%5.1fn”,stu_1.score); return 0;stu_110101li linm89.5p(*p).num(*p).name(*p).sex(*p).score說明:說明:u為了使用方便和直觀,為了使用方便和直

27、觀,c語言允許把語言允許把(*p).num用用p-num來代替來代替u(*p).name等價于等價于p-nameu如果如果p指向一個結(jié)構(gòu)體變量指向一個結(jié)構(gòu)體變量stu,以下等價:,以下等價: stu.成員名成員名(如如stu.num) (*p).成員名成員名(如如(*p).num) p-成員名成員名(如如p-num) 例例9.6 有有3個學(xué)生的信息,放在結(jié)構(gòu)體個學(xué)生的信息,放在結(jié)構(gòu)體數(shù)組中,要求輸出全部學(xué)生的信息。數(shù)組中,要求輸出全部學(xué)生的信息。解題思路:用指向結(jié)構(gòu)體變量的指針處理解題思路:用指向結(jié)構(gòu)體變量的指針處理(1)聲明聲明struct student,并定義結(jié)構(gòu)體數(shù),并定義結(jié)構(gòu)體數(shù)組組

28、、初始化初始化(2)定義指向定義指向struct student類型指針類型指針p(3)使使p指向數(shù)組首元素,輸出元素中指向數(shù)組首元素,輸出元素中各各信息信息(4)使使p指向下一個元素,輸出元素中指向下一個元素,輸出元素中各各信息信息(5)再使再使p指向結(jié)構(gòu)體數(shù)組的下一個元素,輸指向結(jié)構(gòu)體數(shù)組的下一個元素,輸出它指向的元素中的有關(guān)信息出它指向的元素中的有關(guān)信息#include struct student int num; char name20; char sex; int age;struct student stu3= 10101,li lin,m,18, 10102,zhang fun

29、,m,19, 10104,wang min,f,20 ;int main() struct student *p; printf( no. name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;10101li linm1810102 zhang fang m1910104wang minf20stu0stu1stu2int main() struct student *p; printf( no. name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return

30、0;10101li linm1810102 zhang fang m1910104wang minf20pstu0stu1stu2int main() struct student *p; printf( no. name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;10101li linm1810102 zhang fang m1910104wang minf20pstu0stu1stu2int main() struct student *p; printf( no. name sex agen); for(p=st

31、u;pnum, p-name, p-sex, p-age); return 0;10101li linm1810102 zhang fang m1910104wang minf20pstu0stu1stu2將一個結(jié)構(gòu)體變量的值傳遞給另一個函將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù),有數(shù),有3個方法個方法。(1) 用結(jié)構(gòu)體變量的成員作參數(shù)。用結(jié)構(gòu)體變量的成員作參數(shù)。 例如,用例如,用stu1.num或或作作函數(shù)實參,將實參值傳給形參。函數(shù)實參,將實參值傳給形參。u用法和用普通變量作實參是一樣的,屬于用法和用普通變量作實參是一樣的,屬于“值值傳遞傳遞”方式。方式。u應(yīng)當注意實參與形參

32、的類型保持一致。應(yīng)當注意實參與形參的類型保持一致。(2) 用結(jié)構(gòu)體變量作實參。用結(jié)構(gòu)體變量作實參。u用結(jié)構(gòu)體變量作實參時,將結(jié)構(gòu)體變量所占的用結(jié)構(gòu)體變量作實參時,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部按順序傳遞給形參,形參內(nèi)存單元的內(nèi)容全部按順序傳遞給形參,形參也必須是同類型的結(jié)構(gòu)體變量也必須是同類型的結(jié)構(gòu)體變量u在函數(shù)調(diào)用期間形參也要占用內(nèi)存單元。這種在函數(shù)調(diào)用期間形參也要占用內(nèi)存單元。這種傳遞方式在空間和時間上開銷較大傳遞方式在空間和時間上開銷較大u在被調(diào)用函數(shù)期間改變形參(也是結(jié)構(gòu)體變量在被調(diào)用函數(shù)期間改變形參(也是結(jié)構(gòu)體變量)的值,不能返回主調(diào)函數(shù))的值,不能返回主調(diào)函數(shù)u一般較少用這種

33、方法一般較少用這種方法(3)用指向結(jié)構(gòu)體變量(或數(shù)組元素)的用指向結(jié)構(gòu)體變量(或數(shù)組元素)的指針作實參,將結(jié)構(gòu)體變量(或數(shù)組元指針作實參,將結(jié)構(gòu)體變量(或數(shù)組元素)的地址傳給形參。素)的地址傳給形參。 例例9.7 有有n個結(jié)構(gòu)體變量,內(nèi)含學(xué)生學(xué)個結(jié)構(gòu)體變量,內(nèi)含學(xué)生學(xué)號、姓名和號、姓名和3門課程的成績。要求輸出門課程的成績。要求輸出平均成績最高的學(xué)生的信息平均成績最高的學(xué)生的信息(包括學(xué)號包括學(xué)號、姓名、姓名、3門課程成績和平均成績門課程成績和平均成績)。解題思路:將解題思路:將n個學(xué)生的數(shù)據(jù)表示為結(jié)構(gòu)個學(xué)生的數(shù)據(jù)表示為結(jié)構(gòu)體數(shù)組。按照功能函數(shù)化的思想,分別用體數(shù)組。按照功能函數(shù)化的思想,分別

34、用3個函數(shù)來實現(xiàn)不同的功能:個函數(shù)來實現(xiàn)不同的功能:u用用input函數(shù)輸入數(shù)據(jù)和求各學(xué)生平均成績函數(shù)輸入數(shù)據(jù)和求各學(xué)生平均成績u用用max函數(shù)找平均成績最高的學(xué)生函數(shù)找平均成績最高的學(xué)生u用用print函數(shù)輸出成績最高學(xué)生的信息函數(shù)輸出成績最高學(xué)生的信息u在主函數(shù)中先后調(diào)用這在主函數(shù)中先后調(diào)用這3個函數(shù),用指向結(jié)個函數(shù),用指向結(jié)構(gòu)體變量的指針作實參。最后得到結(jié)果。構(gòu)體變量的指針作實參。最后得到結(jié)果。u本程序本程序假設(shè)假設(shè)n=3#include #define n 3struct student int num; char name20; float score3; float aver; ;

35、4個成員個成員輸入前輸入前3個成員值個成員值計算最后成員值計算最后成員值int main() void input(struct student stu); struct student max(struct student stu); void print(struct student stu); struct student stun,*p=stu; input(p); print(max(p); return 0;void input(struct student stu) int i; printf(請輸入各學(xué)生的信息:請輸入各學(xué)生的信息: 學(xué)號、姓名、三門課成績學(xué)號、姓名、三門課成績

36、:n); for(i=0;in;i+) scanf(%d %s %f %f %f, &stui.num,, &stui.score0,&stui.score1, &stui.score2); stui.aver=(stui.score0+ stui.score1+stui.score2)/3.0; 輸入第輸入第1個成員值個成員值 輸入第輸入第2個成員值個成員值輸入第輸入第3個成員值個成員值計算第計算第4個成員值個成員值stu0stu1stu2stu10101li78 89 9888.33i=0void input(struct student stu) int i; prin

37、tf(請輸入各學(xué)生的信息:請輸入各學(xué)生的信息: 學(xué)號、姓名、三門課成績學(xué)號、姓名、三門課成績:n); for(i=0;in;i+) scanf(%d %s %f %f %f, &stui.num,, &stui.score0,&stui.score1, &stui.score2); stui.aver=(stui.score0+ stui.score1+stui.score2)/3.0; 輸入第輸入第1個成員值個成員值 輸入第輸入第2個成員值個成員值輸入第輸入第3個成員值個成員值計算第計算第4個成員值個成員值stu0stu1stu2stu10101li78 89 9888.3

38、310103wang98.5 87 6984.83i=1void input(struct student stu) int i; printf(請輸入各學(xué)生的信息:請輸入各學(xué)生的信息: 學(xué)號、姓名、三門課成績學(xué)號、姓名、三門課成績:n); for(i=0;in;i+) scanf(%d %s %f %f %f, &stui.num,, &stui.score0,&stui.score1, &stui.score2); stui.aver=(stui.score0+ stui.score1+stui.score2)/3.0; 輸入第輸入第1個成員值個成員值 輸入第輸入第2個成

39、員值個成員值輸入第輸入第3個成員值個成員值計算第計算第4個成員值個成員值stu0stu1stu2stu10101li78 89 9888.3310103wang98.5 87 6984.8310106sun 88 76.5 8984.5i=2struct student max(struct student stu) int i,m=0; for(i=0;istum.aver) m=i; return stum; stu0stu1stu2stu10101li78 89 9888.3310103wang98.5 87 6984.8310106sun 88 76.5 8984.5最大最大返回返回v

40、oid print(struct student stud) printf(n成績最高的學(xué)生是成績最高的學(xué)生是:n);printf(學(xué)號學(xué)號:%dn姓名姓名:%sn 三門課成績?nèi)T課成績:%5.1f,%5.1f,%5.1fn 平均成績平均成績:%6.2fn”, stud.num, ,stud.score0, stud.score1,stud.score2,stud.aver); stud10101li78 89 9888.3310103wang98.5 87 6984.8310106sun 88 76.5 8984.5num namescoreaverstu0stu1stu2

41、以上以上3個函數(shù)的調(diào)用,情況各不相同:個函數(shù)的調(diào)用,情況各不相同:u調(diào)用調(diào)用input函數(shù)時,實參是指針變量,形參是函數(shù)時,實參是指針變量,形參是結(jié)構(gòu)體數(shù)組,傳遞的是結(jié)構(gòu)體元素的地址,函結(jié)構(gòu)體數(shù)組,傳遞的是結(jié)構(gòu)體元素的地址,函數(shù)無返回值。數(shù)無返回值。u調(diào)用調(diào)用max函數(shù)時,實參是指針變量,形參是函數(shù)時,實參是指針變量,形參是結(jié)構(gòu)體數(shù)組,傳遞的是結(jié)構(gòu)體元素的地址,函結(jié)構(gòu)體數(shù)組,傳遞的是結(jié)構(gòu)體元素的地址,函數(shù)的返回值是結(jié)構(gòu)體類型數(shù)據(jù)。數(shù)的返回值是結(jié)構(gòu)體類型數(shù)據(jù)。u調(diào)用調(diào)用print函數(shù)時,實參是結(jié)構(gòu)體變量,形參函數(shù)時,實參是結(jié)構(gòu)體變量,形參是結(jié)構(gòu)體變量,傳遞的是結(jié)構(gòu)體變量中各成員是結(jié)構(gòu)體變量,傳遞

42、的是結(jié)構(gòu)體變量中各成員的值,函數(shù)無返回值。的值,函數(shù)無返回值。9.4.1 什么是鏈表什么是鏈表9.4.2 建立簡單的靜態(tài)鏈表建立簡單的靜態(tài)鏈表9.4.3 建立動態(tài)鏈表建立動態(tài)鏈表9.4.4 輸出鏈表輸出鏈表鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)它是動態(tài)地進行存儲分配的一種結(jié)構(gòu)它是動態(tài)地進行存儲分配的一種結(jié)構(gòu)head12491249a135613561475b1475c10211021d0頭指針頭指針各結(jié)點地址不連續(xù)各結(jié)點地址不連續(xù)各結(jié)點含有兩個部分各結(jié)點含有兩個部分表尾表尾鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)它是動態(tài)地進行存儲分配的一種結(jié)構(gòu)它是動態(tài)

43、地進行存儲分配的一種結(jié)構(gòu)鏈表必須利用指針變量才能實現(xiàn)鏈表必須利用指針變量才能實現(xiàn)struct student int num; float score; struct student *next; a,b,c;1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點a.next=&b;b.next=&c;numscorenext 例例9.8 建立一個如圖所示的簡單鏈表建立一個如圖所示的簡單鏈表,它由,它由3個學(xué)生數(shù)據(jù)的結(jié)點組成,要求個學(xué)生數(shù)據(jù)的結(jié)點組成,要求輸出各結(jié)點中的數(shù)據(jù)。輸出各結(jié)點中的數(shù)據(jù)。1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點n

44、umscorenext解題思路:解題思路:1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點numscorenextheadhead=&a;a.next=&b;b.next=&c;nullc.next=null;#include struct student int num; float score; struct student *next;int main() struct student a,b,c,*head,*p; a. num=10101; a.score=89.5; b. num=10103; b.score=90; c. num=10107; c.sc

45、ore=85; head=&a; a.next=&b; b.next=&c; c.next=null; p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=null); return 0; p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=null); return 0;1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點numscorenextheadnullp相當于相當于p=&b; p=head; do pri

46、ntf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=null); return 0;1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點numscorenextheadnullp相當于相當于p=&b; p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=null); return 0;1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點numscorenextheadnullp相當于相當于p=&c; p=head; do

47、 printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=null); return 0;1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點numscorenextheadnullp相當于相當于p=&c; p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=null); return 0;1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點numscorenextheadnullp相當于相當于p=null;靜態(tài)鏈表靜

48、態(tài)鏈表所謂建立動態(tài)鏈表是指在程序執(zhí)行過所謂建立動態(tài)鏈表是指在程序執(zhí)行過程中從無到有地建立起一個鏈表,即程中從無到有地建立起一個鏈表,即一個一個地開辟結(jié)點和輸入各結(jié)點數(shù)一個一個地開辟結(jié)點和輸入各結(jié)點數(shù)據(jù),并建立起前后相鏈的關(guān)系。據(jù),并建立起前后相鏈的關(guān)系。 例例9.9 寫一函數(shù)建立一個有寫一函數(shù)建立一個有3名學(xué)生數(shù)名學(xué)生數(shù)據(jù)的單向據(jù)的單向動態(tài)動態(tài)鏈表。鏈表。解題思路:解題思路:u定義定義3個指針變量:個指針變量:head,p1和和p2,它們都是,它們都是用來指向用來指向struct student類型數(shù)據(jù)類型數(shù)據(jù)struct student *head,*p1,*p2;解題思路:解題思路:u用用

49、malloc函數(shù)開辟第一個結(jié)點,并使函數(shù)開辟第一個結(jié)點,并使p1和和p2指向它指向它p1p1=p2=(struct student*)malloc(len);p2解題思路:解題思路:u讀入一個學(xué)生的數(shù)據(jù)給讀入一個學(xué)生的數(shù)據(jù)給p1所指的第一個結(jié)點所指的第一個結(jié)點p1scanf(%ld,%f,&p1-num,&p1-score);p21010189.5解題思路:解題思路:u讀入一個學(xué)生的數(shù)據(jù)給讀入一個學(xué)生的數(shù)據(jù)給p1所指的第一個結(jié)點所指的第一個結(jié)點u使使head也指向新開辟的結(jié)點也指向新開辟的結(jié)點headp1p2scanf(%ld,%f,&p1-num,&p1-score);1010189.5解題

50、思路:解題思路:u再開辟另一個結(jié)點并使再開辟另一個結(jié)點并使p1指向它,接著輸入該指向它,接著輸入該結(jié)點的數(shù)據(jù)結(jié)點的數(shù)據(jù)headp1p21010189.5解題思路:解題思路:u再開辟另一個結(jié)點并使再開辟另一個結(jié)點并使p1指向它,接著輸入該指向它,接著輸入該結(jié)點的數(shù)據(jù)結(jié)點的數(shù)據(jù)headp1p21010189.5p1=(struct student*)malloc(len);scanf(%ld,%f,&p1-num,&p1-score);1010390解題思路:解題思路:u使第一個結(jié)點的使第一個結(jié)點的next成員指向第二個結(jié)點成員指向第二個結(jié)點,即,即連接第一個結(jié)點與第二個結(jié)點連接第一個結(jié)點與第二個

51、結(jié)點u使使p2指向剛才建立的結(jié)點指向剛才建立的結(jié)點headp1p21010189.5p2-next=p1;1010390解題思路:解題思路:u使第一個結(jié)點的使第一個結(jié)點的next成員指向第二個結(jié)點成員指向第二個結(jié)點,即,即連接第一個結(jié)點與第二個結(jié)點連接第一個結(jié)點與第二個結(jié)點u使使p2指向剛才建立的結(jié)點指向剛才建立的結(jié)點headp1p21010189.5p2-next=p1;1010390p2=p1;解題思路:解題思路:u再開辟另一個結(jié)點并使再開辟另一個結(jié)點并使p1指向它,接著輸入該指向它,接著輸入該結(jié)點的數(shù)據(jù)結(jié)點的數(shù)據(jù)headp1p21010189.51010390解題思路:解題思路:u再開辟

52、另一個結(jié)點并使再開辟另一個結(jié)點并使p1指向它,接著輸入該指向它,接著輸入該結(jié)點的數(shù)據(jù)結(jié)點的數(shù)據(jù)headp1p21010189.51010390p1=(struct student*)malloc(len);scanf(%ld,%f,&p1-num,&p1-score);1010785解題思路:解題思路:u使第使第二二個結(jié)點的個結(jié)點的next成員指向第成員指向第三三個結(jié)點個結(jié)點,即,即連接第二個結(jié)點與第三個結(jié)點連接第二個結(jié)點與第三個結(jié)點u使使p2指向剛才建立的結(jié)點指向剛才建立的結(jié)點headp1p21010189.510103901010785p2-next=p1;解題思路:解題思路:u使第使第二

53、二個結(jié)點的個結(jié)點的next成員指向第成員指向第三三個結(jié)點個結(jié)點,即,即連接第二個結(jié)點與第三個結(jié)點連接第二個結(jié)點與第三個結(jié)點u使使p2指向剛才建立的結(jié)點指向剛才建立的結(jié)點headp1p21010189.510103901010785p2-next=p1;p2=p1;解題思路:解題思路:u再開辟另一個結(jié)點并使再開辟另一個結(jié)點并使p1指向它,接著輸入該指向它,接著輸入該結(jié)點的數(shù)據(jù)結(jié)點的數(shù)據(jù)headp1p21010189.5101039010107850解題思路:解題思路:u再開辟另一個結(jié)點并使再開辟另一個結(jié)點并使p1指向它,接著輸入該指向它,接著輸入該結(jié)點的數(shù)據(jù)結(jié)點的數(shù)據(jù)headp1p2101018

54、9.5101039010107850p1=(struct student*)malloc(len);scanf(%ld,%f,&p1-num,&p1-score);解題思路:解題思路:u輸入的學(xué)號為輸入的學(xué)號為0,表示建立鏈表的過程完成,表示建立鏈表的過程完成,該結(jié)點不應(yīng)連接到鏈表中該結(jié)點不應(yīng)連接到鏈表中headp1p21010189.5101039010107850nullp2-next=null;#include #include #define len sizeof(struct student)struct student long num; float score; struct s

55、tudent *next;int n;struct student類型數(shù)據(jù)的長度類型數(shù)據(jù)的長度struct student *creat(void) struct student *head,*p1,*p2; n=0; p1=p2=( struct student*) malloc(len); scanf(“%ld,%f”,&p1-num,&p1-score); head=null; while(p1-num!=0) n=n+1; if(n=1) head=p1; else p2-next=p1; p2=p1; p1=(struct student*)malloc(len); scanf(“%

56、ld,%f”,&p1-num,&p1-score); p2-next=null; return(head);p1總是總是開辟開辟新新結(jié)點結(jié)點p2總是總是指向最后結(jié)點指向最后結(jié)點用用p2和和p1連接連接兩個兩個結(jié)點結(jié)點int main() struct student *pt; pt=creat(); printf(“nnum:%ldnscore:%5.1fn”, pt-num,pt-score); return 0;例例9.10 編寫一個輸出鏈表的函數(shù)編寫一個輸出鏈表的函數(shù)print。100167.5100387100599nullp解題思路:解題思路:u輸出輸出p所指的結(jié)點所指的結(jié)點u使使p

57、后移一個結(jié)點后移一個結(jié)點p100167.5100387100599nullprintf(%ld %5.1fn,p-num,p-score);100167.5100387100599nullp=p-next;解題思路:解題思路:u輸出輸出p所指的結(jié)點所指的結(jié)點u使使p后移一個結(jié)點后移一個結(jié)點printf(%ld %5.1fn,p-num,p-score);p100167.5100387100599null解題思路:解題思路:u輸出輸出p所指的所指的新新結(jié)點結(jié)點u使使p后移一個結(jié)點后移一個結(jié)點printf(%ld %5.1fn,p-num,p-score);p100167.510038710059

58、9nullp=p-next;解題思路:解題思路:u輸出輸出p所指的所指的新新結(jié)點結(jié)點u使使p后移一個結(jié)點后移一個結(jié)點printf(%ld %5.1fn,p-num,p-score);p100167.5100387100599nullp=p-next;解題思路:解題思路:u輸出輸出p所指的所指的新新結(jié)點結(jié)點u使使p后移一個結(jié)點后移一個結(jié)點printf(%ld %5.1fn,p-num,p-score);p相當于相當于p=null;void print(struct student *p) printf(nthese %d records are:n,n); if(p!=null) do prin

59、tf(%ld %5.1fn, p-num,p-score); p=p-next; while(p!=null);9.5.1 什么是共用體類型什么是共用體類型9.5.2 引用共用體變量的方式引用共用體變量的方式9.5.3 共用體類型數(shù)據(jù)的特點共用體類型數(shù)據(jù)的特點有時想用同一段內(nèi)存單元存放不同類有時想用同一段內(nèi)存單元存放不同類型的變量。型的變量。使幾個不同的變量共享同一段內(nèi)存的使幾個不同的變量共享同一段內(nèi)存的結(jié)構(gòu),稱為結(jié)構(gòu),稱為 “共用體共用體”類型的結(jié)構(gòu)。類型的結(jié)構(gòu)。1000100110021003字符字符ch整整 型型 變變 量量 i實實 型型 變變 量量 f定義共用體類型變量的一般形式為:定

60、義共用體類型變量的一般形式為:union共用體名共用體名 成員表列成員表列變量表列;變量表列; 例如:例如:union data int i; char ch; float f; a,b,c; union data int i; char ch; float f; ;union data a,b,c; “共用體共用體”與與“結(jié)構(gòu)體結(jié)構(gòu)體”的定義形式相似的定義形式相似,但它們的含義是不同的。但它們的含義是不同的。結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和存長度之和,每個成員分別占有其自己的每個成員分別占有其自己的內(nèi)存單元。而共用體變量所占的內(nèi)存長度內(nèi)存單元

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論