第9章使用結(jié)構(gòu)體類型處理組合數(shù)據(jù)_第1頁
第9章使用結(jié)構(gòu)體類型處理組合數(shù)據(jù)_第2頁
第9章使用結(jié)構(gòu)體類型處理組合數(shù)據(jù)_第3頁
第9章使用結(jié)構(gòu)體類型處理組合數(shù)據(jù)_第4頁
第9章使用結(jié)構(gòu)體類型處理組合數(shù)據(jù)_第5頁
已閱讀5頁,還剩107頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C語言提供了一些由系統(tǒng)已定義好的數(shù)據(jù)類型,如:整型、實型、字符型、指針等類型,C語言還允許用戶根據(jù)需要自己建立數(shù)據(jù)類型,用它來定義變量。9.1 定義和使用結(jié)構(gòu)體變量9.2 結(jié)構(gòu)體數(shù)組9.3 結(jié)構(gòu)體指針9.4 用結(jié)構(gòu)體變量和結(jié)構(gòu)體變量的指針作函數(shù)參數(shù)9.5 用指針處理鏈表9.6 提高部分9.1 定義和使用結(jié)構(gòu)體變量9.1.1 自己建立結(jié)構(gòu)體類型9.1.2 定義結(jié)構(gòu)體類型變量9.1.3 結(jié)構(gòu)體變量的初始化和引用9.1.1 自己建立結(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é)號、姓名、性別、例

