




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第十章 結構與共用楊麗波 朱迅 湯承林 編著劉長榮 主審本章目標v理解為什么使用結構與共用v掌握結構和結構變量的定義方法v結構變量的賦值和引用、結構數組和指向結構變量的指針的用法v共用的概念和共用變量的引用v動態(tài)存儲分配的方法為什么要使用結構v例如:存儲一個班級中5名同學的信息:學號、姓名、性別、年齡。1.使用數組存儲?張三李四王五錢六趙四FMFMF01020304052323243221 “結構” 是一種構造數據類型,它是由若干數據類型的數據項組合而成的復雜數據對象,這些數據項稱為結構的成員。10.1 結構與結構變量10.1.1結構的定義結構的定義 在在C語言中,結構是一種由不同數據類型的變
2、量組成的集合。組成語言中,結構是一種由不同數據類型的變量組成的集合。組成結構的變量稱為結構元素或結構成員。結構的變量稱為結構元素或結構成員。 結構定義的一般形式為:結構定義的一般形式為: struct 結構名結構名 數據類型數據類型 成員名成員名1; 數據類型數據類型 成員名成員名2; 數據類型數據類型 成員名成員名n; ; 其中,其中,struct是關鍵字,每個結構都可以含有多個不同類型的成員,是關鍵字,每個結構都可以含有多個不同類型的成員,結構中的成員也稱結構中的元素,結構定義以分號結構中的成員也稱結構中的元素,結構定義以分號“;”結束。結束。定義結構struct studentint i
3、d;char name20;char sex;int age;結構成員結構名C 語言中的有效數據類型 結構定義放置在程序的開始部分,位于頭文件聲明之后 結構定義并不預留內存,結構定義僅描述了一個結構的形式。如果要在程序里使用結構,需要聲明結構變量。結構變量的定義struct student int num; char name20; char sex; int age; ;2.在定義結構類型的同時定義結構變量在定義結構類型的同時定義結構變量 1.先定義結構,再定義結構變量先定義結構,再定義結構變量 struct student stu1,stu2;stu1,stu2;3.直接定義結構變量直接定
4、義結構變量 結構變量的內存分配v聲明一個結構變量以后,將會為該變量分配內存,聲明一個結構變量以后,將會為該變量分配內存,大小是大于或等于其所有成員變量的大小之和。大小是大于或等于其所有成員變量的大小之和。圖圖10-1 結構變量的存儲形式結構變量的存儲形式 struct student int id; char name20; char sex; int age;嵌套結構的定義struct birthday int month; int day; int year;struct student int id; char name20; char sex; struct birthday birt
5、h;stu1,stu2; 在結構在結構student中定義的成員中定義的成員birth是結構是結構birthday類型的變量。類型的變量。 注意:在一個結構類型的定義中包含的另一種結構類型必須是已經注意:在一個結構類型的定義中包含的另一種結構類型必須是已經定義的。定義的。結構變量的引用與賦值一般有兩種方式引用結構變量成員:一般有兩種方式引用結構變量成員:1.使用成員運算符:結構變量名使用成員運算符:結構變量名.成員名成員名例如:例如:stu1.id stu2.sex對于嵌套結構成員,必須逐級找到最低級的成員。對于嵌套結構成員,必須逐級找到最低級的成員。例如:例如:stu1.birth.mont
6、h stu1.birth.year2.使用指針訪問結構變量的成員:結構指針變量名使用指針訪問結構變量的成員:結構指針變量名-成員名成員名例如:例如:struct student stu,*p; p=&stu; p-id=1;結構成員的賦值 可以使用輸入語句或賦值語句來給結構變量的各個成員賦值:可以使用輸入語句或賦值語句來給結構變量的各個成員賦值: 例如:例如: =“王五王五”; /使用賦值語句為成員賦值使用賦值語句為成員賦值 stu1.sex=M; 或者:或者: printf(“請輸入請輸入年齡年齡:n); scanf(“%f”,&stu1.age); /使用
7、輸入語句賦值使用輸入語句賦值 或者:或者: stu2 = stu1; /將將stu1的各成員的值分別賦給的各成員的值分別賦給stu2的各成員的各成員結構變量的引用與賦值#includevoid main()struct studentint id;char name9;int age;char sex;struct student stu1;printf(請輸入學號、姓名、年齡、性別請輸入學號、姓名、年齡、性別:n); scanf(%d%s%d,&stu1.id,,&stu1.age); getchar(); stu1.sex=getchar(); print
8、f(“學號學號:%d 姓名姓名:%s 年齡年齡:%d 性別性別:%cn,stu1.id,,stu1.age,stu1.sex);例例10.1 編寫程序,使用結構變量存儲一個學生的信息并輸出編寫程序,使用結構變量存儲一個學生的信息并輸出結構變量的引用與賦值【注意】【注意】(1)結構類型可以定義在主函數之外,也可以定義主函數之內。)結構類型可以定義在主函數之外,也可以定義主函數之內。(2)在)在scanf()語句中()語句中不能加不能加“&”,因為,因為name是字符數組,是字符數組,name本身表示數組的首地址。本身表示數組的首地址。(3)使用)使用s
9、canf()輸入字符串時,中間不能有空格??梢允褂幂斎胱址畷r,中間不能有空格。可以使用gets()輸入,要以回車符結束輸入。輸入,要以回車符結束輸入。(4)語句)語句getchar();表示接收輸入年齡的值后輸入的間隔符,語句表示接收輸入年齡的值后輸入的間隔符,語句stu1.sex=getchar();將輸入的性別的值賦給結構成員將輸入的性別的值賦給結構成員sex。結構變量的初始化結構變量與其他類型變量一樣,可以在定義的時候進行初始化。結構變量與其他類型變量一樣,可以在定義的時候進行初始化。例如:例如: struct student int id; char name20;
10、 int age; char sex;注意:注意: 1.初始化數據的順序要與定義結構類型時成員的順序一致。初始化數據的順序要與定義結構類型時成員的順序一致。 2.初始化數據的數量可以比定義結構類型時成員的數量少。初始化數據的數量可以比定義結構類型時成員的數量少。結構變量的初始化#includestruct student int id; char name9; int age; char sex; int score3;stu1=2,李明李明,22,m,92,85,88;void main() printf(學號:學號:%d 姓名:姓名:%s 年齡:年齡:%d 性別:性別:%c ,stu1.i
11、d, ,stu1.age,stu1.sex); printf(成績是:成績是:); for(int i=0;i3;i+) printf(%d ,stu1.scorei); printf(n); 【例【例10-210-2】初始化結構變量后輸出每個成員的值?!砍跏蓟Y構變量后輸出每個成員的值。結構變量的初始化程序的運行結果如圖程序的運行結果如圖10-3所示:所示: 圖圖10-3 例例10-2運行結果運行結果10.2 結構數組1.結構數組的定義結構數組的定義例如:例如: struct student int id; char name20; /定義含義三個元素的結構數組,分別定義含
12、義三個元素的結構數組,分別 char sex; /是是stud1、stud2、stud3 int age; stud3; q 數組中的元素都是同一種結構類型的變量,稱為結構數組。數組中的元素都是同一種結構類型的變量,稱為結構數組。q 在許多實際應用中,經常使用結構數組來表示具有相同數據結構和特在許多實際應用中,經常使用結構數組來表示具有相同數據結構和特征的一個群體,例如一個班級學生的信息、一個部門成員的檔案等等。征的一個群體,例如一個班級學生的信息、一個部門成員的檔案等等。10.2 結構數組2.結構數組的初始化結構數組的初始化例如:例如: struct student int id; char
13、 name20; char sex; int age; stud3=1,”張三張三”,m,21,2,”李四李四”,m,20,3,”王五王五”,f,22; /定義含有三個元素的結構數組,并且逐一進行初始化。定義含有三個元素的結構數組,并且逐一進行初始化。注意:在為全部元素進行初始化時,可以省略數組長度。注意:在為全部元素進行初始化時,可以省略數組長度。結構數組的應用【例【例10-3】編寫程序,使用結構數組存儲學生信息,輸入三門課程的成績,輸出】編寫程序,使用結構數組存儲學生信息,輸入三門課程的成績,輸出每門課程的平均分,并按個人總分輸出最高分和最低分。每門課程的平均分,并按個人總分輸出最高分和最
14、低分。 #include struct studentint id;char name20;char sex;int age;float score3;float sum;void main()struct student stu3=1,張三張三,m,21,2,李四李四,m,20,3,王五王五,f,22;int i,j;float m,n;float aver3=0,0,0;printf(請輸入學生三門課程的成績請輸入學生三門課程的成績:n);printf(課程課程1 課程課程2 課程課程3n);for(i=0;i3;i+)for(j=0;j3;j+)scanf(%f,&stui.sc
15、orej);for(stui.sum=0,j=0;j3;j+)stui.sum+=stui.scorej;for(j=0;j3;j+)averj=averj+stui.scorej; int min,max,mink,maxk;min=max=stu0.sum;for(int k=0;kmax)max=stuk.sum;maxk=k;if(stuk.summin)min=stuk.sum; mink=k;printf(學號學號 姓名姓名 性別性別 年齡年齡 課程課程1 課程課程2 課程課程3 總分總分n);for(i=0;i3;i+) printf(%3d %6s %3c %5d ,stui.
16、id,, stui.sex,stui.age);for(j=0;j3;j+) printf(%8.1f,stui.scorej);printf(%8.1f,stui.sum);printf(n);printf(總分最高者是:總分最高者是:%d號號 %5s %8.1fn,stumaxk.id, ,stumaxk.sum); printf(總分最低者是:總分最低者是:%d號號 %5s %8.1fn,stumink.id, ,stumink.sum);printf(每門課程成績平均分每門課程成績平均分:n);printf(成績成績1
17、成績成績2 成績成績3:n);for(j=0;j成員名成員名例如:例如: (*p)id (*p)name或者或者 p-id p-name指向結構變量的指針【例【例10-4】使用結構指針變量訪問結構】使用結構指針變量訪問結構#includestruct student int id; char name20; char sex; int age; float score3;void main() struct student stu=1,王五王五,m,21,*p; p=&stu; printf(請輸入該同學的成績:請輸入該同學的成績:);指向結構變量的指針 for(int i=0;iid
18、,p-name,p-sex,p-age); for(int j=0;jscorej); printf(n);指向結構變量的指針程序的運行結果如圖程序的運行結果如圖10-5所示:所示: 圖圖10-5 例例10-4運行結果運行結果指向結構數組的指針 可以使用指針變量指向一個結構數組,這時,指針變量的值就是該結可以使用指針變量指向一個結構數組,這時,指針變量的值就是該結構數組的首地址,即數組的構數組的首地址,即數組的0號元素地址,可通過指針的移動,指向結構數號元素地址,可通過指針的移動,指向結構數組中的其它元素。組中的其它元素。 例如,結構指針例如,結構指針p指向一個結構數組,則指向一個結構數組,則
19、p的值就是該數組的的值就是該數組的0號元素的號元素的地址,地址,p+1就是就是1號元素的地址,號元素的地址,p+i就是就是i號元素的地址,這與指向普通數號元素的地址,這與指向普通數組的指針是一樣的。組的指針是一樣的。 結構指針變量還可以指向數組元素,這時,該指針變量的值就是所指結構指針變量還可以指向數組元素,這時,該指針變量的值就是所指向的數組元素的首地址。向的數組元素的首地址。指向結構數組的指針【例【例10-5】使用指向結構數組的指針變量訪問數組元素?!渴褂弥赶蚪Y構數組的指針變量訪問數組元素。#include struct student int id; char name20; char
20、sex; int age; float score3; float sum;void main() struct student stu3=1,張三張三,m,21,2,李四李四, m,20,3,王五王五,f,22,*p; int j; printf(請輸入學生的成績請輸入學生的成績:n學號學號 成績成績1 成績成績2 成績成績3n);for(p=stu;pid);for(j=0;jscorej);for(p-sum=0,j=0;jsum+=p-scorej;printf(輸出成績單如下輸出成績單如下:n);printf(學號學號 姓名姓名 性別性別 年齡年齡 成績成績1 成績成績2 成績成績3
21、 總分總分n);for(p=stu;pid,p-name,p-sex,p-age);for(j=0;jscorej);printf(%9.1f,p-sum);printf(n);指向結構數組的指針程序的運行結果如圖程序的運行結果如圖10-6所示:所示: 圖圖10-6 例例10-5運行結果運行結果指向結構變量的指針作函數參數 在在C語言中,可以使用結構變量作函數參數進行整體傳送,但是這種語言中,可以使用結構變量作函數參數進行整體傳送,但是這種傳送要將全部成員逐個傳送,時間和空間開銷很大,嚴重地降低了程序的傳送要將全部成員逐個傳送,時間和空間開銷很大,嚴重地降低了程序的執(zhí)行效率。執(zhí)行效率。 使用指
22、針變量作函數參數進行傳送可以解決這個問題。這時由實參傳使用指針變量作函數參數進行傳送可以解決這個問題。這時由實參傳向形參的只是地址,從而減少了時間和空間的開銷。向形參的只是地址,從而減少了時間和空間的開銷。指向結構變量的指針作函數參數【例【例10-6】使用指向結構變量的指針作為函數參數?!渴褂弥赶蚪Y構變量的指針作為函數參數。#include struct student /定義結構定義結構int id;char *name;char sex;int age;int score;void func(struct student *ps)int i;printf(該學生的信息如下該學生的信息如下:
23、n); /輸出結構變量各成員的信息輸出結構變量各成員的信息printf(學號學號:%d 姓名姓名:%s 性別性別:%c 年齡年齡:%d 成績:成績:%d,ps-id,ps-name,ps-sex,ps-age,ps-score);指向結構變量的指針作函數參數printf(n);void main() /初始化結構變量,定義一個結構指針變量初始化結構變量,定義一個結構指針變量struct student stu=3,張三張三,m,23,90,*p;p=&stu; func(p); /指向結構變量指向結構變量程序的運行結果如圖程序的運行結果如圖10-7所示:所示: 圖圖10-7 例例10-
24、6運行結果運行結果指向結構數組的指針作函數參數 【例【例10-7】編寫程序,使用結構指針作為函數參數,計算并輸出一組學生】編寫程序,使用結構指針作為函數參數,計算并輸出一組學生成績的總分、平均分和不及格人數。成績的總分、平均分和不及格人數。#include struct student int num; char *name; char sex; int score;stu5=11,李穎李穎,M,55, 12,何平何平,M,75, 13,張芳張芳,F,92, 14,陳龍陳龍,F,85, 15,王瑩王瑩,M,48;void main() struct student *ps;指向結構數組的指針作
25、函數參數void ave(struct student *ps); ps=stu; ave(ps);void ave(struct student *ps) int c=0,i,ave,s=0; for(i=0;iscore; if(ps-score60) c+=1; printf(總分:總分:%d ,s); ave=s/5; printf(平均分:平均分:%d 不及格人數:不及格人數:%dn,ave,c);指向結構數組的指針作函數參數程序的運行結果如圖程序的運行結果如圖10-8所示:所示: 圖圖10-8 例例10-7運行結果運行結果10.4 動態(tài)內存分配 C語言提供了內存管理函數,可以按需要
26、動態(tài)地分配內存空間,也可語言提供了內存管理函數,可以按需要動態(tài)地分配內存空間,也可以把不再使用的空間釋放待用,從而更加有效的利用了內存空間。常用的以把不再使用的空間釋放待用,從而更加有效的利用了內存空間。常用的內存管理函數有如下三個:內存管理函數有如下三個:1.分配內存空間函數分配內存空間函數malloc() 調用調用malloc()函數的一般形式為:函數的一般形式為: (類型說明符(類型說明符 *)malloc(size)例如:例如: char *p; p=(char *)malloc(12);10.4 動態(tài)內存分配 2.分配內存空間函數分配內存空間函數calloc() calloc()函數
27、也用于動態(tài)的分配內存空間。調用該函數的一般形式為:函數也用于動態(tài)的分配內存空間。調用該函數的一般形式為: (類型說明符(類型說明符 *)calloc(n,size) 例如:例如: struct student *p; p=(struct student *)calloc(5,sizeof(struct student);10.4 動態(tài)內存分配【例例10-8】使用使用calloc()函數動態(tài)分配內存空間。函數動態(tài)分配內存空間。#include#includevoid main()struct studentint id;char name20;struct student *p; p=(stru
28、ct student *)calloc(5,sizeof(struct student);printf(該連續(xù)區(qū)域的地址分別是:該連續(xù)區(qū)域的地址分別是:n);for(int i=0;i5;i+)printf(%pn,p+i);10.4 動態(tài)內存分配程序的運行結果如圖程序的運行結果如圖10-9所示:所示:圖10-9 例10-8運行結果 3.釋放內存空間函數釋放內存空間函數free() free()函數釋放由函數釋放由malloc()函數和函數和calloc()函數分配的內存空間。函數分配的內存空間。調用該函數的一般形式為:調用該函數的一般形式為: free(void *p);10.4 動態(tài)內存分
29、配【例例10-9】動態(tài)分配一塊區(qū)域存儲結構變量實現(xiàn)對結構變量成員的訪問。動態(tài)分配一塊區(qū)域存儲結構變量實現(xiàn)對結構變量成員的訪問。#include#includevoid main() struct student int id; char *name; char sex; float score3; *ps; ps=(struct student*)malloc(sizeof(struct student); ps-id=20; ps-name=Zhang Jing; ps-sex=M;printf(請輸入三門課程的成績:請輸入三門課程的成績:);10.4 動態(tài)內存分配 for(int i=0;
30、iscorei); printf(學號:學號:%d 姓名:姓名:%s 性別:性別:%cn成績:成績:,ps-id,ps-name,ps-sex); for(int j=0;jscorej);printf(n); free(ps);程序的運行結果如圖程序的運行結果如圖10-1010-10所示:所示:圖圖10-10 例例10-9運行結果運行結果 10.5 結構與鏈表 在上一節(jié)中介紹了使用在上一節(jié)中介紹了使用malloc()函數可以為變量動態(tài)分配一塊內存空函數可以為變量動態(tài)分配一塊內存空間,這塊空間可以存放一個變量的數據,在計算機專業(yè)詞匯中,將這樣的間,這塊空間可以存放一個變量的數據,在計算機專業(yè)詞
31、匯中,將這樣的一塊單元稱為一個一塊單元稱為一個“結點結點”。要存放多少個變量的數據,就需要建立多少。要存放多少個變量的數據,就需要建立多少個個結點。結點。 鏈表是一種常見的、重要的數據結構,它是通過動態(tài)分配存儲空間而建鏈表是一種常見的、重要的數據結構,它是通過動態(tài)分配存儲空間而建立的一種結構,是利用指針將多個結點鏈在一起的線性結構。在鏈表中,立的一種結構,是利用指針將多個結點鏈在一起的線性結構。在鏈表中,添加、刪除一個結點非常方便,只需要在每個結點中存放下一個結點的地添加、刪除一個結點非常方便,只需要在每個結點中存放下一個結點的地址(指針),用以把所有結點址(指針),用以把所有結點“鏈鏈”成一
32、串。成一串。 10.5 結構與鏈表 可以從第一個結點開始,依次找到下一個結點的地址,直到最后一個可以從第一個結點開始,依次找到下一個結點的地址,直到最后一個結點,而不能夠反向查找的鏈表,稱為單向鏈表。單向鏈表的示意圖如圖結點,而不能夠反向查找的鏈表,稱為單向鏈表。單向鏈表的示意圖如圖10-11所示:所示: 圖圖10-11(b)單向鏈表結構示意圖)單向鏈表結構示意圖 圖圖10-11(a)單向鏈表結點的結構)單向鏈表結點的結構10.5 結構與鏈表例如,一個存放學生信息的結點具有如下形式:例如,一個存放學生信息的結點具有如下形式:struct student int id; char name20;
33、 char sex; struct student *next;其中前面其中前面3個成員組成數據域,最后一個成員個成員組成數據域,最后一個成員next構成指針域,它是指向構成指針域,它是指向student結構類型變量的指針。結構類型變量的指針。鏈表操作 鏈表的基本操作包括建立鏈表、對鏈表的訪問和遍歷以及向鏈表中插鏈表的基本操作包括建立鏈表、對鏈表的訪問和遍歷以及向鏈表中插入或刪除一個結點。入或刪除一個結點。 由于鏈表的結點所占的內存是動態(tài)的,在程序運行過程中,需要添加由于鏈表的結點所占的內存是動態(tài)的,在程序運行過程中,需要添加一個結點的時候就動態(tài)申請一個結點的內存空間,不需要使用這個結點時一個
34、結點的時候就動態(tài)申請一個結點的內存空間,不需要使用這個結點時就釋放它所占用的內存空間。就釋放它所占用的內存空間。例如:例如: struct student *p=malloc(sizeof(struct student); p-id=20; p-name=”Wang wu”; ps-sex=M; p-score=90; free(p);就是申請一個結點,為結點的成員賦值和釋放該結點的過程。就是申請一個結點,為結點的成員賦值和釋放該結點的過程。鏈表操作【例【例10-10】建立鏈表,存放一個小組中三名學生的信息,包括學號、姓】建立鏈表,存放一個小組中三名學生的信息,包括學號、姓名、性別和一門課程的
35、成績。名、性別和一門課程的成績。#include#includestruct studentint id;char name20;char sex;float score;struct student *next;*p;struct student *createlinkedlist(int n)struct student *head,*p,*q;printf(請輸入學號、姓名、性別、成績:請輸入學號、姓名、性別、成績:n);for(int i=0;iid,p-name);getchar();p-sex=getchar();scanf(%f,&p-score)if(i=0) /i=0
36、時,該結點地址作為頭指針時,該結點地址作為頭指針head=p; q=p; elseq-next=p; /i!=0時,將該結點的地址賦給上一個結點指針域時,將該結點的地址賦給上一個結點指針域 q=p;q-next=NULL; /設置最后一個結點的指針域為設置最后一個結點的指針域為NULLreturn head;void main()int n;printf(請輸入學生人數請輸入學生人數n:);scanf(%d,&n);p=createlinkedlist(n);鏈表操作printf(您輸入的信息是:您輸入的信息是:n);for(int i=0;iid,p-name,p-sex,p-sco
37、re);p=p-next;程序的運行結果如圖10-13所示:圖圖10-12 例例10-10運行結果運行結果 鏈表操作【例【例10-11】編寫函數,在鏈表中查找成績?yōu)椤烤帉懞瘮担阪湵碇胁檎页煽優(yōu)?0分的同學,并輸出該同學的信息。分的同學,并輸出該同學的信息。void find(struct student *head) struct student *p; for(p=head;p!=NULL;p=p-next) if(p-score=90) printf(您查找的學生是:您查找的學生是:); printf(%d %s %c %fn,p-id,p-name,p-sex,p-score); /省
38、略例省略例10-10中定義結構中定義結構student和定義函數和定義函數createlinkedlist(n)等代碼等代碼 void main() struct student *px; px=p=createlinkedlist(n); find(px);鏈表操作程序的運行結果如圖程序的運行結果如圖10-13所示:所示:圖圖10-13 例例10-11運行結果運行結果 鏈表操作【例【例10-12】編寫函數,刪除鏈表中指定的結點。】編寫函數,刪除鏈表中指定的結點。 /省略例省略例10-10中定義結構中定義結構student和定義函數和定義函數createlinkedlist(n)等代碼等代碼v
39、oid deletejd(struct student *head,int xid)struct student *p,*q;q=head;if(q-id=xid) /判斷要被刪除結點是否是頭指針指向的結點判斷要被刪除結點是否是頭指針指向的結點head=q-next;elsefor(p=q,q=q-next;q!=NULL;p=p-next,q=q-next)if(q-id=xid) break;if(q!=NULL) /如果如果q!=NULL說明已經找到要刪除的結點說明已經找到要刪除的結點p-next=q-next; /刪除刪除q結點結點free(q); /釋放釋放q結點所占的內存結點所占的
40、內存else /如果如果q=NULL說明沒有找到要刪除的結點說明沒有找到要刪除的結點printf(沒有找到要刪除的結點!沒有找到要刪除的結點!n);void main()int n;struct student *px,*qs;printf(請輸入學生人數請輸入學生人數n:);scanf(%d,&n);qs=px=p=createlinkedlist(n);printf(您輸入的信息是:您輸入的信息是:n);for(int i=0;iid,p-name,p-sex,p-score); p=p-next;int x;printf(請輸入要刪除的學號:請輸入要刪除的學號:);scanf(%
41、d,&x); deletejd(px,x);for(int j=0;jid,qs-name,qs-sex,qs-score); qs=qs-next;鏈表操作程序的運行結果如圖10-14所示:圖圖10-14 例例10-12運行結果運行結果 鏈表操作【例【例10-13】編寫函數,在按學號由小到大排列的鏈表中插入一個結點?!烤帉懞瘮担诎磳W號由小到大排列的鏈表中插入一個結點。 【解題思路】【解題思路】 在鏈表中插入一個結點,要求鏈表本身必須是按某種規(guī)律排好序的。本例中,在鏈表中插入一個結點,要求鏈表本身必須是按某種規(guī)律排好序的。本例中,鏈表中的結點是按照學號由小到大排序的,則插入可分以下四
42、種情況考慮:鏈表中的結點是按照學號由小到大排序的,則插入可分以下四種情況考慮:(1)原表為空表。只需要將)原表為空表。只需要將head指向被插入的結點即可,被插入的結點的指針指向被插入的結點即可,被插入的結點的指針域置為域置為NULL。(2)被插入的結點數據最小,應插入到頭指針之后。這種情況下,使)被插入的結點數據最小,應插入到頭指針之后。這種情況下,使head指向指向被插入結點,被插入結點的指針域指向原來頭指針之后的那個結點。被插入結點,被插入結點的指針域指向原來頭指針之后的那個結點。(3)被插入的結點數據最大,應插入到表尾。這種情況下,使原來最后一個結)被插入的結點數據最大,應插入到表尾。
43、這種情況下,使原來最后一個結點的指針域指向被插入結點,被插入結點的指針域置為點的指針域指向被插入結點,被插入結點的指針域置為NULL。(4)在中間某位置插入。這種情況下,使插入位置的前一個結點的指針域指向)在中間某位置插入。這種情況下,使插入位置的前一個結點的指針域指向被插入結點,使被插入結點的指針域指向插入位置的后一個結點。被插入結點,使被插入結點的指針域指向插入位置的后一個結點。 /省略例省略例10-10中定義結構中定義結構student和定義函數和定義函數createlinkedlist(n)等代碼等代碼void insertjd(struct student *head,int xid
44、) struct student *p,*q,*pf; p=head; q=(struct student*)malloc(sizeof(struct student); /根據給定的學號創(chuàng)建新結點根據給定的學號創(chuàng)建新結點 q-id=xid; printf(“請輸入姓名、性別、成績:請輸入姓名、性別、成績:n”); scanf(%s,q-name);getchar();q-sex=getchar();scanf(%f,&q-score); if(head=NULL) /如果是空表,將插入結點的地址賦給頭指針如果是空表,將插入結點的地址賦給頭指針 head=q; q-next=NULL;
45、 else while(q-idp-id) & (p-next!=NULL) /p從從head開始,依次向后移動,尋找第一個開始,依次向后移動,尋找第一個idxid的結點的結點 pf=p; /pf一直指向一直指向p的前一個結點的前一個結點 p=p-next; if(q-idid) if(head=p) /在頭指針之后位置插入在頭指針之后位置插入 head=q; q-next=p; else /在中間某位置插入在中間某位置插入 pf-next=q; q-next=p; else /在表尾插入在表尾插入 p-next=q; q-next=NULL; void main() int n; s
46、truct student *px,*qs; printf(請輸入學生人數請輸入學生人數n:); scanf(%d,&n); qs=px=p=createlinkedlist(n); printf(您輸入的信息是:您輸入的信息是:n); for(int i=0;iid,p-name,p-sex,p-score);p=p-next;鏈表操作 int x;printf(請輸入要插入的學號:請輸入要插入的學號:);scanf(%d,&x); insertjd(px,x); for(int j=0;jid,qs-name,qs-sex,qs-score); qs=qs-next;鏈表操
47、作程序的運行結果如圖10-15所示: 圖圖10-15 例例10-13運行結果運行結果 10.6 共用1. 共用的概念共用的概念 與結構相似,共用是一種由不同數據類型構造出的類型,在共用內,與結構相似,共用是一種由不同數據類型構造出的類型,在共用內,可以定義多種不同數據類型的成員,不同的是,共用類型的變量的所有成可以定義多種不同數據類型的成員,不同的是,共用類型的變量的所有成員共用一塊內存空間。雖然共用變量的每個成員都可以賦值,但前面賦予員共用一塊內存空間。雖然共用變量的每個成員都可以賦值,但前面賦予的成員值被后面賦予的成員值所覆蓋,只有最后一次賦予的成員值能夠保的成員值被后面賦予的成員值所覆蓋
48、,只有最后一次賦予的成員值能夠保存且有意義。存且有意義。 共用類型定義的一般形式為:共用類型定義的一般形式為: union 共用類型名共用類型名 成員序列;成員序列; 變量序列;變量序列;共用例如:例如: union data1 int i; double d; char c; m; 定義包括定義包括3個成員的共用,分別是個成員的共用,分別是int型的型的i、double型的型的d和和char型的型的c。定義。定義m為該共用類型的變量。為該共用類型的變量。 既然共用變量的所有成員共同占用一塊內存空間,這塊空間的大小應該能夠存放所有成員中占用空間長度最大者。 共用 下面定義含有相同成員的共用和結
49、構,比較它們之間的區(qū)別:下面定義含有相同成員的共用和結構,比較它們之間的區(qū)別: struct data2 int i; double d; char c;n; union data1 int i; double d; char c; m;圖圖10-16 共用和結構的區(qū)別共用和結構的區(qū)別 共用【例【例10-14】輸出共用變量和結構變量空間占用的大小?!枯敵龉灿米兞亢徒Y構變量空間占用的大小。#includeunion data1 int i; double d; char c;m;struct data2 int i; double d; char c;n;void main() printf(各
50、種類型變量所占字節(jié)數:各種類型變量所占字節(jié)數:n); printf(共用變量:共用變量:%d ,sizeof(m);共用 printf(結構變量:結構變量:%dn,sizeof(n); printf(成員類型所占字節(jié)數:成員類型所占字節(jié)數: n); printf(int:%d ,sizeof(int); printf(double:%d ,sizeof(double); printf(char:%dn,sizeof(char);圖圖10-17 例例10-14運行結果運行結果 程序的運行結果如圖10-17所示: 共用變量的引用 2.共用變量的引用共用變量的引用 對共用變量的賦值和使用都是對變量的成員進行的,其一般形式為:對共用變量的賦值和使用都是對變量的成員進行的,其一般形式為: 共用變量名共用變量名.成員名成員名使用共用類型數據時應注意以下幾點:使用共用類型數據時應注意以下幾點:(1)同一段空間內可以存放不
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB32/T 3842-2020土工袋護坡技術規(guī)范
- DB32/T 3761.63-2022新型冠狀病毒肺炎疫情防控技術規(guī)范第63部分:信息報送
- DB32/T 3761.33-2021新型冠狀病毒肺炎疫情防控技術規(guī)范第33部分:港口口岸
- DB32/T 3661-2019冷鮮鴨肉生制品加工技術規(guī)程
- DB32/T 3494-2019灌漿復合瀝青路面施工技術規(guī)范
- DB32/T 1321.1-2019危險化學品重大危險源安全監(jiān)測預警系統(tǒng)建設規(guī)范第1部分:通則
- 【正版授權】 ISO 20816-21:2025 EN Mechanical vibration - Measurement and evaluation of machine vibration - Part 21: Horizontal axis wind turbines
- DB31/T 751-2013大型游樂場所防雷技術規(guī)范
- DB31/T 1390-2022動物診療機構犬只狂犬病免疫點建設規(guī)范
- 全面股權讓渡與債權債務界定及權益保護執(zhí)行合同
- 人教版小學四年級下冊《生命.生態(tài).安全》教案
- 倉庫安全 清潔點檢記錄表
- 2023中考數學練習 08 圓與幾何綜合問題(學生版+解析版)
- 讀后續(xù)寫:三大出彩收尾設計(解析版)2023年新高考英語讀后續(xù)寫練習
- 合伙人協(xié)議書的財務透明
- 《建筑基坑工程監(jiān)測技術標準》(50497-2019)
- 產品合格證出廠合格證A4打印模板
- 100kg級復合翼垂直起降無人機系統(tǒng)總體技術方案報告20170428(公開)
- 噴淋塔設計標準參考
- 國家課程設置標準課時
- 浙教版初中科學所有實驗目錄及所需器材九上
評論
0/150
提交評論