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

下載本文檔

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

文檔簡(jiǎn)介

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)體 例如,一個(gè)學(xué)生的學(xué)號(hào)、姓名、性別、年齡、成績(jī)、家庭地址等項(xiàng),是屬于同一個(gè)學(xué)生的,因此組成一個(gè)組合數(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è)計(jì)者指定了一個(gè)結(jié)構(gòu)體類型struct Student 它包括num,name,sex,age,score,addr等不同類型的成員,5,9.1.1 自己建立結(jié)構(gòu)體類型,聲明一個(gè)結(jié)構(gòu)體類型的一般形式為: struct 結(jié)構(gòu)體名 成員表列,類型名 成員名,6,9.1.1 自己建立結(jié)構(gòu)體類型,說(shuō)明: (1)結(jié)構(gòu)體類型并非只有一種,而是可以設(shè)計(jì)出許多種結(jié)構(gòu)體類型,例如 struct Teache

3、r struct Worker struct Date等結(jié)構(gòu)體類型 各自包含不同的成員,7,9.1.1 自己建立結(jié)構(gòu)體類型,說(shuō)明: (2) 成員可以屬于另一個(gè)結(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)體類型,說(shuō)明: (2) 成員可以屬于另一個(gè)結(jié)構(gòu)體類型,9,9.1.2 定義結(jié)構(gòu)體類型變量,前面只是建立了一個(gè)結(jié)構(gòu)體類型,它相當(dāng)于一個(gè)模型,并沒(méi)

4、有定義變量,其中并無(wú)具體數(shù)據(jù),系統(tǒng)對(duì)之也不分配存儲(chǔ)單元。 相當(dāng)于設(shè)計(jì)好了圖紙,但并未建成具體的房屋。為了能在程序中使用結(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,可以用它來(lái)定義變量 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,可以用它來(lái)定義變量,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.在聲明類型的同時(shí)定義變量 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、 指定了一個(gè)無(wú)名的結(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)體類型變量,說(shuō)明: (1) 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量是不同的概念,不要混同。只能對(duì)變量賦值、存取或運(yùn)算,而不能對(duì)一個(gè)類型賦值、存取或運(yùn)算。在編譯時(shí),對(duì)類型是不分配空間的,只對(duì)變量分配空間,16,9.1.2 定義結(jié)構(gòu)體類型變量,2) 結(jié)構(gòu)體類型中的成員名可以與程序中的變量名相同,但二者不代表同一對(duì)象。 (3) 對(duì)結(jié)構(gòu)體變量中