2、如,一個學(xué)生的學(xué)號、姓名、性別、年齡、成績、家庭地址等項,是屬于同年齡、成績、家庭地址等項,是屬于同一個學(xué)生的一個學(xué)生的,因此,因此組成一個組合數(shù)據(jù),組成一個組合數(shù)據(jù),如如student_1的變量,反映它們之間的內(nèi)的變量,反映它們之間的內(nèi)在聯(lián)系在聯(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等不同類等不同類型的成

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

4、 birthday; char addr30; ;說明:(2) 成員可以屬于另一個結(jié)構(gòu)體類型。 numnamesexagebirthdayaddrmonthdayyear9.1.2 定義結(jié)構(gòu)體類型變量前面只是建立了一個結(jié)構(gòu)體類型,它相前面只是建立了一個結(jié)構(gòu)體類型,它相當(dāng)于一個模型,并沒有定義變量,其中當(dāng)于一個模型,并沒有定義變量,其中并無具體數(shù)據(jù),系統(tǒng)對之也不分配存儲并無具體數(shù)據(jù),系統(tǒng)對之也不分配存儲單元。單元。相當(dāng)于設(shè)計好了圖紙,但并未建成具體相當(dāng)于設(shè)計好了圖紙,但并未建成具體的房屋。為了能在程序中使用結(jié)構(gòu)體類的房屋。為了能在程序中使用結(jié)構(gòu)體類型的數(shù)據(jù),應(yīng)當(dāng)定義結(jié)構(gòu)體類型的變量型的數(shù)據(jù),應(yīng)當(dāng)

5、定義結(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 student,可以用它可以用它來定義變量來定義變量 struct student student1,student2;100

6、01Zhang XinM 1990.5Shanghaistudent110002Wang LiF2098Beijingstudent22.在聲明類型的同時定義變量在聲明類型的同時定義變量struct student int num; char name20; char sex; int age; float score; char addr30; student1,student2;3. 不指定類型名而直接定義結(jié)構(gòu)體類型變量不指定類型名而直接定義結(jié)構(gòu)體類型變量其一般形式為其一般形式為: struct 成員表列成員表列 變量名表列變量名表列; 指定了一個無名的結(jié)構(gòu)體類型指定了一個無名的結(jié)構(gòu)體類型

7、 。說明:說明:(1) 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量是不同的概念結(jié)構(gòu)體類型與結(jié)構(gòu)體變量是不同的概念,不要混同。只能對變量賦值、存取或,不要混同。只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算,而不能對一個類型賦值、存取或運算。在編譯時,對類型是不分配空間運算。在編譯時,對類型是不分配空間的,只對變量分配空間。的,只對變量分配空間。(2) 結(jié)構(gòu)體類型中的成員名可以與程序中的結(jié)構(gòu)體類型中的成員名可以與程序中的變量名相同變量名相同,但二者不代表同一對象。但二者不代表同一對象。(3) 對結(jié)構(gòu)體變量中的成員(即對結(jié)構(gòu)體變量中的成員(即“域域”),),可以單獨使用,它的作用與地位相當(dāng)于普可以單獨使

8、用,它的作用與地位相當(dāng)于普通變量。通變量。9.1.3 結(jié)構(gòu)體變量的初始化和引用 例9.1 把一個學(xué)生的信息放在一個結(jié)構(gòu)體變量中,然后輸出這個學(xué)生的信息。解題思路:先在程序中自己建立一個結(jié)構(gòu)體類型,包括有關(guān)學(xué)生信息的各成員然后用它來定義結(jié)構(gòu)體變量,同時賦以初值最后輸出該結(jié)構(gòu)體變量的各成員#include void main()struct student int num; char name20; char sex; char addr20; student1=10101,“Li Lin”,M, “123 Beijing Road”; printf(NO.:%dnname:%sn sex:%cn

9、address:%sn, student1.num, , student1.sex, student1.addr);#include void main()struct student int num; char name20; char sex; char addr20; student1=10101,“Li Lin”,M, “123 Beijing Road”; printf(NO.:%dnname:%sn sex:%cnaddress:%sn, student1.num, , student1.sex, student1.addr);#

10、include void main()struct student int num; char name20; char sex; char addr20; student1=10101,“Li Lin”,M, “123 Beijing Road”; student1.num=10010; 對對printf(“%sn”,student1); 不對不對#include void main()struct student int num; char name20; char sex; char addr20; student1=10101,“Li Lin”,M, “123 Beijing Road

11、”; struct date birthday; student1.num=10010; 對對student1.birthday.month=11; 對對#include void main()struct student int num; char name20; char sex; char addr20; student1=10101,“Li Lin”,M, “123 Beijing Road”; student2.num=student1.num; 對對sum=student1.num+student2.num; 對對student1.num+; 對對,student2; #inclu

12、de void main()struct student int num; char name20; char sex; char addr20; student1=10101,“Li Lin”,M, “123 Beijing Road”; student2=student1; 對對,student2; scanf(“%d”,&student1.num); 對對scanf(“%d”,&student1); 錯錯 例9.2 輸入兩個學(xué)生的學(xué)號、姓名和成績,輸出成績較高學(xué)生的學(xué)號、姓名和成績解題思路:(1)定義兩個結(jié)構(gòu)相同的結(jié)構(gòu)體變量student1和student2;(2)分別輸

13、入兩個學(xué)生的學(xué)號、姓名和成績;(3)比較兩個學(xué)生的成績,如果學(xué)生1的成績高于學(xué)生2,就輸出學(xué)生1的全部信息,如果學(xué)生2的成績高于學(xué)生1,就輸出學(xué)生2的全部信息。如果二者相等,輸出2個學(xué)生的全部信息#include void main() struct student int num; char name20; float score; student1,student2; scanf(%d%s%f,&student1.num, , &student1.score); scanf(“%d%s%f”,&student2.num, student2.

14、name, &student2.score); 不能加不能加& 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, ,student2.score); else printf(%d %s %6.2fn,s

15、tudent1.num, , student1.score); printf(%d %s %6.2fn,student2.num, ,student2.score); 9.2 結(jié)構(gòu)體數(shù)組 例例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)包括候選人的姓名每個元

16、素中的信息應(yīng)包括候選人的姓名(字符型字符型)和得票數(shù)和得票數(shù)(整型整型)u輸入被選人的姓名,然后與數(shù)組元素中的輸入被選人的姓名,然后與數(shù)組元素中的“姓名姓名”成員比較,如果相同,就給這個成員比較,如果相同,就給這個元素中的元素中的“得票數(shù)得票數(shù)”成員的值加成員的值加1u輸出所有元素的信息輸出所有元素的信息#include #include struct person char name20; int count; leader3=“Li”,0,“Zhang”,0,“Sun”,0; 全局的結(jié)構(gòu)體數(shù)組全局的結(jié)構(gòu)體數(shù)組namecountleader0Li0Zhang0Sun0void main()

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

