用戶自己建立數(shù)據(jù)類型參考PPT_第1頁
用戶自己建立數(shù)據(jù)類型參考PPT_第2頁
用戶自己建立數(shù)據(jù)類型參考PPT_第3頁
用戶自己建立數(shù)據(jù)類型參考PPT_第4頁
用戶自己建立數(shù)據(jù)類型參考PPT_第5頁
已閱讀5頁,還剩146頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1,第9章 用戶自己建立數(shù)據(jù)類型,9.1 定義和使用結(jié)構(gòu)體變量 9.2 使用結(jié)構(gòu)體數(shù)組 9.3 結(jié)構(gòu)體指針 9.4 用指針處理鏈表 9.5 共用體類型 9.6 使用枚舉類型 9.7 用typedef聲明新類型名,2,9.1 定義和使用結(jié)構(gòu)體變量,9.1.1 自己建立結(jié)構(gòu)體類型 9.1.2 定義結(jié)構(gòu)體類型變量 9.1.3 結(jié)構(gòu)體變量的初始化和引用,3,9.1.1 自己建立結(jié)構(gòu)體類型,用戶自己建立由不同類型數(shù)據(jù)組成的組合型的數(shù)據(jù)結(jié)構(gòu),它稱為結(jié)構(gòu)體 例如,一個學(xué)生的學(xué)號、姓名、性別、年齡、成績、家庭地址等項,是屬于同一個學(xué)生的,因此組成一個組合數(shù)據(jù),如student_1的變量,反映它們之間的內(nèi)在聯(lián)系

2、,4,9.1.1 自己建立結(jié)構(gòu)體類型,struct Student int num; char name20; char sex; int age; float score; char addr30;,由程序設(shè)計者指定了一個結(jié)構(gòu)體類型struct Student 它包括num,name,sex,age,score,addr等不同類型的成員,5,9.1.1 自己建立結(jié)構(gòu)體類型,聲明一個結(jié)構(gòu)體類型的一般形式為: struct 結(jié)構(gòu)體名 成員表列,類型名 成員名,6,9.1.1 自己建立結(jié)構(gòu)體類型,說明: (1)結(jié)構(gòu)體類型并非只有一種,而是可以設(shè)計出許多種結(jié)構(gòu)體類型,例如 struct Teache

3、r struct Worker struct Date等結(jié)構(gòu)體類型 各自包含不同的成員,7,9.1.1 自己建立結(jié)構(gòu)體類型,說明: (2) 成員可以屬于另一個結(jié)構(gòu)體類型。 struct Date int month; int day; int year; ; struct Stu int num;char name20; char sex;int age; struct Date birthday; char addr30;,8,9.1.1 自己建立結(jié)構(gòu)體類型,說明: (2) 成員可以屬于另一個結(jié)構(gòu)體類型,9,9.1.2 定義結(jié)構(gòu)體類型變量,前面只是建立了一個結(jié)構(gòu)體類型,它相當(dāng)于一個模型,并沒

4、有定義變量,其中并無具體數(shù)據(jù),系統(tǒng)對之也不分配存儲單元。 相當(dāng)于設(shè)計好了圖紙,但并未建成具體的房屋。為了能在程序中使用結(jié)構(gòu)體類型的數(shù)據(jù),應(yīng)當(dāng)定義結(jié)構(gòu)體類型的變量,并在其中存放具體的數(shù)據(jù),10,9.1.2 定義結(jié)構(gòu)體類型變量,1. 先聲明結(jié)構(gòu)體類型,再定義該類型變量 聲明結(jié)構(gòu)體類型struct Student,可以用它來定義變量 struct Student student1,student2,結(jié)構(gòu)體類型名,結(jié)構(gòu)體變量名,11,9.1.2 定義結(jié)構(gòu)體類型變量,1. 先聲明結(jié)構(gòu)體類型,再定義該類型變量 聲明結(jié)構(gòu)體類型struct Student,可以用它來定義變量,struct Student i

5、nt num; char name20; char sex; int age; float score; char addr30;,struct Student student1,student2,12,9.1.2 定義結(jié)構(gòu)體類型變量,2.在聲明類型的同時定義變量 struct Student int num; char name20; char sex; int age; float score; char addr30; student1,student2,13,9.1.2 定義結(jié)構(gòu)體類型變量,3. 不指定類型名而直接定義結(jié)構(gòu)體類型變量 其一般形式為: struct 成員表列 變量名表列;

