版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
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聲明新類型名2022/9/24C語言程序設(shè)計(jì)19.1 定義和使用結(jié)構(gòu)體變量9.1.1 自己建立結(jié)構(gòu)體類型9.1.2 定義結(jié)構(gòu)體類型變量9.1.3 結(jié)構(gòu)體變量的初始化和引用2022/9/24C語言程序設(shè)計(jì)29.1.1 自己建立結(jié)構(gòu)體類型用戶自己建立由不同類型數(shù)據(jù)組成的組合型的數(shù)據(jù)結(jié)構(gòu),它稱為結(jié)構(gòu)體例如,一個學(xué)生的學(xué)號、姓名、性別、年齡、成績、家庭地址等項(xiàng),是屬于同一個學(xué)生的,因此組成一個組合數(shù)據(jù),如student_1的
2、變量,反映它們之間的內(nèi)在聯(lián)系2022/9/24C語言程序設(shè)計(jì)39.1.1 自己建立結(jié)構(gòu)體類型struct Student int num; char name20; char sex; int age; float score; char addr30; ;由程序設(shè)計(jì)者指定了一個結(jié)構(gòu)體類型struct Student它包括num,name,sex,age,score,addr等不同類型的成員2022/9/24C語言程序設(shè)計(jì)49.1.1 自己建立結(jié)構(gòu)體類型聲明一個結(jié)構(gòu)體類型的一般形式為: struct 結(jié)構(gòu)體名 成員表列 ; 類型名 成員名;2022/9/24C語言程序設(shè)計(jì)59.1.1 自己建立
3、結(jié)構(gòu)體類型說明:(1)結(jié)構(gòu)體類型并非只有一種,而是可以設(shè)計(jì)出許多種結(jié)構(gòu)體類型,例如struct Teacherstruct Workerstruct Date等結(jié)構(gòu)體類型各自包含不同的成員2022/9/24C語言程序設(shè)計(jì)69.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; ;2022/9/24C語言程序設(shè)計(jì)79.1.1
4、 自己建立結(jié)構(gòu)體類型說明:(2) 成員可以屬于另一個結(jié)構(gòu)體類型。 numnamesexagebirthdayaddrmonthdayyear2022/9/24C語言程序設(shè)計(jì)89.1.2 定義結(jié)構(gòu)體類型變量前面只是建立了一個結(jié)構(gòu)體類型,它相當(dāng)于一個模型,并沒有定義變量,其中并無具體數(shù)據(jù),系統(tǒng)對之也不分配存儲單元。相當(dāng)于設(shè)計(jì)好了圖紙,但并未建成具體的房屋。為了能在程序中使用結(jié)構(gòu)體類型的數(shù)據(jù),應(yīng)當(dāng)定義結(jié)構(gòu)體類型的變量,并在其中存放具體的數(shù)據(jù)。2022/9/24C語言程序設(shè)計(jì)99.1.2 定義結(jié)構(gòu)體類型變量1. 先聲明結(jié)構(gòu)體類型,再定義該類型變量聲明結(jié)構(gòu)體類型struct Student,可以用它來定
5、義變量 struct Student student1,student2;結(jié)構(gòu)體類型名結(jié)構(gòu)體變量名 2022/9/24C語言程序設(shè)計(jì)109.1.2 定義結(jié)構(gòu)體類型變量1. 先聲明結(jié)構(gòu)體類型,再定義該類型變量聲明結(jié)構(gòu)體類型struct Student,可以用它來定義變量 struct Student student1,student2;10001Zhang XinM1990.5Shanghaistudent110002Wang LiF2098Beijingstudent22022/9/24C語言程序設(shè)計(jì)119.1.2 定義結(jié)構(gòu)體類型變量2.在聲明類型的同時(shí)定義變量(不建議使用)struct St
6、udent int num; char name20; char sex; int age; float score; char addr30; student1,student2;2022/9/24C語言程序設(shè)計(jì)129.1.2 定義結(jié)構(gòu)體類型變量3. 不指定類型名而直接定義結(jié)構(gòu)體類型變量其一般形式為: struct 成員表列 變量名表列; 指定了一個無名的結(jié)構(gòu)體類型 。注意:作業(yè)和考試中不允許使用2022/9/24C語言程序設(shè)計(jì)139.1.2 定義結(jié)構(gòu)體類型變量(1) 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量是不同的概念,不要混同。只能對變量賦值、存取或運(yùn)算,而不能對一個類型賦值、存取或運(yùn)算。在編譯時(shí),對類型
7、是不分配空間的,只對變量分配空間。2022/9/24C語言程序設(shè)計(jì)149.1.2 定義結(jié)構(gòu)體類型變量(2) 結(jié)構(gòu)體類型中的成員名可以與程序中的變量名相同,但二者不代表同一對象。(3) 對結(jié)構(gòu)體變量中的成員(即“域”),可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量。2022/9/24C語言程序設(shè)計(jì)15 例9.1 把一個學(xué)生的信息(包括學(xué)號、姓名、性別、住址)放在一個結(jié)構(gòu)體變量中,然后輸出這個學(xué)生的信息。解題思路:自己建立一個結(jié)構(gòu)體類型,包括有關(guān)學(xué)生信息的各成員用它定義結(jié)構(gòu)體變量,同時(shí)賦以初值輸出該結(jié)構(gòu)體變量的各成員9.1.3 結(jié)構(gòu)體變量的初始化和引用2022/9/24C語言程序設(shè)計(jì)16#inclu
8、de 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; /注意:此程序格式不規(guī)范!2022/9/24C語言程序設(shè)計(jì)17#include int main()struct Student long int num; char name20; char sex
9、; 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; /注意:此程序格式不規(guī)范!2022/9/24C語言程序設(shè)計(jì)18#include int main()struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; /注意:此程序格
10、式不規(guī)范!a.num=10010; 對printf(“%sn”,a); 不對2022/9/24C語言程序設(shè)計(jì)19#include int main()struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; /注意:此程序格式不規(guī)范!b=a; 對struct Student b;b.num+; 對2022/9/24C語言程序設(shè)計(jì)20#include int main()struct Student long int num; char name
11、20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; scanf(%ld,&a.num); 對printf(%o,&a); 對scanf(“%ld,%s,%c,%sn”,&a); 錯2022/9/24C語言程序設(shè)計(jì)21#include 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;int main()
12、struct Stu a,b;a.birthday.month=12; 對a.age=10; b.age=9; 對sum=a.age+b.age; 對2022/9/24C語言程序設(shè)計(jì)22 例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é)生的全部信息2022/9/24C語言程序設(shè)計(jì)23#inclu
13、de struct Student int num; char name20; float score; ;int main() struct Student student1,student2; scanf(%d%s%f,&student1.num, , &student1.score); scanf(“%d%s%f”,&student2.num, , &student2.score); 不能加&2022/9/24C語言程序設(shè)計(jì)24 printf(The higher score is:n); if (student1.scorestude
14、nt2.score) printf(%d %s %6.2fn,student1.num, , student1.score); 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,
15、, student2.score); return 0;2022/9/24C語言程序設(shè)計(jì)259.2 使用結(jié)構(gòu)體數(shù)組9.2.1定義結(jié)構(gòu)體數(shù)組9.2.2 結(jié)構(gòu)體數(shù)組的應(yīng)用舉例2022/9/24C語言程序設(shè)計(jì)269.2.1定義結(jié)構(gòu)體數(shù)組 例9.3 有3個候選人,每個選民只能投票選一人,要求編一個統(tǒng)計(jì)選票的程序,先后輸入被選人的名字,最后輸出各人得票結(jié)果。2022/9/24C語言程序設(shè)計(jì)279.2.1定義結(jié)構(gòu)體數(shù)組解題思路:設(shè)一個結(jié)構(gòu)體數(shù)組,數(shù)組中包含3個元素每個元素中的信息應(yīng)包括候選人的姓名(字符型)和得票數(shù)(整型)輸入被選人的姓名,然后與數(shù)組元素中的“姓名”成員比較,如果相同,就給這個元素中的“得
16、票數(shù)”成員的值加1輸出所有元素的信息2022/9/24C語言程序設(shè)計(jì)28#include #include struct Person char name20; int count; leader3=“Li”,0,“Zhang”,0,“Sun”,0; 全局的結(jié)構(gòu)體數(shù)組namecountleader0Li0Zhang0Sun02022/9/24C語言程序設(shè)計(jì)29int 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
17、, )=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn“,, leaderi.count); return 0;leaderj.count=leaderj.count+1;2022/9/24C語言程序設(shè)計(jì)30int 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.c
18、ount+; for(i=0;i3;i+) printf(%5s:%dn“,, leaderi.count); return 0;2022/9/24C語言程序設(shè)計(jì)31說明:(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; 2022/9/24C語言程序設(shè)計(jì)32說明:(2)對結(jié)構(gòu)體數(shù)組初始化的形式是在定義數(shù)組的后面加上:初值表列; 如:struct Person leader3= Li,0,Zhang,0,
19、Fun,0; 2022/9/24C語言程序設(shè)計(jì)339.2.2 結(jié)構(gòu)體數(shù)組的應(yīng)用舉例 例9.4 有n個學(xué)生的信息(包括學(xué)號、姓名、成績),要求按照成績的高低順序輸出各學(xué)生的信息。解題思路:用結(jié)構(gòu)體數(shù)組存放n個學(xué)生信息,采用選擇法對各元素進(jìn)行排序(進(jìn)行比較的是各元素中的成績)。2022/9/24C語言程序設(shè)計(jì)34#include struct Student int num; char name20; float score; ; int main() struct Student stu5=10101,Zhang,78 , 10103,Wang,98.5, 10106,Li, 86 , 1010
20、8,“Ling”, 73.5, 10110,“Fun”, 100 ; struct Student temp; const int n = 5 ; int i,j,k;常變量若人數(shù)變?yōu)?0302022/9/24C語言程序設(shè)計(jì)35#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 ; struct
21、 Student temp; const int n = 5 ; int i,j,k;#define N 5注意temp的類型2022/9/24C語言程序設(shè)計(jì)36 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.score); printf(n); return 0;寫法上與普通變量一致2022/9/24C語
22、言程序設(shè)計(jì)379.3 結(jié)構(gòu)體指針9.3.1 指向結(jié)構(gòu)體變量的指針9.3.2 指向結(jié)構(gòu)體數(shù)組的指針9.3.3 用結(jié)構(gòu)體變量和結(jié)構(gòu)體變量的指針作函數(shù)參數(shù)2022/9/24C語言程序設(shè)計(jì)389.3.1 指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體對象的指針變量既可以指向結(jié)構(gòu)體變量,也可以用來指向結(jié)構(gòu)體數(shù)組中的元素。指針變量的基類型必須與結(jié)構(gòu)體變量的類型相同。例如: struct Student *pt; 2022/9/24C語言程序設(shè)計(jì)399.3.1 指向結(jié)構(gòu)體變量的指針 例9.5 通過指向結(jié)構(gòu)體變量的指針變量輸出結(jié)構(gòu)體變量中成員的信息。解題思路:在已有的基礎(chǔ)上,本題要解決兩個問題:怎樣對結(jié)構(gòu)體變量成員賦值;怎樣
23、通過指向結(jié)構(gòu)體變量的指針訪問結(jié)構(gòu)體變量中成員。2022/9/24C語言程序設(shè)計(jì)40#include #include struct Student long num; char name20; char sex; float score; ;int main()2022/9/24C語言程序設(shè)計(jì)41 struct Student stu_1; struct Student * p; p=&stu_1; stu_1.num=10101; strcpy(stu_1.name,“Li Lin”); stu_1.sex=M; stu_1.score=89.5; printf(No.:%ldn”,stu_
24、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.5p2022/9/24C語言程序設(shè)計(jì)42 struct Student stu_1; struct Student * p; p=&stu_1; stu_1.num=10101; strcpy(stu_1.name,“Li Lin”); stu_1.sex=M; stu_1.score=89.5; printf(No.:%ldn”,stu
25、_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).score2022/9/24C語言程序設(shè)計(jì)43說明:為了使用方便和直觀,C語言允許把(*p).num用p-num來代替(*p).name等價(jià)于p-name如果p指向一個結(jié)構(gòu)體變量stu,以下等價(jià): stu.成員名(如stu.num) (*p).成員名(如(*p).num)
26、p-成員名(如p-num)2022/9/24C語言程序設(shè)計(jì)449.3.2 指向結(jié)構(gòu)體數(shù)組的指針 例9.6 有3個學(xué)生的信息,放在結(jié)構(gòu)體數(shù)組中,要求輸出全部學(xué)生的信息。2022/9/24C語言程序設(shè)計(jì)45解題思路:用指向結(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)信息2022/9/24C語言程序設(shè)計(jì)46#include struct Student int n
27、um; char name20; char sex; int age;struct Student stu3= 10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20 ;2022/9/24C語言程序設(shè)計(jì)47int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;10101Li LinM1810102Zhang FangM1910104Wang MinF20stu0stu1st
28、u22022/9/24C語言程序設(shè)計(jì)48int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;10101Li LinM1810102Zhang FangM1910104Wang MinF20pstu0stu1stu22022/9/24C語言程序設(shè)計(jì)49int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age)
29、; return 0;10101Li LinM1810102Zhang FangM1910104Wang MinF20pstu0stu1stu22022/9/24C語言程序設(shè)計(jì)50int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0;10101Li LinM1810102Zhang FangM1910104Wang MinF20pstu0stu1stu22022/9/24C語言程序設(shè)計(jì)519.3.3 用結(jié)構(gòu)體變量和結(jié)構(gòu)體變量的指針作函數(shù)參
30、數(shù)將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù),有3個方法。2022/9/24C語言程序設(shè)計(jì)52(1) 用結(jié)構(gòu)體變量的成員作參數(shù)。 例如,用stu1.num或作函數(shù)實(shí)參,將實(shí)參值傳給形參。用法和用普通變量作實(shí)參是一樣的,屬于“值傳遞”方式。應(yīng)當(dāng)注意實(shí)參與形參的類型保持一致。2022/9/24C語言程序設(shè)計(jì)53(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í)間上開銷較大在被調(diào)用函數(shù)期間改變形參(也是結(jié)構(gòu)體變量)的值,不能返回主調(diào)函數(shù)一般較少用這
31、種方法2022/9/24C語言程序設(shè)計(jì)54(3)用指向結(jié)構(gòu)體變量(或數(shù)組元素)的指針作實(shí)參,將結(jié)構(gòu)體變量(或數(shù)組元素)的地址傳給形參。2022/9/24C語言程序設(shè)計(jì)55 例9.7 有n個結(jié)構(gòu)體變量,內(nèi)含學(xué)生學(xué)號、姓名和3門課程的成績。要求輸出平均成績最高的學(xué)生的信息(包括學(xué)號、姓名、3門課程成績和平均成績)。2022/9/24C語言程序設(shè)計(jì)56解題思路:將n個學(xué)生的數(shù)據(jù)表示為結(jié)構(gòu)體數(shù)組。按照功能函數(shù)化的思想,分別用3個函數(shù)來實(shí)現(xiàn)不同的功能:用input函數(shù)輸入數(shù)據(jù)和求各學(xué)生平均成績用max函數(shù)找平均成績最高的學(xué)生用print函數(shù)輸出成績最高學(xué)生的信息在主函數(shù)中先后調(diào)用這3個函數(shù),用指向結(jié)構(gòu)體
32、變量的指針作實(shí)參。最后得到結(jié)果。本程序假設(shè)n=32022/9/24C語言程序設(shè)計(jì)57#include #define N 3struct Student int num; char name20; float score3; float aver; ;4個成員輸入前3個成員值計(jì)算最后成員值2022/9/24C語言程序設(shè)計(jì)58int main() void input(struct Student stu); struct Student max(struct Student stu); void print(struct Student stu); struct Student stuN,*p
33、=stu; input(p); print(max(p); return 0;2022/9/24C語言程序設(shè)計(jì)59void input(struct Student stu); struct Student max(struct Student stu); void print(struct Student stu); int main() struct Student stuN,*p=stu; input(p); print(max(p); return 0;2022/9/24C語言程序設(shè)計(jì)60void input(struct Student stu) int i; printf(請輸入各
34、學(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個成員值計(jì)算第4個成員值stu0stu1stu2stu10101Li78 89 9888.33i=02022/9/24C語言程序設(shè)計(jì)61void input(struct Student stu) int
35、i; printf(請輸入各學(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個成員值計(jì)算第4個成員值stu0stu1stu2stu10101Li78 89 9888.3310103Wang98.5 87 6984.83i=12022/9/24C語言程序設(shè)
36、計(jì)62void input(struct Student stu) int i; printf(請輸入各學(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個成員值計(jì)算第4個成員值stu0stu1stu2stu10101Li78 89 9888.331010
37、3Wang98.5 87 6984.8310106Sun 88 76.5 8984.5i=22022/9/24C語言程序設(shè)計(jì)63struct 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最大返回2022/9/24C語言程序設(shè)計(jì)64void print(struct Student stud) printf(n成績最高
38、的學(xué)生是:n);printf(學(xué)號:%dn姓名:%sn 三門課成績:%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.5numnamescoreaverstu0stu1stu22022/9/24C語言程序設(shè)計(jì)65以上3個函數(shù)的調(diào)用,情況各不相同:調(diào)用input函數(shù)時(shí),實(shí)參是指針變量,形參是結(jié)構(gòu)體數(shù)組,傳遞
39、的是結(jié)構(gòu)體元素的地址,函數(shù)無返回值。調(diào)用max函數(shù)時(shí),實(shí)參是指針變量,形參是結(jié)構(gòu)體數(shù)組,傳遞的是結(jié)構(gòu)體元素的地址,函數(shù)的返回值是結(jié)構(gòu)體類型數(shù)據(jù)。調(diào)用print函數(shù)時(shí),實(shí)參是結(jié)構(gòu)體變量,形參是結(jié)構(gòu)體變量,傳遞的是結(jié)構(gòu)體變量中各成員的值,函數(shù)無返回值。2022/9/24C語言程序設(shè)計(jì)669.4 用指針處理鏈表9.4.1 什么是鏈表9.4.2 建立簡單的靜態(tài)鏈表9.4.3 建立動態(tài)鏈表9.4.4 輸出鏈表2022/9/24C語言程序設(shè)計(jì)679.4.1 什么是鏈表鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)它是動態(tài)地進(jìn)行存儲分配的一種結(jié)構(gòu)head12491249A135613561475B1475C10211021
40、D0頭指針各結(jié)點(diǎn)地址不連續(xù)各結(jié)點(diǎn)含有兩個部分表尾2022/9/24C語言程序設(shè)計(jì)689.4.1 什么是鏈表鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)它是動態(tài)地進(jìn)行存儲分配的一種結(jié)構(gòu)鏈表必須利用指針變量才能實(shí)現(xiàn)2022/9/24C語言程序設(shè)計(jì)69struct Student int num; float score; struct Student *next; a,b,c;1010189.510103901010785a結(jié)點(diǎn)b結(jié)點(diǎn)c結(jié)點(diǎn)a.next=&b;b.next=&c;numscorenext2022/9/24C語言程序設(shè)計(jì)709.4.2 建立簡單的靜態(tài)鏈表 例9.8 建立一個如圖所示的簡單鏈表,它由
41、3個學(xué)生數(shù)據(jù)的結(jié)點(diǎn)組成,要求輸出各結(jié)點(diǎn)中的數(shù)據(jù)。1010189.510103901010785a結(jié)點(diǎn)b結(jié)點(diǎn)c結(jié)點(diǎn)numscorenext2022/9/24C語言程序設(shè)計(jì)719.4.2 建立簡單的靜態(tài)鏈表解題思路:1010189.510103901010785a結(jié)點(diǎn)b結(jié)點(diǎn)c結(jié)點(diǎn)numscorenextheadhead=&a;a.next=&b;b.next=&c;NULLc.next=NULL;2022/9/24C語言程序設(shè)計(jì)72#include struct Student int num; float score; struct Student *next;2022/9/24C語言程序設(shè)計(jì)7
42、3int 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=&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;2022/9/24C語言程序設(shè)計(jì)74 p=head; do printf(“%ld%5.1fn”,p-n
43、um,p-score); p=p-next; while(p!=NULL); return 0;1010189.510103901010785a結(jié)點(diǎn)b結(jié)點(diǎn)c結(jié)點(diǎn)numscorenextheadNULLp相當(dāng)于p=&b;2022/9/24C語言程序設(shè)計(jì)75 p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); return 0;1010189.510103901010785a結(jié)點(diǎn)b結(jié)點(diǎn)c結(jié)點(diǎn)numscorenextheadNULLp相當(dāng)于p=&b;2022/9/24C語言程序設(shè)計(jì)76 p=head; do
44、printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); return 0;1010189.510103901010785a結(jié)點(diǎn)b結(jié)點(diǎn)c結(jié)點(diǎn)numscorenextheadNULLp相當(dāng)于p=&c;2022/9/24C語言程序設(shè)計(jì)77 p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); return 0;1010189.510103901010785a結(jié)點(diǎn)b結(jié)點(diǎn)c結(jié)點(diǎn)numscorenextheadNULLp相當(dāng)于p=&c;2022/9/2
45、4C語言程序設(shè)計(jì)78 p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); return 0;1010189.510103901010785a結(jié)點(diǎn)b結(jié)點(diǎn)c結(jié)點(diǎn)numscorenextheadNULLp相當(dāng)于p=NULL;靜態(tài)鏈表2022/9/24C語言程序設(shè)計(jì)799.4.3 建立動態(tài)鏈表所謂建立動態(tài)鏈表是指在程序執(zhí)行過程中從無到有地建立起一個鏈表,即一個一個地開辟結(jié)點(diǎn)和輸入各結(jié)點(diǎn)數(shù)據(jù),并建立起前后相鏈的關(guān)系。2022/9/24C語言程序設(shè)計(jì)809.4.3 建立動態(tài)鏈表 例9.9 寫一函數(shù)建立一個有3名學(xué)生
46、數(shù)據(jù)的單向動態(tài)鏈表。2022/9/24C語言程序設(shè)計(jì)81解題思路:定義3個指針變量:head,p1和p2,它們都是用來指向struct Student類型數(shù)據(jù)struct Student *head,*p1,*p2;2022/9/24C語言程序設(shè)計(jì)82解題思路:用malloc函數(shù)開辟第一個結(jié)點(diǎn),并使p1和p2指向它p1p1=p2=(struct Student*)malloc(LEN);p22022/9/24C語言程序設(shè)計(jì)83解題思路:讀入一個學(xué)生的數(shù)據(jù)給p1所指的第一個結(jié)點(diǎn)p1scanf(%ld,%f,&p1-num,&p1-score);p21010189.52022/9/24C語言程序設(shè)
47、計(jì)84解題思路:讀入一個學(xué)生的數(shù)據(jù)給p1所指的第一個結(jié)點(diǎn)使head也指向新開辟的結(jié)點(diǎn)headp1p2scanf(%ld,%f,&p1-num,&p1-score);1010189.52022/9/24C語言程序設(shè)計(jì)85解題思路:再開辟另一個結(jié)點(diǎn)并使p1指向它,接著輸入該結(jié)點(diǎn)的數(shù)據(jù)headp1p21010189.52022/9/24C語言程序設(shè)計(jì)86解題思路:再開辟另一個結(jié)點(diǎn)并使p1指向它,接著輸入該結(jié)點(diǎn)的數(shù)據(jù)headp1p21010189.5p1=(struct Student*)malloc(LEN);scanf(%ld,%f,&p1-num,&p1-score);10103902022/9
48、/24C語言程序設(shè)計(jì)87解題思路:使第一個結(jié)點(diǎn)的next成員指向第二個結(jié)點(diǎn),即連接第一個結(jié)點(diǎn)與第二個結(jié)點(diǎn)使p2指向剛才建立的結(jié)點(diǎn)headp1p21010189.5p2-next=p1;10103902022/9/24C語言程序設(shè)計(jì)88解題思路:使第一個結(jié)點(diǎn)的next成員指向第二個結(jié)點(diǎn),即連接第一個結(jié)點(diǎn)與第二個結(jié)點(diǎn)使p2指向剛才建立的結(jié)點(diǎn)headp1p21010189.5p2-next=p1;1010390p2=p1;2022/9/24C語言程序設(shè)計(jì)89解題思路:再開辟另一個結(jié)點(diǎn)并使p1指向它,接著輸入該結(jié)點(diǎn)的數(shù)據(jù)headp1p21010189.510103902022/9/24C語言程序設(shè)計(jì)9
49、0解題思路:再開辟另一個結(jié)點(diǎn)并使p1指向它,接著輸入該結(jié)點(diǎn)的數(shù)據(jù)headp1p21010189.51010390p1=(struct Student*)malloc(LEN);scanf(%ld,%f,&p1-num,&p1-score);10107852022/9/24C語言程序設(shè)計(jì)91解題思路:使第二個結(jié)點(diǎn)的next成員指向第三個結(jié)點(diǎn),即連接第二個結(jié)點(diǎn)與第三個結(jié)點(diǎn)使p2指向剛才建立的結(jié)點(diǎn)headp1p21010189.510103901010785p2-next=p1;2022/9/24C語言程序設(shè)計(jì)92解題思路:使第二個結(jié)點(diǎn)的next成員指向第三個結(jié)點(diǎn),即連接第二個結(jié)點(diǎn)與第三個結(jié)點(diǎn)使p2
50、指向剛才建立的結(jié)點(diǎn)headp1p21010189.510103901010785p2-next=p1;p2=p1;2022/9/24C語言程序設(shè)計(jì)93解題思路:再開辟另一個結(jié)點(diǎn)并使p1指向它,接著輸入該結(jié)點(diǎn)的數(shù)據(jù)headp1p21010189.51010390101078502022/9/24C語言程序設(shè)計(jì)94解題思路:再開辟另一個結(jié)點(diǎn)并使p1指向它,接著輸入該結(jié)點(diǎn)的數(shù)據(jù)headp1p21010189.5101039010107850p1=(struct Student*)malloc(LEN);scanf(%ld,%f,&p1-num,&p1-score);2022/9/24C語言程序設(shè)計(jì)9
51、5解題思路:輸入的學(xué)號為0,表示建立鏈表的過程完成,該結(jié)點(diǎn)不應(yīng)連接到鏈表中headp1p21010189.5101039010107850NULLp2-next=NULL;2022/9/24C語言程序設(shè)計(jì)96#include #include #define LEN sizeof(struct Student)struct Student long num; float score; struct Student *next;int n;struct Student類型數(shù)據(jù)的長度2022/9/24C語言程序設(shè)計(jì)97struct Student *creat(void) struct Stude
52、nt *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(“%ld,%f”,&p1-num,&p1-score); p2-next=NULL; return(head);p1總是開辟新結(jié)點(diǎn)p2總是指向最后結(jié)點(diǎn)用p2和p1連接兩個結(jié)點(diǎn)20
53、22/9/24C語言程序設(shè)計(jì)98int main() struct Student *pt; pt=creat(); printf(“nnum:%ldnscore:%5.1fn”, pt-num,pt-score); return 0;2022/9/24C語言程序設(shè)計(jì)999.4.4 輸出鏈表例9.10 編寫一個輸出鏈表的函數(shù)print。100167.5100387100599NULLp2022/9/24C語言程序設(shè)計(jì)100解題思路:輸出p所指的結(jié)點(diǎn)使p后移一個結(jié)點(diǎn)p100167.5100387100599NULLprintf(%ld %5.1fn,p-num,p-score);2022/9/2
54、4C語言程序設(shè)計(jì)101100167.5100387100599NULLp=p-next;解題思路:輸出p所指的結(jié)點(diǎn)使p后移一個結(jié)點(diǎn)printf(%ld %5.1fn,p-num,p-score);p2022/9/24C語言程序設(shè)計(jì)102100167.5100387100599NULL解題思路:輸出p所指的新結(jié)點(diǎn)使p后移一個結(jié)點(diǎn)printf(%ld %5.1fn,p-num,p-score);p2022/9/24C語言程序設(shè)計(jì)103100167.5100387100599NULLp=p-next;解題思路:輸出p所指的新結(jié)點(diǎn)使p后移一個結(jié)點(diǎn)printf(%ld %5.1fn,p-num,p-sc
55、ore);p2022/9/24C語言程序設(shè)計(jì)104100167.5100387100599NULLp=p-next;解題思路:輸出p所指的新結(jié)點(diǎn)使p后移一個結(jié)點(diǎn)printf(%ld %5.1fn,p-num,p-score);p相當(dāng)于p=NULL;2022/9/24C語言程序設(shè)計(jì)105void 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);2022/9/24C語言程序設(shè)計(jì)1
56、069.5 共用體類型9.5.1 什么是共用體類型9.5.2 引用共用體變量的方式9.5.3 共用體類型數(shù)據(jù)的特點(diǎn)2022/9/24C語言程序設(shè)計(jì)1079.5.1 什么是共用體類型有時(shí)想用同一段內(nèi)存單元存放不同類型的變量。使幾個不同的變量共享同一段內(nèi)存的結(jié)構(gòu),稱為 “共用體”類型的結(jié)構(gòu)。1000100110021003字符ch整 型 變 量 i實(shí) 型 變 量 f2022/9/24C語言程序設(shè)計(jì)108定義共用體類型變量的一般形式為:union共用體名 成員表列變量表列; 例如:union Data int i; char ch; float f; a,b,c; union Data int i;
57、 char ch; float f; ;union Data a,b,c; 2022/9/24C語言程序設(shè)計(jì)109“共用體”與“結(jié)構(gòu)體”的定義形式相似,但它們的含義是不同的。結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和,每個成員分別占有其自己的內(nèi)存單元。而共用體變量所占的內(nèi)存長度等于最長的成員的長度。2022/9/24C語言程序設(shè)計(jì)1109.5.2 引用共用體變量的方式只有先定義了共用體變量才能引用它,但應(yīng)注意,不能引用共用體變量,而只能引用共用體變量中的成員。例如,前面定義了a,b,c為共用體變量,下面的引用方式是正確的: a.i a.ch a.f 2022/9/24C語言程序設(shè)計(jì)1119
58、.5.3 共用體類型數(shù)據(jù)的特點(diǎn)在使用共用體類型數(shù)據(jù)時(shí)要注意以下一些特點(diǎn):(1) 同一個內(nèi)存段可以用來存放幾種不同類型的成員,但在每一瞬時(shí)只能存放其中一個成員,而不是同時(shí)存放幾個。2022/9/24C語言程序設(shè)計(jì)1129.5.3 共用體類型數(shù)據(jù)的特點(diǎn)在使用共用體類型數(shù)據(jù)時(shí)要注意以下一些特點(diǎn):(2)可以對共用體變量初始化,但初始化表中只能有一個常量。2022/9/24C語言程序設(shè)計(jì)1139.5.3 共用體類型數(shù)據(jù)的特點(diǎn)在使用共用體類型數(shù)據(jù)時(shí)要注意以下一些特點(diǎn):(3)共用體變量中起作用的成員是最后一次被賦值的成員,在對共用體變量中的一個成員賦值后,原有變量存儲單元中的值就取代。2022/9/24C語
59、言程序設(shè)計(jì)1149.5.3 共用體類型數(shù)據(jù)的特點(diǎn)在使用共用體類型數(shù)據(jù)時(shí)要注意以下一些特點(diǎn):(4) 共用體變量的地址和它的各成員的地址都是同一地址。(5) 不能對共用體變量名賦值,也不能企圖引用變量名來得到一個值。2022/9/24C語言程序設(shè)計(jì)1159.5.3 共用體類型數(shù)據(jù)的特點(diǎn)在使用共用體類型數(shù)據(jù)時(shí)要注意以下一些特點(diǎn):(6) 以前的C規(guī)定不能把共用體變量作為函數(shù)參數(shù),但可以使用指向共用體變量的指針作函數(shù)參數(shù)。C99允許用共用體變量作為函數(shù)參數(shù)。2022/9/24C語言程序設(shè)計(jì)1169.5.3 共用體類型數(shù)據(jù)的特點(diǎn)在使用共用體類型數(shù)據(jù)時(shí)要注意以下一些特點(diǎn):(7) 共用體類型可以出現(xiàn)在結(jié)構(gòu)體類
60、型定義中,也可以定義共用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,數(shù)組也可以作為共用體的成員。2022/9/24C語言程序設(shè)計(jì)1179.5.3 共用體類型數(shù)據(jù)的特點(diǎn) 例9.11 有若干個人員的數(shù)據(jù),其中有學(xué)生和教師。學(xué)生的數(shù)據(jù)中包括:姓名、號碼、性別、職業(yè)、班級。教師的數(shù)據(jù)包括:姓名、號碼、性別、職業(yè)、職務(wù)。要求用同一個表格來處理。2022/9/24C語言程序設(shè)計(jì)118解題思路:學(xué)生和教師的數(shù)據(jù)項(xiàng)目多數(shù)是相同的,但有一項(xiàng)不同。現(xiàn)要求把它們放在同一表格中2022/9/24C語言程序設(shè)計(jì)119解題思路:如果job項(xiàng)為s,則第項(xiàng)為class。即Li是501班的。如果job項(xiàng)是t,則第項(xiàng)為po
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 非盈利社會組織財(cái)務(wù)制度
- 劇組財(cái)務(wù)制度管理
- PpP項(xiàng)目公司應(yīng)執(zhí)行財(cái)務(wù)制度
- 公司制度標(biāo)準(zhǔn)還是公司標(biāo)準(zhǔn)制度
- 養(yǎng)老院老人緊急救援人員福利待遇制度
- 健康產(chǎn)業(yè)客戶管理制度內(nèi)容(3篇)
- 室內(nèi)外管道安裝管理制度(3篇)
- 戈壁地基施工方案(3篇)
- 供水接管施工方案(3篇)
- 校園秩序維護(hù)制度
- 2026四川雅安市漢源縣審計(jì)局招聘編外專業(yè)技術(shù)人員2人筆試備考試題及答案解析
- 金融投資分析與決策指導(dǎo)手冊(標(biāo)準(zhǔn)版)
- 食品銷售業(yè)務(wù)員培訓(xùn)課件
- 新疆干旱的原因
- 2026年學(xué)校意識形態(tài)工作計(jì)劃
- 2025年銀行信息科技崗筆試真題及答案
- 山西電化學(xué)儲能項(xiàng)目建議書
- 2025年及未來5年中國林產(chǎn)化學(xué)產(chǎn)品制造行業(yè)市場深度研究及投資戰(zhàn)略咨詢報(bào)告
- GB/T 46392-2025縣域無障礙環(huán)境建設(shè)評價(jià)規(guī)范
- DB32-T 4285-2022 預(yù)應(yīng)力混凝土空心方樁基礎(chǔ)技術(shù)規(guī)程
- 數(shù)獨(dú)六宮格(高級難度)游戲題目100題
評論
0/150
提交評論