18、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);說明:(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; 說明:(2)對結(jié)構(gòu)體數(shù)組初始化的形式是在定義數(shù)組的后面加上:=初值表列; 如:

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

20、main() struct student stuN =10101,Zhang,78 , 10103,Wang,98.5, 10106,Li“,86, 10108,“Ling”, 73.5, 10110,“Sun”, 100 ; struct student temp; int i,j,k; 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

21、,,stui.score); printf(n);寫法上與普通變量一致寫法上與普通變量一致9.3 結(jié)構(gòu)體指針指向指向結(jié)構(gòu)體結(jié)構(gòu)體對象對象的指針變量既可以指向結(jié)的指針變量既可以指向結(jié)構(gòu)體變量,也可以用來指向結(jié)構(gòu)體數(shù)組中構(gòu)體變量,也可以用來指向結(jié)構(gòu)體數(shù)組中的元素。但是,指針變量的基類型必須與的元素。但是,指針變量的基類型必須與結(jié)構(gòu)體變量的類型相同。例如:結(jié)構(gòu)體變量的類型相同。例如: struct student *pt; 例例9.5 通過指向結(jié)構(gòu)體變量的指針變量通過指向結(jié)構(gòu)體變量的指針變量輸出結(jié)構(gòu)體變量中成員的信息。輸出結(jié)構(gòu)體變量中成員的信息。解題思路:在已有的基礎(chǔ)上,本題要解解

22、題思路:在已有的基礎(chǔ)上,本題要解決兩個問題:決兩個問題:u怎樣對結(jié)構(gòu)體變量成員賦值;怎樣對結(jié)構(gòu)體變量成員賦值;u怎樣通過指向結(jié)構(gòu)體變量的指針訪問結(jié)構(gòu)怎樣通過指向結(jié)構(gòu)體變量的指針訪問結(jié)構(gòu)體變量中成員。體變量中成員。#include #include void main() struct student long num; char name20; char sex; float score; ; struct student stu_1; struct student * p; p=&stu_1; stu_1.num=10101; strcpy(stu_1.name,“Li Lin”);

23、 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); stu_110101Li LinM89.5p 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.sc

24、ore=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); stu_110101Li LinM89.5p(*p).num(*p).name(*p).sex(*p).score說明:為了使用方便和直觀,允許把(*p).num用p-num來代替(*p).name等價于p-name如果p指向一個結(jié)構(gòu)體變量stu,以下等價: stu.成員名(如stu.num) (*p).成員名(如(*p).num)

25、p-成員名(如p-num) 例例9.6 有有3個學(xué)生的信息,放在結(jié)構(gòu)體數(shù)個學(xué)生的信息,放在結(jié)構(gòu)體數(shù)組中,要求輸出全部學(xué)生的信息。組中,要求輸出全部學(xué)生的信息。解題思路:用指向結(jié)構(gòu)體變量的指針處理解題思路:用指向結(jié)構(gòu)體變量的指針處理(1)聲明聲明struct student,并定義結(jié)構(gòu)體數(shù)組,并定義結(jié)構(gòu)體數(shù)組、初初始化始化(2)定義指向定義指向struct student類型指針類型指針p(3)使使p指向數(shù)組首元素,輸出元素中指向數(shù)組首元素,輸出元素中各各信息信息(4)使使p指向下一個元素,輸出元素中指向下一個元素,輸出元素中各各信息信息(5)再使再使p指向結(jié)構(gòu)體數(shù)組的下一個元素,輸出指向結(jié)構(gòu)體

26、數(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,M,19, 10104,Wang Min,F,20 ;void main() struct student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); 10101Li LinM1810102Z

27、hang FangM1910104Wang MinF20stu0stu1stu2void main() struct student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); 10101Li LinM1810102Zhang FangM1910104Wang MinF20pstu0stu1stu2void main() struct student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); 101