6、 指定了一個無名的結(jié)構(gòu)體類型,14,9.1.2 定義結(jié)構(gòu)體類型變量,struct int num; char name20; char sex; int age; float score; char addr30; student1,student2,15,9.1.2 定義結(jié)構(gòu)體類型變量,說明: (1) 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量是不同的概念,不要混同。只能對變量賦值、存取或運(yùn)算,而不能對一個類型賦值、存取或運(yùn)算。在編譯時,對類型是不分配空間的,只對變量分配空間,16,9.1.2 定義結(jié)構(gòu)體類型變量,2) 結(jié)構(gòu)體類型中的成員名可以與程序中的變量名相同,但二者不代表同一對象。 (3) 對結(jié)構(gòu)體變量中

7、的成員(即“域”),可以單獨使用,它的作用與地位相當(dāng)于普通變量,17,例9.1 把一個學(xué)生的信息(包括學(xué)號、姓名、性別、住址)放在一個結(jié)構(gòu)體變量中,然后輸出這個學(xué)生的信息。 解題思路: 自己建立一個結(jié)構(gòu)體類型,包括有關(guān)學(xué)生信息的各成員 用它定義結(jié)構(gòu)體變量,同時賦以初值 輸出該結(jié)構(gòu)體變量的各成員,9.1.3 結(jié)構(gòu)體變量的初始化和引用,18,include int main() struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; printf

8、(NO.:%ldnname:%sn sex:%cnaddress:%sn, a.num,,a.sex,a.addr); return 0;,19,include int main() struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; printf(NO.:%ldnname:%sn sex:%cnaddress:%sn, a.num,,a.sex,a.addr); return 0;,20,include int

9、main() struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”;,a.num=10010; 對,printf(“%sn”,a); 不對,21,include int main() struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”;,b=a; 對,struct Student b,b.