7、的成員(即“域”),可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量,17,例9.1 把一個(gè)學(xué)生的信息(包括學(xué)號(hào)、姓名、性別、住址)放在一個(gè)結(jié)構(gòu)體變量中,然后輸出這個(gè)學(xué)生的信息。 解題思路: 自己建立一個(gè)結(jié)構(gòu)體類型,包括有關(guān)學(xué)生信息的各成員 用它定義結(jié)構(gòu)體變量,同時(shí)賦以初值 輸出該結(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; 對(duì),printf(“%sn”,a); 不對(duì),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; 對(duì),struct Student b,b.

10、num+; 對(duì),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, 對(duì),scanf(“%ld,%s,%c,%sn”, 錯(cuò),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; 對(duì),a.age=10; b.age=9; 對(duì),sum=a.age+b.age; 對(duì),24,例9.2 輸入兩個(gè)學(xué)生的學(xué)號(hào)、姓名和成績(jī),輸出成績(jī)較高學(xué)生的學(xué)號(hào)、姓名和成績(jī) 解題思路: (1)定義兩個(gè)結(jié)構(gòu)相同的結(jié)構(gòu)體變量student1和student2; (2)分別輸入兩個(gè)學(xué)生的學(xué)號(hào)、姓名和成績(jī); (3)比較兩個(gè)學(xué)生的成績(jī),如果學(xué)生1的成績(jī)高于學(xué)生2,就輸出學(xué)生1的全部信息,如果學(xué)生2的成績(jī)高于學(xué)生1,就輸出學(xué)生2的全部信息。如果二者相等,輸出2個(gè)學(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個(gè)候選人,每個(gè)選民只能投票選一人,要求編一個(gè)統(tǒng)計(jì)選票的程序,先后輸入被選人的名字,最后輸出各人得票結(jié)果,29,9.

14、2.1定義結(jié)構(gòu)體數(shù)組,解題思路: 設(shè)一個(gè)結(jié)構(gòu)體數(shù)組,數(shù)組中包含3個(gè)元素 每個(gè)元素中的信息應(yīng)包括候選人的姓名(字符型)和得票數(shù)(整型) 輸入被選人的姓名,然后與數(shù)組元素中的“姓名”成員比較,如果相同,就給這個(gè)元素中的“得票數(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,說(shuō)明: (1)定義結(jié)構(gòu)體數(shù)組一般形式是 struct 結(jié)構(gòu)體名 成員表列 數(shù)組名數(shù)組長(zhǎng)度; 先聲明一個(gè)結(jié)構(gòu)體類型,然后再用此類型定義結(jié)構(gòu)體數(shù)組: 結(jié)構(gòu)體類型 數(shù)組名數(shù)組長(zhǎng)度; 如: struct Person leader3,34,說(shuō)明: (2)對(duì)結(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個(gè)學(xué)生的信息(包括學(xué)號(hào)、姓名、成績(jī)),要求按照成績(jī)的高低順序輸出各學(xué)生的信息。 解題思路:用結(jié)構(gòu)體數(shù)組存放n個(gè)學(xué)生信息,采用選擇法對(duì)各元素進(jìn)行排序(進(jìn)行比較的是各元素中的成績(jī),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;,寫(xiě)法上與普通變量一致,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)體對(duì)象的指針變量既可以指向結(jié)構(gòu)體變量,也可以用來(lái)指向結(jié)構(gòu)體數(shù)組中的元素。 指針變量的基類型必須與結(jié)構(gòu)體變量的類型相同。例如: struct Student *pt,41,9.3.1 指向結(jié)構(gòu)體變量的指針,例9.5 通過(guò)指向結(jié)構(gòu)體變量的指針變量輸出結(jié)構(gòu)體變量中成員的信息。 解題思路:在已有的基礎(chǔ)上,本題要解決兩個(gè)問(wèn)題: 怎樣對(duì)結(jié)構(gòu)體變量成員賦值; 怎樣通過(guò)指向結(jié)構(gòu)體變量的指針訪問(wèn)結(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,說(shuō)明: 為了使用方便和直觀,C語(yǔ)言允許把(*p).num用p-num來(lái)代替 (*p).name等價(jià)于p-name 如果p指向一個(gè)結(jié)構(gòu)體變量stu,以下等價(jià): stu.成員名(如stu.num) (

22、*p).成員名(如(*p).num) p-成員名(如p-num,46,9.3.2 指向結(jié)構(gòu)體數(shù)組的指針,例9.6 有3個(gè)學(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指向下一個(gè)元素,輸出元素中各信息 (5)再使p指向結(jié)構(gòu)體數(shù)組的下一個(gè)元素,輸出它指向的元素中的有關(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ù),將一個(gè)結(jié)構(gòu)體變量的值傳遞給另一個(gè)函數(shù),有3個(gè)方法,54,1) 用結(jié)構(gòu)體變量的成員作參數(shù)。 例如,用stu1.num或作函數(shù)實(shí)參,將實(shí)參值傳給形參。 用法和用普通變量作實(shí)參是一樣的,屬于“值傳遞”方式。 應(yīng)當(dāng)注意實(shí)參與形參的類型保持一致,55,2) 用結(jié)構(gòu)體變量作實(shí)參。 用結(jié)構(gòu)體變量作實(shí)參時(shí),將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部按順序傳遞給形參,形參也必須是同類型的結(jié)構(gòu)體變量 在函數(shù)調(diào)用期間形參也要占用內(nèi)存單元。這種傳遞方式在空間和時(shí)間上開(kāi)銷較大 在被調(diào)用函數(shù)期間改變形參(也是結(jié)構(gòu)體變量)的值,不能返回主調(diào)函

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

27、e #define N 3 struct Student int num; char name20; float score3; float aver;,4個(gè)成員,輸入前3個(gè)成員值,計(jì)算最后成員值,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(請(qǐng)輸入各學(xué)生的信息: 學(xué)號(hào)、姓名、三門課成績(jī):n); for(i=0;iN;i+) scanf(%d %s %f %f %f,輸入第1個(gè)成員值,輸入第2個(gè)成員值,stu0,stu1,stu2,stu,10101,Li,78 89 98,88.33,i=0,62,void input(struct Student stu) int i; printf(請(qǐng)輸入各學(xué)生的信息: 學(xué)號(hào)、姓名、三門課成績(jī):n); for(i=0;iN;i+) scanf(%d %s %f %f %f,輸入第1個(gè)成員值,輸入第2個(gè)成員值,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(請(qǐng)輸入各學(xué)生的信息: 學(xué)號(hào)、姓名、三門課成績(jī):n); for(i=0;iN;i+) scanf(%d %s %f %f %f,輸入第1個(gè)成員值,輸入第2個(gè)成員值,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成績(jī)最高的學(xué)生是:n); printf(學(xué)號(hào):%dn姓名:%sn 三門課成績(jī):%5.1f,%5.1f,%5.1fn 平均成績(jī):%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個(gè)函數(shù)的調(diào)用,情況各不相同: 調(diào)用input函數(shù)時(shí),實(shí)參是指針變量,形參是結(jié)構(gòu)體數(shù)組,傳遞的是結(jié)構(gòu)體元素的地址,函數(shù)無(wú)返回值。 調(diào)用max函數(shù)時(shí),實(shí)參是指針變量,形參是結(jié)構(gòu)體數(shù)組,傳遞的是結(jié)構(gòu)體元素的地址,函數(shù)的返回值

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

33、的一種結(jié)構(gòu) 鏈表必須利用指針變量才能實(shí)現(xiàn),70,struct Student int num; float score; struct Student *next; a,b,c,a結(jié)點(diǎn),b結(jié)點(diǎn),c結(jié)點(diǎn),a.next,b.next,num,score,next,71,9.4.2 建立簡(jiǎn)單的靜態(tài)鏈表,例9.8 建立一個(gè)如圖所示的簡(jiǎn)單鏈表,它由3個(gè)學(xué)生數(shù)據(jù)的結(jié)點(diǎn)組成,要求輸出各結(jié)點(diǎn)中的數(shù)據(jù),a結(jié)點(diǎn),b結(jié)點(diǎn),c結(jié)點(diǎn),num,score,next,72,9.4.2 建立簡(jiǎn)單的靜態(tài)鏈表,解題思路,a結(jié)點(diǎn),b結(jié)點(diǎn),c結(jié)點(diǎn),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é)點(diǎn),b結(jié)點(diǎn),c結(jié)點(diǎn),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é)點(diǎn),b結(jié)點(diǎn),c結(jié)點(diǎn),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é)點(diǎn),b結(jié)點(diǎn),c結(jié)點(diǎn),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é)點(diǎn),b結(jié)點(diǎn),c結(jié)點(diǎn),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é)點(diǎn),b結(jié)點(diǎn),c結(jié)點(diǎn),num,score,next,head,NULL,p,相當(dāng)于p=NULL,靜態(tài)鏈表,80,9.4.3 建立動(dòng)態(tài)鏈表,所謂建立動(dòng)態(tài)鏈表是指在程序執(zhí)行

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

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

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

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

41、并使p1指向它,接著輸入該結(jié)點(diǎn)的數(shù)據(jù),head,p1,p2,10101 89.5,10103 90,10107 85,95,解題思路: 再開(kāi)辟另一個(gè)結(jié)點(diǎn)并使p1指向它,接著輸入該結(jié)點(diǎn)的數(shù)據(jù),head,p1,p2,10101 89.5,10103 90,10107 85,p1=(struct Student*)malloc(LEN); scanf(%ld,%f,96,解題思路: 輸入的學(xué)號(hào)為0,表示建立鏈表的過(guò)程完成,該結(jié)點(diǎn)不應(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ù)的長(zhǎng)度,98,struct Student *creat(void) struct Student *head,*p1,*p2; n=0; p1=p2=( struct Student*) malloc(LEN); scanf(“%ld,%f”,p1總是開(kāi)辟新結(jié)點(diǎn) p2總是指向最后結(jié)點(diǎn) 用p2和p1連接兩個(gè)結(jié)點(diǎn),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 編寫(xiě)一個(gè)輸出鏈表的函數(shù)print,1001 67.5,1003 87,1005 99,NULL,p,101,解題思路: 輸出p所指的結(jié)點(diǎn) 使p后移一個(gè)結(jié)點(diǎn),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é)點(diǎn) 使p后移一個(gè)結(jié)點(diǎn),printf(%ld %5.1fn,p-num,p-score,p,103,1001 67.5,1003 87,1005 99,NULL,解題思路: 輸出p所指的新結(jié)點(diǎn) 使p后移一個(gè)結(jié)點(diǎn),printf(%ld %5.1fn,p-num,p-score,p,104,1001 67.5,1003 87,1005 99,NULL,p=p-next,解題思路: 輸出p所指的新結(jié)點(diǎn) 使p后移一個(gè)結(jié)點(diǎn),printf(%ld %5.1fn,p-num,p-score,p,105,1001 67.5,1003 87,1005 99,NULL,p=p-next,解題思路: 輸出p

45、所指的新結(jié)點(diǎn) 使p后移一個(gè)結(jié)點(diǎn),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ù)的特點(diǎn),108,9.5.1 什么是共用體類型,有時(shí)想用同一段內(nèi)存單元存放

46、不同類型的變量。 使幾個(gè)不同的變量共享同一段內(nèi)存的結(jié)構(gòu),稱為 “共用體”類型的結(jié)構(gòu),1000,1001,1002,1003,字符ch,整 型 變 量 i,實(shí) 型 變 量 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)存長(zhǎng)度是各成員占的內(nèi)存長(zhǎng)度之和,每個(gè)成員分別占有其自己的

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

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

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

50、 如果job項(xiàng)為s,則第項(xiàng)為class。即Li是501班的。如果job項(xiàng)是t,則第項(xiàng)為position。Wang是prof(教授,121,解題思路: 對(duì)第5項(xiàng)可以用共用體來(lái)處理(將class和position放在同一段存儲(chǔ)單元中,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 使用枚舉類型,如果一個(gè)變量只有幾種可能的值,則可以定義為枚舉類型 所謂“枚舉”就是指把可能的值一一列舉出來(lái),變量的值只限于列舉出來(lái)的值的范圍內(nèi),127,9.6 使用枚舉類型,聲明枚舉類型用enum開(kāi)頭。 例如: enum Weekdaysun,mon,tue, wed,thu,fri,sat; 聲明了一個(gè)枚舉類型enum Weekday 然后

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

54、賦值語(yǔ)句: workday=mon; 相當(dāng)于workday=1,131,說(shuō)明: (2) 每一個(gè)枚舉元素都代表一個(gè)整數(shù),語(yǔ)言編譯按定義時(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,說(shuō)明: (3) 枚舉元素可以用來(lái)作判斷比較。例如: if(workday=mon) if(workdaysun) 枚舉元素的比較規(guī)則是按其在初始化時(shí)指定的整數(shù)來(lái)進(jìn)行比較的。 如果定義時(shí)

55、未人為指定,則按上面的默認(rèn)規(guī)則處理,即第一個(gè)枚舉元素的值為,故monsun,satfri,133,例9.12 口袋中有紅、黃、藍(lán)、白、黑5種顏色的球若干個(gè)。每次從口袋中先后取出3個(gè)球,問(wèn)得到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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論