28、01Li LinM1810102Zhang FangM1910104Wang MinF20pstu0stu1stu2void main() struct student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); 10101Li LinM1810102Zhang FangM1910104Wang MinF20pstu0stu1stu29.4 用結(jié)構(gòu)體變量和結(jié)構(gòu)體變量的指針作函數(shù)參數(shù)將一個結(jié)構(gòu)體變量的值傳遞給另一個函將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù),有數(shù),有3個方法個方法。(1) 用結(jié)構(gòu)體變量的

29、成員作參數(shù)。 例如,用stu1.num或作函數(shù)實參,將實參值傳給形參。用法和用普通變量作實參是一樣的,屬于“值傳遞”方式。應(yīng)當(dāng)注意實參與形參的類型保持一致。(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)函數(shù)一般較少用這種方法(3)用指向結(jié)構(gòu)體變量(或數(shù)組元素)的指針作實參,將結(jié)構(gòu)體變量(或數(shù)組元素)的地址傳給形參。 例9.7 有N個結(jié)構(gòu)體變量stu,內(nèi)含學(xué)生學(xué)號

30、、姓名和3門課程的成績。要求輸出平均成績最高的學(xué)生的信息(包括學(xué)號、姓名、3門課程成績和平均成績)。解題思路:按照功能函數(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#include #define N 3struct student int num; char name20; float score3; float aver; ;4個成員個成員輸入前輸入前3個成員值個成員值計算最后成員值計算最后

31、成員值void 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); void input(struct student stu) int i; printf(請輸入各學(xué)生的信息: 學(xué)號、姓名、三門課成績:n); for(i=0;iN;i+) scanf(%d %s %f %f %f, &stui.num,stui.n

32、ame, &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; printf(請輸入各學(xué)生的信息: 學(xué)號、姓名、三門課成績:n); for(i=0;iN;i+) sc

33、anf(%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.3310103Wang 98.5 87 6984.83i=1void input(struct studen

34、t 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個成員值個成員值計算第計算第4個成員值個成員值stu0stu1stu2stu10101Li

35、78 89 9888.3310103Wang 98.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.3310103Wang 98.5 87 6984.8310106Sun 88 76.5 8984.5最大最大返回返回void print(struct student stud) printf(n成績最高的學(xué)生是:n);print

36、f(學(xué)號:%dn姓名:%sn 三門課成績:%5.1f,%5.1f,%5.1fn 平均成績:%6.2fn”, stud.num, ,stud.score0, stud.score1,stud.score2,stud.aver); stud10101Li78 89 9888.3310103Wang 98.5 87 6984.8310106Sun 88 76.5 8984.5num namescoreaverstu0stu1stu2以上3個函數(shù)的調(diào)用,情況各不相同:調(diào)用input函數(shù)時,實參是指針變量,形參是結(jié)構(gòu)體數(shù)組,傳遞的是結(jié)構(gòu)體元素的地址,函數(shù)無返回值。調(diào)用max函數(shù)時,實參

37、是指針變量,形參是結(jié)構(gòu)體數(shù)組,傳遞的是結(jié)構(gòu)體元素的地址,函數(shù)的返回值是結(jié)構(gòu)體類型數(shù)據(jù)。調(diào)用print函數(shù)時,實參是結(jié)構(gòu)體變量,形參是結(jié)構(gòu)體變量,傳遞的是結(jié)構(gòu)體變量中各成員的值,函數(shù)無返回值。9.5 用指針處理鏈表9.5.1 什么是線性鏈表9.5.2 建立簡單的靜態(tài)鏈表9.5.3 建立動態(tài)鏈表9.5.1 什么是線性鏈表鏈表是一種常見的重要的數(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é)點含有兩個

38、部分表尾表尾鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)它是動態(tài)地進行存儲分配的一種結(jié)構(gòu)鏈表必須利用指針變量才能實現(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;numscorenext9.5.2 建立簡單的靜態(tài)鏈表 例例9.8 建立一個如圖所示的簡單鏈表,建立一個如圖所示的簡單鏈表,它由它由3個學(xué)生數(shù)據(jù)的結(jié)點組成,要求輸個學(xué)生數(shù)據(jù)的結(jié)點組成,要求輸出各結(jié)點中的數(shù)據(jù)。出各結(jié)點中的數(shù)據(jù)。10101

39、89.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點numscorenext解題思路: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;void main() struct student a,b,c,*head,*p; a. num=10101; a.score=89.5; b.

40、 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); p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); 1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點numscorenext

41、headNULLp相當(dāng)于相當(dāng)于p=&b; p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); 1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點numscorenextheadNULLp相當(dāng)于相當(dāng)于p=&b; p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); 1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點numscorenextheadNU