10、num+; 對,22,include int main() struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”;,scanf(%ld, 對,scanf(“%ld,%s,%c,%sn”, 錯,23,include int main() struct Date int month; int day; int year; ; struct Stu int num;char name20; char sex;int age; struct Date

11、 birthday; char addr30; a,b,a.birthday.month=12; 對,a.age=10; b.age=9; 對,sum=a.age+b.age; 對,24,例9.2 輸入兩個學(xué)生的學(xué)號、姓名和成績,輸出成績較高學(xué)生的學(xué)號、姓名和成績 解題思路: (1)定義兩個結(jié)構(gòu)相同的結(jié)構(gòu)體變量student1和student2; (2)分別輸入兩個學(xué)生的學(xué)號、姓名和成績; (3)比較兩個學(xué)生的成績,如果學(xué)生1的成績高于學(xué)生2,就輸出學(xué)生1的全部信息,如果學(xué)生2的成績高于學(xué)生1,就輸出學(xué)生2的全部信息。如果二者相等,輸出2個學(xué)生的全部信息,25,include int main

12、() struct Student int num; char name20; float score; student1,student2; scanf(%d%s%f,不能加,26,printf(The higher score is:n); if (student1.scorestudent2.score) printf(%d %s %6.2fn,student1.num, , student1.score); else if (student1.scorestudent2.score) printf(%d %s %6.2fn,student2.num, stud

13、, student2.score); else printf(%d %s %6.2fn,student1.num, , student1.score); printf(%d %s %6.2fn,student2.num, , student2.score); return 0;,27,9.2 使用結(jié)構(gòu)體數(shù)組,9.2.1定義結(jié)構(gòu)體數(shù)組 9.2.2 結(jié)構(gòu)體數(shù)組的應(yīng)用舉例,28,9.2.1定義結(jié)構(gòu)體數(shù)組,例9.3 有3個候選人,每個選民只能投票選一人,要求編一個統(tǒng)計選票的程序,先后輸入被選人的名字,最后輸出各人得票結(jié)果,29,9.

14、2.1定義結(jié)構(gòu)體數(shù)組,解題思路: 設(shè)一個結(jié)構(gòu)體數(shù)組,數(shù)組中包含3個元素 每個元素中的信息應(yīng)包括候選人的姓名(字符型)和得票數(shù)(整型) 輸入被選人的姓名,然后與數(shù)組元素中的“姓名”成員比較,如果相同,就給這個元素中的“得票數(shù)”成員的值加1 輸出所有元素的信息,30,include #include struct Person char name20; int count; leader3=“Li”,0,“Zhang”,0,“Sun”,0,全局的結(jié)構(gòu)體數(shù)組,name,count,leader0,Li,0,Zhang,0,Sun,0,31,int main() int i,j; char leade

15、r_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+) printf(%5s:%dn“,, leaderi.count); return 0;,leaderj.count=leaderj.count+1,32,int main() int i,j; char leader_name20; for (i=1;i=10;i+) scanf(“%s”,lea

16、der_name); for(j=0;j3;j+) if(strcmp(leader_name, )=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn“,, leaderi.count); return 0;,33,說明: (1)定義結(jié)構(gòu)體數(shù)組一般形式是 struct 結(jié)構(gòu)體名 成員表列 數(shù)組名數(shù)組長度; 先聲明一個結(jié)構(gòu)體類型,然后再用此類型定義結(jié)構(gòu)體數(shù)組: 結(jié)構(gòu)體類型 數(shù)組名數(shù)組長度; 如: struct Person leader3,34,說明: (2)對結(jié)構(gòu)體數(shù)組初始化的形式是在定義數(shù)組的后面

17、加上: 初值表列; 如: struct Person leader3= Li,0,Zhang,0,Fun,0,35,9.2.2 結(jié)構(gòu)體數(shù)組的應(yīng)用舉例,例9.4 有n個學(xué)生的信息(包括學(xué)號、姓名、成績),要求按照成績的高低順序輸出各學(xué)生的信息。 解題思路:用結(jié)構(gòu)體數(shù)組存放n個學(xué)生信息,采用選擇法對各元素進(jìn)行排序(進(jìn)行比較的是各元素中的成績,36,include struct Student int num; char name20; float score; ; int main() struct Student stu5=10101,Zhang,78 , 10103,Wang,98.5, 10

18、106,Li, 86 , 10108,“Ling”, 73.5, 10110,“Fun”, 100 ; struct Student temp; const int n = 5 ; int i,j,k,常變量,若人數(shù)變?yōu)?0,30,37,include struct Student int num; char name20; float score; ; int main() struct Student stu5=10101,Zhang,78 , 10103,Wang,98.5, 10106,Li, 86 , 10108,“Ling”, 73.5, 10110,“Fun”, 100 ; st

19、ruct Student temp; const int n = 5 ; int i,j,k,define N 5,注意temp的類型,38,printf(The order is:n); for(i=0;istuk.score) k=j; temp=stuk; stuk=stui; stui=temp; for(i=0;in;i+) printf(%6d %8s %6.2fn, stui.num,,stui.score); printf(n); return 0;,寫法上與普通變量一致,39,9.3 結(jié)構(gòu)體指針,9.3.1 指向結(jié)構(gòu)體變量的指針 9.3.2 指向結(jié)構(gòu)體數(shù)組的

20、指針 9.3.3 用結(jié)構(gòu)體變量和結(jié)構(gòu)體變量的指針作函數(shù)參數(shù),40,9.3.1 指向結(jié)構(gòu)體變量的指針,指向結(jié)構(gòu)體對象的指針變量既可以指向結(jié)構(gòu)體變量,也可以用來指向結(jié)構(gòu)體數(shù)組中的元素。 指針變量的基類型必須與結(jié)構(gòu)體變量的類型相同。例如: struct Student *pt,41,9.3.1 指向結(jié)構(gòu)體變量的指針,例9.5 通過指向結(jié)構(gòu)體變量的指針變量輸出結(jié)構(gòu)體變量中成員的信息。 解題思路:在已有的基礎(chǔ)上,本題要解決兩個問題: 怎樣對結(jié)構(gòu)體變量成員賦值; 怎樣通過指向結(jié)構(gòu)體變量的指針訪問結(jié)構(gòu)體變量中成員,42,include #include int main() struct Student l

21、ong num; char name20; char sex; float score; ;,43,struct Student stu_1; struct Student * p; p=,stu_1,10101 Li Lin M 89.5,p,44,struct Student stu_1; struct Student * p; p=,stu_1,10101 Li Lin M 89.5,p,45,說明: 為了使用方便和直觀,C語言允許把(*p).num用p-num來代替 (*p).name等價于p-name 如果p指向一個結(jié)構(gòu)體變量stu,以下等價: stu.成員名(如stu.num) (

22、*p).成員名(如(*p).num) p-成員名(如p-num,46,9.3.2 指向結(jié)構(gòu)體數(shù)組的指針,例9.6 有3個學(xué)生的信息,放在結(jié)構(gòu)體數(shù)組中,要求輸出全部學(xué)生的信息,47,解題思路:用指向結(jié)構(gòu)體變量的指針處理 (1)聲明struct Student,并定義結(jié)構(gòu)體數(shù)組、初始化 (2)定義指向struct Student類型指針p (3)使p指向數(shù)組首元素,輸出元素中各信息 (4)使p指向下一個元素,輸出元素中各信息 (5)再使p指向結(jié)構(gòu)體數(shù)組的下一個元素,輸出它指向的元素中的有關(guān)信息,48,include struct Student int num; char name20; char

23、 sex; int age; ; struct Student stu3= 10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20,49,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;,stu0,stu1,stu2,50,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum,

24、 p-name, p-sex, p-age); return 0;,p,stu0,stu1,stu2,51,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;,p,stu0,stu1,stu2,52,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;,p,stu0,stu1,

25、stu2,53,9.3.3 用結(jié)構(gòu)體變量和結(jié)構(gòu)體變量的指針作函數(shù)參數(shù),將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù),有3個方法,54,1) 用結(jié)構(gòu)體變量的成員作參數(shù)。 例如,用stu1.num或作函數(shù)實參,將實參值傳給形參。 用法和用普通變量作實參是一樣的,屬于“值傳遞”方式。 應(yīng)當(dāng)注意實參與形參的類型保持一致,55,2) 用結(jié)構(gòu)體變量作實參。 用結(jié)構(gòu)體變量作實參時,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部按順序傳遞給形參,形參也必須是同類型的結(jié)構(gòu)體變量 在函數(shù)調(diào)用期間形參也要占用內(nèi)存單元。這種傳遞方式在空間和時間上開銷較大 在被調(diào)用函數(shù)期間改變形參(也是結(jié)構(gòu)體變量)的值,不能返回主調(diào)函