42、LLp相當(dāng)于相當(dāng)于p=&c; p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); 1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點numscorenextheadNULLp相當(dāng)于相當(dāng)于p=&c; p=head; do printf(“%ld%5.1fn”,p-num,p-score); p=p-next; while(p!=NULL); 1010189.510103901010785a結(jié)點結(jié)點b結(jié)點結(jié)點c結(jié)點結(jié)點numscorenextheadNULLp相當(dāng)于

43、相當(dāng)于p=NULL;靜態(tài)鏈表靜態(tài)鏈表9.5.3 建立動態(tài)鏈表所謂建立動態(tài)鏈表是指在程序執(zhí)行過所謂建立動態(tài)鏈表是指在程序執(zhí)行過程中從無到有地建立起一個鏈表,即程中從無到有地建立起一個鏈表,即一個一個地開辟結(jié)點和輸入各結(jié)點數(shù)一個一個地開辟結(jié)點和輸入各結(jié)點數(shù)據(jù),并建立起前后相鏈的關(guān)系。據(jù),并建立起前后相鏈的關(guān)系。 例例9.9 建立一個有建立一個有2名學(xué)生學(xué)號和成績數(shù)據(jù)名學(xué)生學(xué)號和成績數(shù)據(jù)的單向動態(tài)鏈表。的單向動態(tài)鏈表。解題思路:解題思路:u定義結(jié)構(gòu)體變量,其成員包括學(xué)號、成績和定義結(jié)構(gòu)體變量,其成員包括學(xué)號、成績和指針變量。指針變量。u動態(tài)地開辟一個新單元動態(tài)地開辟一個新單元(動態(tài)開辟內(nèi)存單元動態(tài)開

44、辟內(nèi)存單元用用malloc函數(shù)函數(shù))。使指針變量。使指針變量p和和head指向此結(jié)指向此結(jié)點。點。u向此結(jié)點輸入數(shù)據(jù)。向此結(jié)點輸入數(shù)據(jù)。 例例9.9 建立一個有建立一個有2名學(xué)生學(xué)號和成績數(shù)據(jù)名學(xué)生學(xué)號和成績數(shù)據(jù)的單向動態(tài)鏈表。的單向動態(tài)鏈表。解題思路:解題思路:u再開辟第再開辟第2個新結(jié)點,并使指針變量個新結(jié)點,并使指針變量p指向此指向此結(jié)點。結(jié)點。u使第使第2個結(jié)點中的指針變量的值為個結(jié)點中的指針變量的值為NULL,即,即不指向任何對象,鏈表到此為止。不指向任何對象,鏈表到此為止。u輸出兩個結(jié)點中的數(shù)據(jù)。輸出兩個結(jié)點中的數(shù)據(jù)。#include #include #define LEN si

45、zeof(struct student) struct student int num; float score; struct student *next; ;struct student類型數(shù)據(jù)的長度類型數(shù)據(jù)的長度void main() struct student *head,*p; head=p=(struct student*) malloc(LEN); scanf(“%d,%f”,&p-num,&p-score); p=(struct student*) malloc(LEN); headp1010189.5void main() struct student *h