26、數(shù) 一般較少用這種方法,56,3)用指向結(jié)構(gòu)體變量(或數(shù)組元素)的指針作實參,將結(jié)構(gòu)體變量(或數(shù)組元素)的地址傳給形參,57,例9.7 有n個結(jié)構(gòu)體變量,內(nèi)含學(xué)生學(xué)號、姓名和3門課程的成績。要求輸出平均成績最高的學(xué)生的信息(包括學(xué)號、姓名、3門課程成績和平均成績,58,解題思路:將n個學(xué)生的數(shù)據(jù)表示為結(jié)構(gòu)體數(shù)組。按照功能函數(shù)化的思想,分別用3個函數(shù)來實現(xiàn)不同的功能: 用input函數(shù)輸入數(shù)據(jù)和求各學(xué)生平均成績 用max函數(shù)找平均成績最高的學(xué)生 用print函數(shù)輸出成績最高學(xué)生的信息 在主函數(shù)中先后調(diào)用這3個函數(shù),用指向結(jié)構(gòu)體變量的指針作實參。最后得到結(jié)果。 本程序假設(shè)n=3,59,includ

27、e #define N 3 struct Student int num; char name20; float score3; float aver;,4個成員,輸入前3個成員值,計算最后成員值,60,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;,61,void input(struct

28、Student stu) int i; printf(請輸入各學(xué)生的信息: 學(xué)號、姓名、三門課成績:n); for(i=0;iN;i+) scanf(%d %s %f %f %f,輸入第1個成員值,輸入第2個成員值,stu0,stu1,stu2,stu,10101,Li,78 89 98,88.33,i=0,62,void input(struct Student stu) int i; printf(請輸入各學(xué)生的信息: 學(xué)號、姓名、三門課成績:n); for(i=0;iN;i+) scanf(%d %s %f %f %f,輸入第1個成員值,輸入第2個成員值,stu0,stu1,stu2,s

29、tu,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,i=1,63,void input(struct Student stu) int i; printf(請輸入各學(xué)生的信息: 學(xué)號、姓名、三門課成績:n); for(i=0;iN;i+) scanf(%d %s %f %f %f,輸入第1個成員值,輸入第2個成員值,stu0,stu1,stu2,stu,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,10106,Sun,88 76.5 89,84.5,i=2,64,struct S

30、tudent max(struct Student stu) int i,m=0; for(i=0;istum.aver) m=i; return stum;,stu0,stu1,stu2,stu,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,10106,Sun,88 76.5 89,84.5,最大,返回,65,void print(struct Student stud) printf(n成績最高的學(xué)生是:n); printf(學(xué)號:%dn姓名:%sn 三門課成績:%5.1f,%5.1f,%5.1fn 平均成績:%6.2fn”, st

31、ud.num, ,stud.score0, stud.score1,stud.score2,stud.aver);,stud,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,10106,Sun,88 76.5 89,84.5,num,name,score,aver,stu0,stu1,stu2,66,以上3個函數(shù)的調(diào)用,情況各不相同: 調(diào)用input函數(shù)時,實參是指針變量,形參是結(jié)構(gòu)體數(shù)組,傳遞的是結(jié)構(gòu)體元素的地址,函數(shù)無返回值。 調(diào)用max函數(shù)時,實參是指針變量,形參是結(jié)構(gòu)體數(shù)組,傳遞的是結(jié)構(gòu)體元素的地址,函數(shù)的返回值

32、是結(jié)構(gòu)體類型數(shù)據(jù)。 調(diào)用print函數(shù)時,實參是結(jié)構(gòu)體變量,形參是結(jié)構(gòu)體變量,傳遞的是結(jié)構(gòu)體變量中各成員的值,函數(shù)無返回值,67,9.4 用指針處理鏈表,9.4.1 什么是鏈表 9.4.2 建立簡單的靜態(tài)鏈表 9.4.3 建立動態(tài)鏈表 9.4.4 輸出鏈表,68,9.4.1 什么是鏈表,鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu) 它是動態(tài)地進(jìn)行存儲分配的一種結(jié)構(gòu),head,1249,1249,A,1356,1356,1475,B,1475,C,1021,1021,D,0,頭指針,各結(jié)點地址不連續(xù),各結(jié)點含有兩個部分,表尾,69,9.4.1 什么是鏈表,鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu) 它是動態(tài)地進(jìn)行存儲分配

33、的一種結(jié)構(gòu) 鏈表必須利用指針變量才能實現(xiàn),70,struct Student int num; float score; struct Student *next; a,b,c,a結(jié)點,b結(jié)點,c結(jié)點,a.next,b.next,num,score,next,71,9.4.2 建立簡單的靜態(tài)鏈表,例9.8 建立一個如圖所示的簡單鏈表,它由3個學(xué)生數(shù)據(jù)的結(jié)點組成,要求輸出各結(jié)點中的數(shù)據(jù),a結(jié)點,b結(jié)點,c結(jié)點,num,score,next,72,9.4.2 建立簡單的靜態(tài)鏈表,解題思路,a結(jié)點,b結(jié)點,c結(jié)點,num,score,next,head,head,a.next,b.next,NULL

34、,c.next=NULL,73,include struct Student int num; float score; struct Student *next;,74,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.score=85; head=,75,p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); return 0;,a