46、ead,*p; head=p=(struct student*) malloc(LEN); scanf(“%d,%f”,&p-num,&p-score); p=(struct student*) malloc(LEN); scanf(“%d,%f”,&p-num,&p-score); head-next=p; p=head; head1010189.5 p1010290p-next=NULL; NULLvoid main() struct student *head,*p; head=p=(struct student*) malloc(LEN); scanf(

47、“%d,%f”,&p-num,&p-score); p=(struct student*) malloc(LEN); scanf(“%d,%f”,&p-num,&p-score); head-next=p; p=head; head1010189.5 p1010290p-next=NULL; NULLvoid main() struct student *head,*p; head=p=(struct student*) malloc(LEN); scanf(“%d,%f”,&p-num,&p-score); p=(struct student*

48、) malloc(LEN); scanf(“%d,%f”,&p-num,&p-score); head-next=p; p-next=NULL; p=head; printf(“結(jié)點結(jié)點1:%d,%6.2fn”, p-num,p-score); p=p-next; 1010189.5 p1010290NULL結(jié)點結(jié)點1:10101, 89.50void main() struct student *head,*p; head=p=(struct student*) malloc(LEN); scanf(“%d,%f”,&p-num,&p-score); p=(s

49、truct student*) malloc(LEN); scanf(“%d,%f”,&p-num,&p-score); head-next=p; p-next=NULL; p=head; printf(“結(jié)點結(jié)點1:%d,%6.2fn”, p-num,p-score); p=p-next; printf(“結(jié)點結(jié)點2:%d,%6.2fn”, p-num,p-score); 1010189.5 p1010290NULL結(jié)點結(jié)點1:10101, 89.50結(jié)點結(jié)點2:10102, 90.00單鏈表的結(jié)構(gòu):單鏈表的結(jié)構(gòu):struct studentstruct student in

50、t num; int num; float score; float score; struct student struct student * *next;next;要點:要點:1 1、鏈表中的元素在內(nèi)存中存放順序是不連續(xù)的。、鏈表中的元素在內(nèi)存中存放順序是不連續(xù)的。 由由nextnext指針來連接各指針來連接各結(jié)結(jié)點。點。2 2、鏈表數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)、鏈表數(shù)據(jù)結(jié)構(gòu)的實現(xiàn), ,必須利用指針變量必須利用指針變量. .headheadnumnumscorescorenextnext numnumscorescorenextnext numnumscorescoreNULLNULL .結(jié)點結(jié)點建立

51、含建立含n n個節(jié)點的個節(jié)點的鏈表過程鏈表過程: :malloc()malloc()malloc()malloc()headheadnumnumscorescorenextnext numnumscorescorenextnext numnumscorescoreNULLNULL .struct student struct student * *creat( )creat( ) struct student struct student * *head,head,* *p1,p1,* *p2;p2; n=0;head=NULL; n=0;head=NULL; p1=p2=(struct st

52、udent p1=p2=(struct student * *)(malloc(sizeof(struct student);)(malloc(sizeof(struct student); scanf( scanf(“%ld,%f%ld,%f”,&p1-num,&p1-score);,&p1-num,&p1-score); while(p1-num!=0) while(p1-num!=0) n=n+1; n=n+1; if(n= =1) head=p1; if(n= =1) head=p1; else p2-next=p1; else p2-next=p1;

53、p2=p1; p2=p1; p1=(struct student p1=(struct student * *)(malloc(sizeof(struct student);)(malloc(sizeof(struct student); scanf( scanf(“%ld,%f%ld,%f”,&p1-num,&p1-score);,&p1-num,&p1-score); p2-next=NULL; p2-next=NULL; return(head); return(head); 在鏈表中插入結(jié)點的過程在鏈表中插入結(jié)點的過程. .malloc()malloc(

54、)malloc()malloc()headheadnumnumscorescorenextnext numnumscorescorenextnext numnumscorescoreNULLNULL numnumscorescorenextnext malloc()malloc()struct student *insert(struct student *head,struct student *stud) struct student *p0,*p1,*p2; p1=head; p0=stud; if (head=NULL) head=p0;p0-next=NULL; else while

55、 (p0-nump1-num) p2=p1; p1=p1-next; if (p0-numnum) if (head=p1) head=p0; else p2-next=p0; p0-next=p1; else p1-next=p0;p0-next=NULL; n=n+1; return(head);刪除鏈表結(jié)點的過程刪除鏈表結(jié)點的過程:malloc()malloc()headheadnumnumscorescorenextnext numnumscorescorenextnext numnumscorescorenextnext.struct student *del(struct stud

56、ent *head,long num) struct student *p1,*p2; if (head=NULL) printf(list is null!n); else p1=head; while (num!=p1-num&p1-next!=NULL) p2=p1;p1=p1-next; if(num=p1-num) if (p1=head) head=p1-next; else p2-next=p1-next; printf(delete:%ldn,num); n=n-1; else printf(%ld not been found!n,num); return(head)

57、; 9.6 提高部分9.6.1 共用體類型9.6.2 枚舉類型9.6.3 自定義類型9.6.1 共用體類型有時想用同一段內(nèi)存單元存放不同類有時想用同一段內(nèi)存單元存放不同類型的變量。型的變量。使幾個不同的變量共享同一段內(nèi)存的使幾個不同的變量共享同一段內(nèi)存的結(jié)構(gòu),稱為結(jié)構(gòu),稱為 “共用體共用體”類型的結(jié)構(gòu)。類型的結(jié)構(gòu)。1000100110021003字符字符ch整整 型型 變變 量量 i實實 型型 變變 量量 f定義共用體類型變量的一般形式為:union共用體名 成員表列變量表列; 例如:union data int i; char ch; float f; a,b,c; union data i

58、nt i; char ch; float f; ;union data a,b,c; “共用體”與“結(jié)構(gòu)體”的定義形式相似,但它們的含義是不同的。結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和,每個成員分別占有其自己的內(nèi)存單元。而共用體變量所占的內(nèi)存長度等于最長的成員的長度。只有先定義了共用體變量才能引用它,只有先定義了共用體變量才能引用它,但應(yīng)注意,不能引用共用體變量,而只但應(yīng)注意,不能引用共用體變量,而只能引用共用體變量中的成員。能引用共用體變量中的成員。例如,前面定義了例如,前面定義了a,b,c為共用體變量,為共用體變量,下面的引用方式是正確的:下面的引用方式是正確的: a.i a.ch

59、 a.f 例例:已知字符已知字符“0”的的ASCII碼為十六進制的碼為十六進制的30,下面程序的輸出為下面程序的輸出為:main()main() union union 運行結(jié)果:運行結(jié)果:9 9 unsigned char c; unsigned char c; unsigned int i4; z; unsigned int i4; z; z.i0=0 x39; z.i1=0 x36; z.i0=0 x39; z.i1=0 x36; printf( printf(“%cn%cn”,z.c);,z.c);0011011000000000i1? ?.i20011100100000000i0c的

60、地址的地址i0的低位地址的低位地址例例9_89_8:下列程序的運行結(jié)果是什么:下列程序的運行結(jié)果是什么? ? main() main() union zjunion zj int aint a; char chchar ch2 2; auau; au.aau.a298298; printf(printf(dndndn,au.chdn,au.ch0 0,au.ch,au.ch1 1) ); 運行結(jié)果為:運行結(jié)果為:42,142,19.6.2 枚舉類型如果一個變量只有幾種可能的值,則可如果一個變量只有幾種可能的值,則可以定義為枚舉類型以定義為枚舉類型所謂所謂“枚舉枚舉”就是指把可能的值一一列就是指把可能的值一一列舉出來,變量的值只限于列舉出來的值舉出來,變量的值只限于列舉出來的值的范圍內(nèi)的范圍內(nèi)聲明枚舉類型用聲明枚舉類型用enum開頭。開頭。例如:例如:enum Weekdaysun,mon,tue, wed,thu,fri,sat;u聲明了一個枚舉類型聲明了一個枚舉類型enum Weekdayu然后可以用此類型來定義變量然后可以用此類型來定義變量enum Weekday workday,week_end;枚舉枚舉元素元素枚舉枚

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論