35、結(jié)點,b結(jié)點,c結(jié)點,num,score,next,head,NULL,p,相當(dāng)于p,76,p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); return 0;,a結(jié)點,b結(jié)點,c結(jié)點,num,score,next,head,NULL,p,相當(dāng)于p,77,p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); return 0;,a結(jié)點,b結(jié)點,c結(jié)點,num,score,next,head,NULL,p,相當(dāng)于p

36、,78,p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); return 0;,a結(jié)點,b結(jié)點,c結(jié)點,num,score,next,head,NULL,p,相當(dāng)于p,79,p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); return 0;,a結(jié)點,b結(jié)點,c結(jié)點,num,score,next,head,NULL,p,相當(dāng)于p=NULL,靜態(tài)鏈表,80,9.4.3 建立動態(tài)鏈表,所謂建立動態(tài)鏈表是指在程序執(zhí)行

37、過程中從無到有地建立起一個鏈表,即一個一個地開辟結(jié)點和輸入各結(jié)點數(shù)據(jù),并建立起前后相鏈的關(guān)系,81,9.4.3 建立動態(tài)鏈表,例9.9 寫一函數(shù)建立一個有3名學(xué)生數(shù)據(jù)的單向動態(tài)鏈表,82,解題思路: 定義3個指針變量:head,p1和p2,它們都是用來指向struct Student類型數(shù)據(jù),struct Student *head,*p1,*p2,83,解題思路: 用malloc函數(shù)開辟第一個結(jié)點,并使p1和p2指向它,p1,p1=p2=(struct Student*)malloc(LEN,p2,84,解題思路: 讀入一個學(xué)生的數(shù)據(jù)給p1所指的第一個結(jié)點,p1,scanf(%ld,%f,p

38、2,10101 89.5,85,解題思路: 讀入一個學(xué)生的數(shù)據(jù)給p1所指的第一個結(jié)點 使head也指向新開辟的結(jié)點,head,p1,p2,scanf(%ld,%f,10101 89.5,86,解題思路: 再開辟另一個結(jié)點并使p1指向它,接著輸入該結(jié)點的數(shù)據(jù),head,p1,p2,10101 89.5,87,解題思路: 再開辟另一個結(jié)點并使p1指向它,接著輸入該結(jié)點的數(shù)據(jù),head,p1,p2,10101 89.5,p1=(struct Student*)malloc(LEN); scanf(%ld,%f,10103 90,88,解題思路: 使第一個結(jié)點的next成員指向第二個結(jié)點,即連接第一個

39、結(jié)點與第二個結(jié)點 使p2指向剛才建立的結(jié)點,head,p1,p2,10101 89.5,p2-next=p1,10103 90,89,解題思路: 使第一個結(jié)點的next成員指向第二個結(jié)點,即連接第一個結(jié)點與第二個結(jié)點 使p2指向剛才建立的結(jié)點,head,p1,p2,10101 89.5,p2-next=p1,10103 90,p2=p1,90,解題思路: 再開辟另一個結(jié)點并使p1指向它,接著輸入該結(jié)點的數(shù)據(jù),head,p1,p2,10101 89.5,10103 90,91,解題思路: 再開辟另一個結(jié)點并使p1指向它,接著輸入該結(jié)點的數(shù)據(jù),head,p1,p2,10101 89.5,10103

40、 90,p1=(struct Student*)malloc(LEN); scanf(%ld,%f,10107 85,92,解題思路: 使第二個結(jié)點的next成員指向第三個結(jié)點,即連接第二個結(jié)點與第三個結(jié)點 使p2指向剛才建立的結(jié)點,head,p1,p2,10101 89.5,10103 90,10107 85,p2-next=p1,93,解題思路: 使第二個結(jié)點的next成員指向第三個結(jié)點,即連接第二個結(jié)點與第三個結(jié)點 使p2指向剛才建立的結(jié)點,head,p1,p2,10101 89.5,10103 90,10107 85,p2-next=p1,p2=p1,94,解題思路: 再開辟另一個結(jié)點

41、并使p1指向它,接著輸入該結(jié)點的數(shù)據(jù),head,p1,p2,10101 89.5,10103 90,10107 85,95,解題思路: 再開辟另一個結(jié)點并使p1指向它,接著輸入該結(jié)點的數(shù)據(jù),head,p1,p2,10101 89.5,10103 90,10107 85,p1=(struct Student*)malloc(LEN); scanf(%ld,%f,96,解題思路: 輸入的學(xué)號為0,表示建立鏈表的過程完成,該結(jié)點不應(yīng)連接到鏈表中,head,p1,p2,10101 89.5,10103 90,10107 85,NULL,p2-next=NULL,97,include #include

42、#define LEN sizeof(struct Student) struct Student long num; float score; struct Student *next; ; int n,struct Student類型數(shù)據(jù)的長度,98,struct Student *creat(void) struct Student *head,*p1,*p2; n=0; p1=p2=( struct Student*) malloc(LEN); scanf(“%ld,%f”,p1總是開辟新結(jié)點 p2總是指向最后結(jié)點 用p2和p1連接兩個結(jié)點,99,int main() struct S

43、tudent *pt; pt=creat(); printf(“nnum:%ldnscore:%5.1fn”, pt-num,pt-score); return 0;,100,9.4.4 輸出鏈表,例9.10 編寫一個輸出鏈表的函數(shù)print,1001 67.5,1003 87,1005 99,NULL,p,101,解題思路: 輸出p所指的結(jié)點 使p后移一個結(jié)點,p,1001 67.5,1003 87,1005 99,NULL,printf(%ld %5.1fn,p-num,p-score,102,1001 67.5,1003 87,1005 99,NULL,p=p-next,解題思路: 輸出

44、p所指的結(jié)點 使p后移一個結(jié)點,printf(%ld %5.1fn,p-num,p-score,p,103,1001 67.5,1003 87,1005 99,NULL,解題思路: 輸出p所指的新結(jié)點 使p后移一個結(jié)點,printf(%ld %5.1fn,p-num,p-score,p,104,1001 67.5,1003 87,1005 99,NULL,p=p-next,解題思路: 輸出p所指的新結(jié)點 使p后移一個結(jié)點,printf(%ld %5.1fn,p-num,p-score,p,105,1001 67.5,1003 87,1005 99,NULL,p=p-next,解題思路: 輸出p

45、所指的新結(jié)點 使p后移一個結(jié)點,printf(%ld %5.1fn,p-num,p-score,p,相當(dāng)于p=NULL,106,void print(struct Student *p) printf(nThese %d records are:n,n); if(p!=NULL) do printf(%ld %5.1fn, p-num,p-score); p=p-next; while(p!=NULL);,107,9.5 共用體類型,9.5.1 什么是共用體類型 9.5.2 引用共用體變量的方式 9.5.3 共用體類型數(shù)據(jù)的特點,108,9.5.1 什么是共用體類型,有時想用同一段內(nèi)存單元存放

46、不同類型的變量。 使幾個不同的變量共享同一段內(nèi)存的結(jié)構(gòu),稱為 “共用體”類型的結(jié)構(gòu),1000,1001,1002,1003,字符ch,整 型 變 量 i,實 型 變 量 f,109,定義共用體類型變量的一般形式為: 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,110,共用體”與“結(jié)構(gòu)體”的定義形式相似,但它們的含義是不同的。 結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和,每個成員分別占有其自己的

47、內(nèi)存單元。而共用體變量所占的內(nèi)存長度等于最長的成員的長度,111,9.5.2 引用共用體變量的方式,只有先定義了共用體變量才能引用它,但應(yīng)注意,不能引用共用體變量,而只能引用共用體變量中的成員。 例如,前面定義了a,b,c為共用體變量,下面的引用方式是正確的: a.i a.ch a.f,112,9.5.3 共用體類型數(shù)據(jù)的特點,在使用共用體類型數(shù)據(jù)時要注意以下一些特點: (1) 同一個內(nèi)存段可以用來存放幾種不同類型的成員,但在每一瞬時只能存放其中一個成員,而不是同時存放幾個,113,9.5.3 共用體類型數(shù)據(jù)的特點,在使用共用體類型數(shù)據(jù)時要注意以下一些特點: (2)可以對共用體變量初始化,但初

48、始化表中只能有一個常量,114,9.5.3 共用體類型數(shù)據(jù)的特點,在使用共用體類型數(shù)據(jù)時要注意以下一些特點: (3)共用體變量中起作用的成員是最后一次被賦值的成員,在對共用體變量中的一個成員賦值后,原有變量存儲單元中的值就取代,115,9.5.3 共用體類型數(shù)據(jù)的特點,在使用共用體類型數(shù)據(jù)時要注意以下一些特點: (4) 共用體變量的地址和它的各成員的地址都是同一地址。 (5) 不能對共用體變量名賦值,也不能企圖引用變量名來得到一個值,116,9.5.3 共用體類型數(shù)據(jù)的特點,在使用共用體類型數(shù)據(jù)時要注意以下一些特點: (6) 以前的C規(guī)定不能把共用體變量作為函數(shù)參數(shù),但可以使用指向共用體變量的

49、指針作函數(shù)參數(shù)。C99允許用共用體變量作為函數(shù)參數(shù),117,9.5.3 共用體類型數(shù)據(jù)的特點,在使用共用體類型數(shù)據(jù)時要注意以下一些特點: (7) 共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,數(shù)組也可以作為共用體的成員,118,9.5.3 共用體類型數(shù)據(jù)的特點,例9.11 有若干個人員的數(shù)據(jù),其中有學(xué)生和教師。學(xué)生的數(shù)據(jù)中包括:姓名、號碼、性別、職業(yè)、班級。教師的數(shù)據(jù)包括:姓名、號碼、性別、職業(yè)、職務(wù)。要求用同一個表格來處理,119,解題思路: 學(xué)生和教師的數(shù)據(jù)項目多數(shù)是相同的,但有一項不同?,F(xiàn)要求把它們放在同一表格中,120,解題思路:

50、 如果job項為s,則第項為class。即Li是501班的。如果job項是t,則第項為position。Wang是prof(教授,121,解題思路: 對第5項可以用共用體來處理(將class和position放在同一段存儲單元中,122,include struct int num; char name10; char sex; char job; union int clas; char position10; category; person2,外部的結(jié)構(gòu)體數(shù)組,共用體變量,123,include union Categ int clas; char position10; ; struc

51、t int num; char name10; char sex; char job; union Categ category person2,聲明共用體類型,定義共用體類型變量,124,int main() int i; for(i=0;i2;i+) scanf(%d %s %c %c,125,for(i=0;i2;i+) if (personi.job = s) printf(%-6d%-10s%-4c%-4c% -10dn,personi.num,personi. name,personi.sex,personi.job, personi.category.clas); else pr

52、intf(%-6d%-10s%-4c%-4c% -10sn,personi.num,personi. name,personi.sex, personi.job, personi.category.position); return 0;,126,9.6 使用枚舉類型,如果一個變量只有幾種可能的值,則可以定義為枚舉類型 所謂“枚舉”就是指把可能的值一一列舉出來,變量的值只限于列舉出來的值的范圍內(nèi),127,9.6 使用枚舉類型,聲明枚舉類型用enum開頭。 例如: enum Weekdaysun,mon,tue, wed,thu,fri,sat; 聲明了一個枚舉類型enum Weekday 然后

53、可以用此類型來定義變量 enum Weekday workday,weekend,枚舉元素,枚舉變量,128,9.6 使用枚舉類型,workday=mon; 正確 weekend=sun; 正確 weekday=monday; 不正確,129,說明: (1) C編譯對枚舉類型的枚舉元素按常量處理,故稱枚舉常量。不要因為它們是標(biāo)識符(有名字)而把它們看作變量,不能對它們賦值。例如: sun=0; mon=1; 錯誤,130,說明: (2) 每一個枚舉元素都代表一個整數(shù),語言編譯按定義時的順序默認(rèn)它們的值為0,1,2,3,4,5 在上面定義中,sun的值為0,mon的值為1,sat的值為6 如果有

54、賦值語句: workday=mon; 相當(dāng)于workday=1,131,說明: (2) 每一個枚舉元素都代表一個整數(shù),語言編譯按定義時的順序默認(rèn)它們的值為0,1,2,3,4,5 也可以人為地指定枚舉元素的數(shù)值,例如: enum Weekdaysun=7,mon=1,tue, wed,thu,fri,satworkday,week_end; 指定枚舉常量sun的值為7,mon為1,以后順序加1,sat為6,132,說明: (3) 枚舉元素可以用來作判斷比較。例如: if(workday=mon) if(workdaysun) 枚舉元素的比較規(guī)則是按其在初始化時指定的整數(shù)來進(jìn)行比較的。 如果定義時

55、未人為指定,則按上面的默認(rèn)規(guī)則處理,即第一個枚舉元素的值為,故monsun,satfri,133,例9.12 口袋中有紅、黃、藍(lán)、白、黑5種顏色的球若干個。每次從口袋中先后取出3個球,問得到3種不同顏色的球的可能取法,輸出每種排列的情況,134,解題思路,135,解題思路,136,include int main() enum Colorred,yellow,blue,white,black; enum Color i,j,k,pri; int n,loop; n=0; for (i=red;i=black;i+) for (j=red;j=black;j+) if (i!=j) for (k=red;k=black;k+) if (k!=i),137,for (loop=1;loop=3;loop+) switch (loop) case 1: pri=i;break; ca

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論