版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
結(jié)構(gòu)體和共用體結(jié)構(gòu)體和共用體
8.1結(jié)構(gòu)體
8.2動(dòng)態(tài)內(nèi)存分配與鏈表
8.3共用體類型
8.4枚舉類型
8.5用戶自定義類型
8.6程序舉例第8章結(jié)構(gòu)體和共用體第88.1結(jié)構(gòu)體第8章結(jié)構(gòu)體和共用體第結(jié)構(gòu)體和共用體課件結(jié)構(gòu)體和共用體課件8.1
結(jié)構(gòu)體定義一個(gè)結(jié)構(gòu)體類型的一般形式為:struct結(jié)構(gòu)體名{
結(jié)構(gòu)成員的說明;};成員表由若干個(gè)成員組成,每個(gè)成員都是該結(jié)構(gòu)體的一個(gè)組成部分。對每個(gè)成員也必須作類型說明,其形式為:類型說明符成員名;成員名的命名應(yīng)符合標(biāo)識符的書寫規(guī)定。例如:structstu{intnum;charname[20];charsex;floatscore;};8.1結(jié)構(gòu)體定義一個(gè)結(jié)構(gòu)體類型的一般形式為8.1
結(jié)構(gòu)體在這個(gè)結(jié)構(gòu)體定義中,結(jié)構(gòu)體名為stu,該結(jié)構(gòu)體由4個(gè)成員組成。第一個(gè)成員為num,整型變量;第二個(gè)成員為name,字符數(shù)組變量;第三個(gè)成員為sex,字符變量;第四個(gè)成員為score,實(shí)型變量。應(yīng)注意在括號“}”后的分號是不可少的。結(jié)構(gòu)體定義之后,即可進(jìn)行變量說明。凡說明為結(jié)構(gòu)體stu的變量都由上述4個(gè)成員組成。由此可見,結(jié)構(gòu)是一種復(fù)雜的數(shù)據(jù)類型,是數(shù)目固定,類型不同的若干有序變量的集合。8.1結(jié)構(gòu)體在這個(gè)結(jié)構(gòu)體定義中,結(jié)構(gòu)體名為8.1
結(jié)構(gòu)體8.1.2結(jié)構(gòu)體類型變量的說明說明結(jié)構(gòu)體變量有以下三種方法。以上面定義的stu為例來加以說明。(1)先定義結(jié)構(gòu)體類型,再說明結(jié)構(gòu)體變量例如:structstu{intnum;charname[20];charsex;floatscore;};structstuboy1,boy2;說明了兩個(gè)變量boy1和boy2為stu結(jié)構(gòu)類型。也可以用宏定義使用一個(gè)符號常量來表示一個(gè)結(jié)構(gòu)類型,例如:#defineSTUstructstuSTU{intnum;charname[20];charsex;floatscore;};STUboy1,boy2;8.1結(jié)構(gòu)體8.1.2結(jié)構(gòu)體類型變量的說明8.1
結(jié)構(gòu)體(2)在定義結(jié)構(gòu)體類型的同時(shí)說明結(jié)構(gòu)體變量例如:structstu{intnum;charname[20];charsex;floatscore;}boy1,boy2;(3)直接說明結(jié)構(gòu)體變量例如:struct{intnum;charname[20];charsex;floatscore;}boy1,boy2;8.1結(jié)構(gòu)體(2)在定義結(jié)構(gòu)體類型的同時(shí)說明結(jié)構(gòu)體變量8.1
結(jié)構(gòu)體第三種方法與第二種方法的區(qū)別在于第三種方法中省去了結(jié)構(gòu)體名,而直接給出結(jié)構(gòu)體變量。三種方法中說明的boy1,boy2變量都具有相同的結(jié)構(gòu)。說明了boy1,boy2變量為stu類型后,即可向這兩個(gè)變量中的各個(gè)成員賦值。在上述stu結(jié)構(gòu)體定義中,所有的成員都是基本數(shù)據(jù)類型或數(shù)組類型。成員也可以又是一個(gè)結(jié)構(gòu)體類型,即構(gòu)成了嵌套的結(jié)構(gòu)體。8.1結(jié)構(gòu)體第三種方法與第二種方法的區(qū)別在8.1
結(jié)構(gòu)體例如:structdate{intmonth;intday;intyear;};struct{intnum;charname[20];charsex;structdatebirthday;floatscore;}boy1,boy2;首先定義一個(gè)結(jié)構(gòu)體date,由month(月)、day(日)、year(年)三個(gè)成員組成。在定義并說明變量boy1和boy2時(shí),其中的成員birthday被說明為data結(jié)構(gòu)體類型。成員名可與程序中其它變量同名,互不干擾。結(jié)構(gòu)體變量成員的表示方法,在程序中使用結(jié)構(gòu)體變量時(shí),往往不把它作為一個(gè)整體來使用。說明:結(jié)構(gòu)體在內(nèi)存中存儲容量是各成員容量之和,這是與后面聯(lián)合體的重要區(qū)別。8.1結(jié)構(gòu)體例如:首先定義一個(gè)結(jié)構(gòu)體dat8.1
結(jié)構(gòu)體8.1.3結(jié)構(gòu)體變量的引用一般情況下,不能對一個(gè)結(jié)構(gòu)體變量作為整體引用,只能引用其中的成員。結(jié)構(gòu)體變量中成員引用的一般形式為:結(jié)構(gòu)體變量名.成員名其中,“.”是域成員運(yùn)算符,是C語言中優(yōu)先級最高的運(yùn)算符之一。例如:boy1.num即第一個(gè)人的學(xué)號,boy2.sex即第二個(gè)人的性別。如果成員本身又是一個(gè)結(jié)構(gòu)體,則必須逐級找到最低級的成員才能使用。例如:boy1.birthday.month即第一個(gè)人出生的月份。成員可以在程序中單獨(dú)使用,與普通變量完全相同。8.1結(jié)構(gòu)體8.1.3結(jié)構(gòu)體變量的引用8.1
結(jié)構(gòu)體8.1.4結(jié)構(gòu)體變量的賦值對于結(jié)構(gòu)體變量,只有以下兩種情況可以對結(jié)構(gòu)體變量賦值。(1)結(jié)構(gòu)體變量整體賦值例如:boy2=boy1;(2)取結(jié)構(gòu)體變量地址例如:&boy2;&boy1;注意:結(jié)構(gòu)體變量名是地址常量,含義與數(shù)組名和函數(shù)名相同,不能對結(jié)構(gòu)體變量做整體輸入/輸出。例如:scanf("%d,%s,%c,%f",&boy1);printf("%d,%s,%c,%f",boy1);這些語句都是不允許的,只能對結(jié)構(gòu)體成員進(jìn)行輸入/輸出。8.1結(jié)構(gòu)體8.1.4結(jié)構(gòu)體變量的賦值8.1
結(jié)構(gòu)體例8.1給結(jié)構(gòu)體變量賦值并輸出其值。#include<stdio.h>voidmain(){structstu/*定義結(jié)構(gòu)體stu*/{intnum;char*name;charsex;floatscore;}boy1,boy2;/*定義stu類型的變量boy1、boy2*/boy1.num=102;="Zhangping";printf("inputsexandscore:\n");scanf("%c%f",&boy1.sex,&boy1.score);/*給boy1的成員sex和score賦值*/boy2=boy1;/*把boy1整體賦給boy2*/printf("number=%d\nname=%s\n",boy2.num,);printf("sex=%c\nscore=%6.2f\n",boy2.sex,boy2.score);}8.1結(jié)構(gòu)體例8.1給結(jié)構(gòu)體變量賦值并輸出其值。8.1
結(jié)構(gòu)體程序運(yùn)行結(jié)果:inputsexandscore:M96↙number=102name=Zhangpingsex=Mscore=︼96.00本程序中用賦值語句給num和name兩個(gè)成員賦值,name是一個(gè)字符串指針變量。用scanf()函數(shù)動(dòng)態(tài)地輸入sex和score成員值,然后把boy1的所有成員的值整體賦予boy2。最后分別輸出boy2的各個(gè)成員值。8.1結(jié)構(gòu)體程序運(yùn)行結(jié)果:本程序中用賦值語8.1
結(jié)構(gòu)體8.1.5結(jié)構(gòu)體變量的初始化如果結(jié)構(gòu)體變量為全局變量或者靜態(tài)變量,則可以對它做初始化賦值。對局部或自動(dòng)結(jié)構(gòu)體變量不能做初始化賦值。8.1結(jié)構(gòu)體8.1.5結(jié)構(gòu)體變量的初始化8.1
結(jié)構(gòu)體例8.2外部結(jié)構(gòu)體變量初始化。#include<stdio.h>structstu/*定義結(jié)構(gòu)體*/{intnum;char*name;charsex;floatscore;}boy2,boy1={102,"Zhangping",'M',78.5};/*對變量boy1的成員初始化*/voidmain(){boy2=boy1;/*把boy1整體賦給boy2*/printf("number=%d\nname=%s\n",boy2.num,);printf("sex=%c\nscore=%6.2f\n",boy2.sex,boy2.score);}8.1結(jié)構(gòu)體例8.2外部結(jié)構(gòu)體變量初始化。8.1
結(jié)構(gòu)體程序運(yùn)行結(jié)果:number=102name=Zhangpingsex=Mscore=︼78.50本程序中,boy2,boy1均被定義為外部結(jié)構(gòu)體變量,并對boy1作了初始化賦值。在main()函數(shù)中,把boy1的值整體賦予boy2,然后用兩個(gè)printf()語句輸出boy2各成員的值。8.1結(jié)構(gòu)體程序運(yùn)行結(jié)果:本程序中,boy8.1
結(jié)構(gòu)體例8.3靜態(tài)結(jié)構(gòu)體變量初始化。#include<stdio.h>voidmain(){staticstructstu/*定義靜態(tài)結(jié)構(gòu)體*/{intnum;char*name;charsex;floatscore;}boy2,boy1={102,"Zhangping",'M',78.5};/*對變量boy1的成員初始化*/boy2=boy1;printf("number=%d\nname=%s\n",boy2.num,);printf("sex=%c\nscore=%6.2f\n",boy2.sex,boy2.score);}本程序是把boy1,boy2都定義為靜態(tài)局部的結(jié)構(gòu)體變量,同樣可以做初始化賦值。8.1結(jié)構(gòu)體例8.3靜態(tài)結(jié)構(gòu)體變量初始化。8.1
結(jié)構(gòu)體8.1.6結(jié)構(gòu)體數(shù)組一個(gè)結(jié)構(gòu)體變量可以處理一個(gè)對象,如果有多個(gè)對象,則需要多個(gè)結(jié)構(gòu)體變量,數(shù)組的元素也可以是結(jié)構(gòu)體類型的,因此可以構(gòu)成結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組的每一個(gè)元素都是具有相同結(jié)構(gòu)體類型的下標(biāo)結(jié)構(gòu)體變量。在實(shí)際應(yīng)用中,經(jīng)常用結(jié)構(gòu)體數(shù)組來表示具有相同數(shù)據(jù)結(jié)構(gòu)的一個(gè)群體。如一個(gè)班的學(xué)生檔案,一個(gè)車間職工的工資表等。結(jié)構(gòu)體數(shù)組的定義方法和結(jié)構(gòu)體變量相似,也有三種方式:(1)先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體數(shù)組。例如:structstu{intnum;char*name;charsex;floatscore;};structstuboy[5];定義了一個(gè)結(jié)構(gòu)體數(shù)組boy,共有5個(gè)元素,boy[0]~boy[4]。每個(gè)數(shù)組元素都具有structstu的結(jié)構(gòu)體形式。8.1結(jié)構(gòu)體8.1.6結(jié)構(gòu)體數(shù)組8.1
結(jié)構(gòu)體(2)在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體數(shù)組。例如:structstu{intnum;char*name;charsex;floatscore;}boy[5];(3)直接定義結(jié)構(gòu)體數(shù)組。例如:struct{intnum;char*name;charsex;floatscore;}boy[5];8.1結(jié)構(gòu)體(2)在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體數(shù)組。8.1
結(jié)構(gòu)體對外部結(jié)構(gòu)體數(shù)組或靜態(tài)結(jié)構(gòu)體數(shù)組可以做初始化賦值。例如:structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping",'M',45},{102,"Zhangping",'M',62.5},{103,"Hefang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58}};當(dāng)對全部元素做初始化賦值時(shí),也可不給出數(shù)組長度。8.1結(jié)構(gòu)體對外部結(jié)構(gòu)體數(shù)組或靜態(tài)結(jié)構(gòu)體數(shù)8.1
結(jié)構(gòu)體例8.4計(jì)算學(xué)生的平均成績和不及格的人數(shù)。#include<stdio.h>structstu/*定義結(jié)構(gòu)體*/{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping",'M',45},{102,"Zhangping",'M',62.5},{103,"Hefang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58}};/*對結(jié)構(gòu)體數(shù)組元素初始化*/voidmain(){inti,c=0;floatave,s=0;for(i=0;i<5;i++){s+=boy[i].score;if(boy[i].score<60)c+=1;}printf("s=%6.2f\n",s);ave=s/5;/*計(jì)算平均成績*/printf("average=%6.2f\ncount=%d\n",ave,c);}8.1結(jié)構(gòu)體例8.4計(jì)算學(xué)生的平均成績和不及格的人數(shù)。8.1
結(jié)構(gòu)體程序運(yùn)行結(jié)果:s=345.00average=︼69.00count=2本例程序中定義了一個(gè)外部結(jié)構(gòu)體數(shù)組boy,共5個(gè)元素,并作了初始化賦值。在main函數(shù)中用for語句逐個(gè)累加各元素的score成員值存于s之中,如score的值小于60(不及格),即計(jì)數(shù)器C加1,循環(huán)完畢后計(jì)算平均成績,并輸出全班總分、平均分及不及格人數(shù)。8.1結(jié)構(gòu)體程序運(yùn)行結(jié)果:本例程序中定義了8.1
結(jié)構(gòu)體例8.5建立同學(xué)通訊錄。#include<stdio.h>#defineNUM2structmem/*定義結(jié)構(gòu)體*/{charname[20];charphone[10];};voidmain(){structmemman[NUM];inti;for(i=0;i<NUM;i++)/*輸入通訊錄*/{printf("inputname:");gets(man[i].name);printf("inputphone:");gets(man[i].phone);}printf("Name\t\tPhone\n");for(i=0;i<NUM;i++)/*輸出通訊錄*/printf("%s\t%s\n",man[i].name,man[i].phone);}8.1結(jié)構(gòu)體例8.5建立同學(xué)通訊錄。8.1
結(jié)構(gòu)體程序運(yùn)行結(jié)果:inputname:Zhangjun↙inputphone:88888888↙inputname:Wangfang↙inputphone:99999999↙NamePhoneZhangjun88888888Wangfang99999999本程序中定義了一個(gè)結(jié)構(gòu)體類型mem,它有兩個(gè)成員name和phone,用來表示姓名和電話號碼。在主函數(shù)中定義man為具有mem類型的結(jié)構(gòu)體數(shù)組。在for語句中,用gets()函數(shù)分別輸入各個(gè)元素中兩個(gè)成員的值。然后又在for語句中用printf()語句輸出各元素中兩個(gè)成員值。8.1結(jié)構(gòu)體程序運(yùn)行結(jié)果:本程序中定義了一8.1
結(jié)構(gòu)體8.1.7指向結(jié)構(gòu)體變量的指針變量結(jié)構(gòu)體指針變量是一個(gè)指針變量,用來指向改變量所分配的存儲區(qū)域的首地址。結(jié)構(gòu)體指針變量還可以用來指向結(jié)構(gòu)體數(shù)組中的元素。結(jié)構(gòu)體指針與以前介紹的各種指針在特性和使用方法上完全相同。結(jié)構(gòu)體指針變量的運(yùn)算也按照C語言的地址計(jì)算規(guī)則進(jìn)行的。例如,結(jié)構(gòu)體指針變量加1將指向內(nèi)存中下一個(gè)結(jié)構(gòu)體變量,結(jié)構(gòu)體指針變量自身地址值的增加量取決于它所指向的結(jié)構(gòu)體變量的數(shù)據(jù)長度(sizeof()函數(shù)獲?。?傊?,結(jié)構(gòu)體指針變量是指向一個(gè)結(jié)構(gòu)體變量的指針變量。8.1結(jié)構(gòu)體8.1.7指向結(jié)構(gòu)體變量的指針變量8.1
結(jié)構(gòu)體1.結(jié)構(gòu)體指針變量的定義定義結(jié)構(gòu)體指針變量的一般形式為:struct結(jié)構(gòu)體類型名*結(jié)構(gòu)指針變量名;例如:structstu{intnum;char*name;charsex;floatscore;}boy,*pstu;pstu=&boy;也可以定義結(jié)構(gòu)體類型后再定義結(jié)構(gòu)體指針變量。結(jié)構(gòu)體名和結(jié)構(gòu)體變量是兩個(gè)不同的概念,不能混淆。結(jié)構(gòu)體名只能表示一個(gè)結(jié)構(gòu)體形式,編譯系統(tǒng)并不對它分配內(nèi)存空間。只有當(dāng)某變量被說明為這種類型的結(jié)構(gòu)時(shí),才對該變量分配存儲空間。有了結(jié)構(gòu)指針變量,就能更方便地訪問結(jié)構(gòu)變量的各個(gè)成員。8.1結(jié)構(gòu)體1.結(jié)構(gòu)體指針變量的定義8.1
結(jié)構(gòu)體2.結(jié)構(gòu)體指針變量的賦值結(jié)構(gòu)體指針變量必須先賦值后使用。賦值是把結(jié)構(gòu)體變量的首地址賦給該指針變量,不能把結(jié)構(gòu)名賦給該指針變量。例如,不能寫成pstu=&stu;。注意:pstu已為指向一個(gè)結(jié)構(gòu)體類型的指針變量,它只能指向結(jié)構(gòu)體變量而不能指向它其中一個(gè)成員。換句話說:pstu只能存放結(jié)構(gòu)體變量的地址。例如,不能寫成pstu=&stu.num;。8.1結(jié)構(gòu)體2.結(jié)構(gòu)體指針變量的賦值8.1
結(jié)構(gòu)體3.結(jié)構(gòu)體指針變量的引用定義好一個(gè)結(jié)構(gòu)體指針變量之后,就可以對該指針變量進(jìn)行各種操作。例如,給一個(gè)結(jié)構(gòu)體變量指針賦一個(gè)地址值,輸出一個(gè)結(jié)構(gòu)體變量指針的成員值,訪問結(jié)構(gòu)體變量指針?biāo)赶虻淖兞康某蓡T等。引用結(jié)構(gòu)體指針變量的一般形式為:(*結(jié)構(gòu)指針變量).成員名;或結(jié)構(gòu)指針變量->成員名;例如:(*pstu).num;或pstu->num;應(yīng)該注意(*pstu)兩側(cè)的括號不可少,因?yàn)槌蓡T符“.”的優(yōu)先級高于“*”。如去掉括號寫作*pstu.num,則等效于*(pstu.num),這樣,意義就完全不對了。8.1結(jié)構(gòu)體3.結(jié)構(gòu)體指針變量的引用8.1
結(jié)構(gòu)體例8.6分析下面程序的運(yùn)行結(jié)果。#include<stdio.h>structstu/*定義結(jié)構(gòu)體*/{intnum;char*name;charsex;floatscore;}boy1={102,"Zhangping",'M',78.5},*pstu;voidmain(){pstu=&boy1;printf("number=%d\nname=%s\n",boy1.num,);printf("sex=%c\nscore=%6.2f\n\n",boy1.sex,boy1.score);printf("number=%d\nname=%s\n",(*pstu).num,(*pstu).name);printf("sex=%c\nscore=%6.2f\n\n",(*pstu).sex,(*pstu).score);printf("number=%d\nname=%s\n",pstu->num,pstu->name);printf("sex=%c\nscore=%6.2f\n\n",pstu->sex,pstu->score);}8.1結(jié)構(gòu)體例8.6分析下面程序的運(yùn)行結(jié)果。8.1
結(jié)構(gòu)體本程序序定義了一個(gè)結(jié)構(gòu)體類型stu,定義了stu類型結(jié)構(gòu)變量boy1并作了初始化賦值,還定義了一個(gè)指向stu類型結(jié)構(gòu)體的指針變量pstu。在main()函數(shù)中,pstu被賦予boy1的地址,因此pstu指向boy1。然后在printf()語句內(nèi)用三種形式輸出boy1的各個(gè)成員值。程序運(yùn)行結(jié)果:number=102name=Zhangpingsex=Mscore=︼78.508.1結(jié)構(gòu)體本程序序定義了一個(gè)結(jié)構(gòu)體類型s8.2
動(dòng)態(tài)內(nèi)存分配與鏈表我們存儲數(shù)量比較多的同類型或同結(jié)構(gòu)的數(shù)據(jù)時(shí),一般首先考慮數(shù)組。然而在實(shí)際應(yīng)用中,當(dāng)處理一些難以確定其數(shù)量的數(shù)據(jù)時(shí),如果用數(shù)組來處理,必須事先分配一個(gè)足夠大的連續(xù)空間,以保證數(shù)組元素?cái)?shù)量充分夠用,但這樣處理時(shí)對存儲空間的一種浪費(fèi)。C語言使用動(dòng)態(tài)內(nèi)存分配來解決這樣的問題,其中常用的就是鏈表。鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),它動(dòng)態(tài)地進(jìn)行存儲分配,并且可以方便而又簡單地進(jìn)行數(shù)據(jù)插入,刪除等操作。8.2動(dòng)態(tài)內(nèi)存分配與鏈表我們存儲數(shù)量比較多8.2
動(dòng)態(tài)內(nèi)存分配與鏈表8.2.1鏈表的概念鏈表是指若干個(gè)數(shù)據(jù)按一定的原則連接起來。這個(gè)原則為:前一個(gè)數(shù)據(jù)指向下一個(gè)數(shù)據(jù),只有通過前一個(gè)數(shù)據(jù)項(xiàng)才能找到下一個(gè)數(shù)據(jù)項(xiàng)。鏈表有一個(gè)“頭指針”(head),它指向鏈表的第一個(gè)元素(數(shù)據(jù)項(xiàng))。鏈表的一個(gè)元素稱為一個(gè)“結(jié)點(diǎn)”(node)。結(jié)點(diǎn)中包含兩部分內(nèi)容,第一部分是結(jié)點(diǎn)數(shù)據(jù)本身,如圖8-1中的A、B、C、D所示。結(jié)點(diǎn)的第二部分是一個(gè)指針,它指向下一個(gè)結(jié)點(diǎn)。最后一個(gè)結(jié)點(diǎn)稱為“表尾”,表尾結(jié)點(diǎn)的指針不指向任何地址,因此為空(NULL)。圖8-1鏈表結(jié)構(gòu)圖8.2動(dòng)態(tài)內(nèi)存分配與鏈表8.2.1鏈表的概念圖8-18.2
動(dòng)態(tài)內(nèi)存分配與鏈表如果每個(gè)結(jié)點(diǎn)采用一個(gè)指針,將前一個(gè)結(jié)點(diǎn)的指針指向下一個(gè)結(jié)點(diǎn),這稱為單鏈表。如果每個(gè)結(jié)點(diǎn)有兩個(gè)指向其他結(jié)點(diǎn)的指針,則稱為雙鏈表。本節(jié)主要討論單鏈表的運(yùn)算。由以上簡單鏈表可以看到,鏈表中的每個(gè)結(jié)點(diǎn)至少包含兩個(gè)域,一個(gè)域用來存放數(shù)據(jù),其類型根據(jù)需存放的數(shù)據(jù)類型定義。另一個(gè)域用來存放下一個(gè)結(jié)點(diǎn)的地址,因此必然是一個(gè)指針類型,此指針的類型應(yīng)該是所指向的表結(jié)點(diǎn)的結(jié)構(gòu)體類型。在C語言中,可以用結(jié)構(gòu)體類型來實(shí)現(xiàn)鏈表,例如:structstudent{intlong;floatscore;structstudent*next;/*指向下一結(jié)點(diǎn)*/};其中next是結(jié)構(gòu)體指針變量,用來存放下一個(gè)結(jié)點(diǎn)的地址,即next是指向下一個(gè)結(jié)點(diǎn)。8.2動(dòng)態(tài)內(nèi)存分配與鏈表如果每個(gè)結(jié)點(diǎn)采用一8.2
動(dòng)態(tài)內(nèi)存分配與鏈表8.2.2動(dòng)態(tài)存儲分配C語言允許在函數(shù)執(zhí)行部分的任何地方使用動(dòng)態(tài)存儲分配函數(shù)開辟或收回存儲單元,這樣的存儲分配叫動(dòng)態(tài)存儲分配。動(dòng)態(tài)分配使用自由、節(jié)約內(nèi)存。鏈表是動(dòng)態(tài)分配存儲空間的,也就是說在需要的時(shí)候才開辟一個(gè)結(jié)點(diǎn)的存儲空間。在C語言中提供了以下有關(guān)的函數(shù)來實(shí)現(xiàn)動(dòng)態(tài)存儲分配和釋放,這些函數(shù)包含在“stdio.h”或“malloc.h”中。8.2動(dòng)態(tài)內(nèi)存分配與鏈表8.2.2動(dòng)態(tài)存儲分配8.2
動(dòng)態(tài)內(nèi)存分配與鏈表1.malloc()函數(shù)(分配內(nèi)存空間函數(shù))調(diào)用形式為:void*malloc(size);其作用是在內(nèi)存中動(dòng)態(tài)獲取一個(gè)大小為size個(gè)字節(jié)的連續(xù)存儲空間。該函數(shù)將返回一個(gè)void類型的指針,若分配成功,就返回所分配的空間的起始地址,否則,就返回空指針(NULL)。2.calloc函數(shù)(分配內(nèi)存空間函數(shù))調(diào)用形式為:void*calloc(unsignedn,unsignedsize);其作用是在內(nèi)存中動(dòng)態(tài)獲取n個(gè)大小為size個(gè)字節(jié)的存儲空間。該函數(shù)將返回一個(gè)void類型的指針,若分配成功,就返回內(nèi)存單元的起始地址,否則,返回空指針(NULL)。用該函數(shù)可以動(dòng)態(tài)地獲取一個(gè)一維數(shù)組空間,其中n為數(shù)組元素個(gè)數(shù),每個(gè)數(shù)組元素的大小為size個(gè)字節(jié)。8.2動(dòng)態(tài)內(nèi)存分配與鏈表1.malloc()函數(shù)(分配內(nèi)8.2
動(dòng)態(tài)內(nèi)存分配與鏈表3.free()函數(shù)(釋放內(nèi)存空間函數(shù))調(diào)用形式為:voidfree(void*p);其作用是釋放由p指針?biāo)赶虻膬?nèi)存空間。即系統(tǒng)回收,使這段空間又可以被其他變量所用。指針變量p是最近一次調(diào)用malloc()或calloc()函數(shù)時(shí)返回的值,不能是任意的地址。4.realloc函數(shù)調(diào)用形式為:void*recalloc(void*p,unsignedsize);其作用是將p所指的已分配的內(nèi)存空間重新分配成大小為size個(gè)字節(jié)的空間。它用于改變已分配的空間的大小,可以增減單元數(shù)。函數(shù)返回新內(nèi)存的首地址,如果內(nèi)存不夠,則返回空指針(NULL)。8.2動(dòng)態(tài)內(nèi)存分配與鏈表3.free()函數(shù)(釋放內(nèi)存空間8.2
動(dòng)態(tài)內(nèi)存分配與鏈表例8.7分配一塊區(qū)域,輸入一個(gè)學(xué)生數(shù)據(jù)。#include<stdio.h>#include<stdlib.h>voidmain(){structstu/*定義結(jié)構(gòu)體*/{intnum;char*name;charsex;floatscore;}*ps;/*定義一個(gè)結(jié)構(gòu)體指針變量ps*/ps=(structstu*)malloc(sizeof(structstu));ps->num=102;/*輸入學(xué)生數(shù)據(jù)*/ps->name="Zhangping";ps->sex='M';ps->score=62.5;printf("number=%d\nname=%s\n",ps->num,ps->name);printf("sex=%c\nscore=%6.2f\n",ps->sex,ps->score);free(ps);}8.2動(dòng)態(tài)內(nèi)存分配與鏈表例8.7分配一塊區(qū)域,輸入一個(gè)學(xué)8.2
動(dòng)態(tài)內(nèi)存分配與鏈表程序運(yùn)行結(jié)果:number=102name=Zhangpingsex=Mscore=︼62.50本程序中,定義了結(jié)構(gòu)體類型stu,定義了stu類型指針變量ps。然后分配一塊stu大內(nèi)存區(qū),并把首地址賦予ps,使ps指向該區(qū)域。再以ps為指向結(jié)構(gòu)體的指針變量對各成員賦值,并用printf()輸出各成員值。最后用free()函數(shù)釋放ps指向的內(nèi)存空間。整個(gè)程序包含了申請內(nèi)存空間、使用內(nèi)存空間、釋放內(nèi)存空間三個(gè)步驟,實(shí)現(xiàn)存儲空間的動(dòng)態(tài)分配。8.2動(dòng)態(tài)內(nèi)存分配與鏈表程序運(yùn)行結(jié)果:本程8.2
動(dòng)態(tài)內(nèi)存分配與鏈表8.2.3建立和輸出鏈表所謂動(dòng)態(tài)建立鏈表是指在程序執(zhí)行過程中從無到有地建立鏈表,將一個(gè)個(gè)新生成的結(jié)點(diǎn)順次鏈接入已建立的鏈表上,上一個(gè)結(jié)點(diǎn)的指針域存放下一個(gè)結(jié)點(diǎn)的起始地址,并給各結(jié)點(diǎn)數(shù)據(jù)域賦值。所謂輸出鏈表是將鏈表上各個(gè)結(jié)點(diǎn)的數(shù)據(jù)域中的值依次輸出,直到鏈表結(jié)尾。8.2動(dòng)態(tài)內(nèi)存分配與鏈表8.2.3建立和輸出鏈表8.2
動(dòng)態(tài)內(nèi)存分配與鏈表例8.8以三個(gè)結(jié)構(gòu)體變量為結(jié)點(diǎn)建立一個(gè)簡單的鏈表并輸出。#include<stdio.h>structnode{intdata;structnode*next;};voidmain(){structnodea,b,c,*head,*p;head=&a;/*頭結(jié)點(diǎn)指向a結(jié)點(diǎn)*/a.data=5;a.next=&b;/*a結(jié)點(diǎn)指向b結(jié)點(diǎn)*/b.data=10;b.next=&c;/*b結(jié)點(diǎn)指向c結(jié)點(diǎn)*/c.data=15;c.next=NULL;/*c結(jié)點(diǎn)是尾結(jié)點(diǎn)*/p=head;/*使p指向a結(jié)點(diǎn)*/while(p!=NULL){printf("%d-->",p->data);/*輸出指針p所指向結(jié)點(diǎn)的數(shù)據(jù)*/p=p->next;/*使p指向下一個(gè)結(jié)點(diǎn)*/}printf("NULL\n");}程序運(yùn)行結(jié)果:5-->10-->15-->NULL8.2動(dòng)態(tài)內(nèi)存分配與鏈表例8.8以三個(gè)結(jié)構(gòu)體變量為結(jié)點(diǎn)建8.2
動(dòng)態(tài)內(nèi)存分配與鏈表8.2.4鏈表的基本操作鏈表的基本操作包括,建立并初始化鏈表,遍歷訪問鏈表(包括查找結(jié)點(diǎn)、輸出結(jié)點(diǎn)等),刪除鏈表中的結(jié)點(diǎn),在鏈表中插入結(jié)點(diǎn)。鏈表的各種基本操作的步驟如下。1.建立鏈表①建立頭結(jié)點(diǎn)(或定義頭指針變量)。②讀取數(shù)據(jù)。③生成新結(jié)點(diǎn)。④將數(shù)據(jù)存入結(jié)點(diǎn)的數(shù)據(jù)域中。⑤將新結(jié)點(diǎn)連接到鏈表中(將新結(jié)點(diǎn)地址賦給上一個(gè)結(jié)點(diǎn)的指針域連接到鏈表)。⑥重復(fù)步驟②~⑤,直到尾結(jié)點(diǎn)為止。8.2動(dòng)態(tài)內(nèi)存分配與鏈表8.2.4鏈表的基本操作8.2
動(dòng)態(tài)內(nèi)存分配與鏈表2.遍歷訪問鏈表輸出鏈表即順序訪問鏈表中各結(jié)點(diǎn)的數(shù)據(jù)域,方法是:從頭結(jié)點(diǎn)開始,不斷地讀取數(shù)據(jù)和下移指針變量,直到尾結(jié)點(diǎn)為止。3.刪除鏈表中的一個(gè)結(jié)點(diǎn)①找到要?jiǎng)h除結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)。②將要?jiǎng)h除結(jié)點(diǎn)的后驅(qū)結(jié)點(diǎn)的地址賦給要?jiǎng)h除結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的指針域。③將要?jiǎng)h除結(jié)點(diǎn)的存儲空間釋放。4.在鏈表的某結(jié)點(diǎn)前插入一個(gè)結(jié)點(diǎn)①開辟一個(gè)新結(jié)點(diǎn)并將數(shù)據(jù)存入該結(jié)點(diǎn)的數(shù)據(jù)域。②找到插入點(diǎn)結(jié)點(diǎn)。③將新結(jié)點(diǎn)插入到鏈表中,將新結(jié)點(diǎn)的地址賦給插入點(diǎn)上一個(gè)結(jié)點(diǎn)的指針域,并將插入點(diǎn)的地址存入新結(jié)點(diǎn)的指針域。8.2動(dòng)態(tài)內(nèi)存分配與鏈表2.遍歷訪問鏈表8.2
動(dòng)態(tài)內(nèi)存分配與鏈表例8.9建立并輸出一個(gè)學(xué)生成績鏈表(假設(shè)學(xué)生成績表中只含姓名和成績)。#include<stdio.h>#include<malloc.h>typedefstructstudent/*自定義鏈表結(jié)點(diǎn)數(shù)據(jù)類型名ST和指針類型名*STU*/{charname[20];intscore;structstudent*next;/*結(jié)點(diǎn)指針域*/}ST,*STU;STUcreatelink(intn)/*建立一個(gè)由n個(gè)結(jié)點(diǎn)構(gòu)成的單鏈表函數(shù),返回結(jié)點(diǎn)指針類型*/{inti;STUp,q,head;if(n<=0)return(NULL);head=(STU)malloc(sizeof(ST));/*生成第一個(gè)結(jié)點(diǎn)*/printf("inputdatas:\n");scanf("%s%d",head->name,&head->score);/*兩個(gè)數(shù)據(jù)之間用一個(gè)空格間隔*/p=head;8.2動(dòng)態(tài)內(nèi)存分配與鏈表例8.9建立并輸出一個(gè)學(xué)生成績鏈8.2
動(dòng)態(tài)內(nèi)存分配與鏈表for(i=1;i<n;i++){q=(STU)malloc(sizeof(ST));scanf("%s%d",q->name,&q->score);p->next=q;/*連接q結(jié)點(diǎn)*/p=q;/*p跳到q上,再準(zhǔn)備連接下一個(gè)結(jié)點(diǎn)q*/}p->next=NULL;/*置尾結(jié)點(diǎn)指針域?yàn)榭罩羔?/return(head);/*將已建立起來的單鏈表頭指針返回*/}voidlist(STUhead)/*鏈表的輸出*/{STUp=head;/*從頭指針出發(fā),依次輸出各結(jié)點(diǎn)的值,直到遇到NULL*/while(p!=NULL){printf("%s\t%d\n",p->name,p->score);p=p->next;/*p指針順序后移一個(gè)結(jié)點(diǎn)*/}}voidmain(){STUh;intn;printf("inputnumberofnode:");scanf("%d",&n);h=createlink(n);/*調(diào)用建立單鏈表的函數(shù)*/list(h);/*調(diào)用輸出鏈表的函數(shù)*/}8.2動(dòng)態(tài)內(nèi)存分配與鏈表for(i=1;i<n;i++)8.2
動(dòng)態(tài)內(nèi)存分配與鏈表程序運(yùn)行結(jié)果:inputnumberofnode:4↙inputdatas:A60↙B70↙C80↙D90↙A60B70C80D908.2動(dòng)態(tài)內(nèi)存分配與鏈表程序運(yùn)行結(jié)果:8.2
動(dòng)態(tài)內(nèi)存分配與鏈表例8.10編寫一個(gè)函數(shù),在例8.9中建立的鏈表的前面插入一個(gè)結(jié)點(diǎn)。#include<stdio.h>#include<malloc.h>/*將例8.9中typedefstructstudent直到voidlist(STUhead)函數(shù)全部插入到該位置*/STUincreasenode1(STUhead){STUs;s=(STU)malloc(sizeof(ST));printf("Inputnewnodedatas:");scanf("%s%d",s->name,&s->score);s->next=head;head=s;return(head);}voidmain(){STUh;intn;printf("inputnumberofnode:");scanf("%d",&n);h=createlink(n);/*調(diào)用建立單鏈表的函數(shù)*/list(h);/*調(diào)用輸出鏈表的函數(shù)*/h=increasenode1(h);list(h);}8.2動(dòng)態(tài)內(nèi)存分配與鏈表例8.10編寫一個(gè)函數(shù),在例8.98.2
動(dòng)態(tài)內(nèi)存分配與鏈表程序運(yùn)行結(jié)果:
inputnumberofnode:3↙inputdatas:A60↙B70↙C80↙A60B70C80inputnewnodedatas:E100↙E100A10B20C308.2動(dòng)態(tài)內(nèi)存分配與鏈表程序運(yùn)行結(jié)果:8.2
動(dòng)態(tài)內(nèi)存分配與鏈表例8.11編寫一個(gè)函數(shù),在例8.9建立的鏈表的第i個(gè)結(jié)點(diǎn)之后插入一個(gè)新結(jié)點(diǎn)。#include<stdio.h>#include<malloc.h>/*將例8.9中typedefstructstudent直到voidlist(STUhead)函數(shù)全部插入到該位置*/STUincreasenode2(STUhead,inti){STUs,p,q;intj=0;/*查找第i個(gè)結(jié)點(diǎn)計(jì)數(shù)用*/if(i<0)returnNULL;/*參數(shù)i值不合理*/s=(STU)malloc(sizeof(ST));printf("inputnewnodedatas:");scanf("%s%d",s->name,&s->score);if(i==0)/*i==0表明是在第一個(gè)結(jié)點(diǎn)之前插入新結(jié)點(diǎn)*/{s->next=head;head=s;return(head);}q=head;/*查找新結(jié)點(diǎn)的位置,在p和q之間*/8.2動(dòng)態(tài)內(nèi)存分配與鏈表例8.11編寫一個(gè)函數(shù),在例8.8.2
動(dòng)態(tài)內(nèi)存分配與鏈表while(j<i&&q!=NULL){j++;p=q;q=q->next;}if(j<i)returnNULL;/*i值超過表長*/p->next=s;/*在p和q之間,即第i個(gè)結(jié)點(diǎn)之后插入新結(jié)點(diǎn)*/s->next=q;return(head);}voidmain(){STUh;intn;inti;printf("inputnumberofnode:");scanf("%d",&n);h=createlink(n);/*調(diào)用建立單鏈表的函數(shù)*/list(h);/*調(diào)用輸出鏈表的函數(shù)*/printf("inputnewnodenumber:");/*輸入新結(jié)點(diǎn)*/scanf("%d",&i);h=increasenode2(h,i);list(h);}8.2動(dòng)態(tài)內(nèi)存分配與鏈表while(j<i&&q!=8.2
動(dòng)態(tài)內(nèi)存分配與鏈表程序運(yùn)行結(jié)果:inputnumberofnode:3↙inputdatas:A60↙B70↙C80↙A60B70C80inputnewnodenumber:2↙inputnewnodedatas:E100↙A10B20E100C308.2動(dòng)態(tài)內(nèi)存分配與鏈表程序運(yùn)行結(jié)果:8.2
動(dòng)態(tài)內(nèi)存分配與鏈表例8.12刪除鏈表中的表首結(jié)點(diǎn)函數(shù)。#include<stdio.h>#include<malloc.h>/*將例8.9中typedefstructstudent直到voidlist(STUhead)函數(shù)全部插入到該位置*/STUdeletenode1(STUhead){STUs;if(head!=NULL){printf("afterdeletedthefirstnode:\n");s=head;head=s->next;free(s);}return(head);}voidmain(){STUh;intn;printf("inputnumberofnode:");scanf("%d",&n);h=createlink(n);/*調(diào)用建立單鏈表的函數(shù)*/list(h);/*調(diào)用輸出鏈表的函數(shù)*/h=deletenode1(h);list(h);}8.2動(dòng)態(tài)內(nèi)存分配與鏈表例8.12刪除鏈表中的表首結(jié)點(diǎn)函8.2
動(dòng)態(tài)內(nèi)存分配與鏈表程序運(yùn)行結(jié)果:inputnumberofnode:4↙inputdatas:A60↙B70↙C80↙D90↙A60B70C80D90afterdeletedthefirstnode:B70C80D908.2動(dòng)態(tài)內(nèi)存分配與鏈表程序運(yùn)行結(jié)果:8.2
動(dòng)態(tài)內(nèi)存分配與鏈表例8.13編寫一個(gè)函數(shù),刪除鏈表中的第i個(gè)結(jié)點(diǎn)。#include<stdio.h>#include<malloc.h>/*將例8.9中typedefstructstudent直到voidlist(STUhead)函數(shù)全部插入到該位置*/STUdeletenode2(STUhead,inti){STUp,s;intj;if(i<1)returnNULL;/*i<1不合理*/if(i==1)/*欲刪除的結(jié)點(diǎn)是鏈表中的第1個(gè)結(jié)點(diǎn)*/{if(head!=NULL){s=head;head=s->next;free(s);}return(head);}s=head->next;/*查找第i個(gè)結(jié)點(diǎn)的位置,以s標(biāo)記*/p=head;j=2;8.2動(dòng)態(tài)內(nèi)存分配與鏈表例8.13編寫一個(gè)函數(shù),刪除鏈表8.2
動(dòng)態(tài)內(nèi)存分配與鏈表while(j<i&&s!=NULL){j++;p=s;s=s->next;}if(j<i)returnNULL;/*j<i表明參數(shù)i的值超過了表長*/p->next=s->next;/*摘除s結(jié)點(diǎn)*/free(s);/*回收已摘掉的結(jié)點(diǎn)*/return(head);}voidmain(){STUh;intn;inti;printf("inputnumberofnode:");scanf("%d",&n);h=createlink(n);/*調(diào)用建立單鏈表的函數(shù)*/list(h);/*調(diào)用輸出鏈表的函數(shù)*/printf("whichnodeyouwanttodelete:");scanf("%d",&i);h=deletenode2(h,i);list(h);}8.2動(dòng)態(tài)內(nèi)存分配與鏈表while(j<i&&8.2
動(dòng)態(tài)內(nèi)存分配與鏈表程序運(yùn)行結(jié)果:inputnumberofnode:4↙inputdatas:A60↙B70↙C80↙D90↙A60B70C80D90whichnodeyouwanttodelete:2↙A60C80D908.2動(dòng)態(tài)內(nèi)存分配與鏈表程序運(yùn)行結(jié)果:8.3
共用體類型8.3共用體類型8.3
共用體類型8.3.1共用體類型概述
在實(shí)際問題中有很多這樣的例子。例如在學(xué)校的教師和學(xué)生中填寫以下表格:姓名、年齡、職業(yè)、單位。“職業(yè)”一項(xiàng)可分為“教師”和“學(xué)生”兩類。對“單位”一項(xiàng)學(xué)生應(yīng)填入班級編號,教師應(yīng)填入某系某教研室。班級可用整型量表示,教研室只能用字符類型。要求把這兩種類型不同的數(shù)據(jù)都填入“單位”這個(gè)變量中,就必須把“單位”定義為包含整型和字符型數(shù)組這兩種類型的“聯(lián)合”。這種幾種不同類型的變量占用同一段內(nèi)存空間的結(jié)構(gòu)稱為共用體(又叫聯(lián)合)。共用體與結(jié)構(gòu)體有一些相似之處,但兩者有本質(zhì)上的不同。在結(jié)構(gòu)體中各成員有各自的內(nèi)存空間,一個(gè)結(jié)構(gòu)體變量的總長度是各成員長度之和。而在共用體中,各成員共享同一段內(nèi)存空間,一個(gè)共用體變量的長度等于各成員中最長的長度。8.3共用體類型8.3.1共用體類型概述8.3
共用體類型定義一個(gè)共用體類型的格式為:union共用體類型名{類型標(biāo)識符1成員1;
類型標(biāo)識符1成員2;······類型標(biāo)識符1成員n;};其中union是系統(tǒng)指定的關(guān)鍵字,共用體類型名由用戶指定,但要符合標(biāo)識符的規(guī)定。它與結(jié)構(gòu)體類型的根本區(qū)別是成員表的所有成員在內(nèi)存中從同一地址開始存放。例如:uniondata{inti;charc;floata;};8.3共用體類型定義一個(gè)共用體類型的格式為8.3
共用體類型定義了一個(gè)名為data的共用體類型,它含有3個(gè)成員,一個(gè)為整型,成員名為i;一個(gè)為字符型,成員名為c;一個(gè)為實(shí)型,成員名為a。這3個(gè)成員的內(nèi)存空間雖然不同,但都從同一起始地址開始存儲,如圖8-2所示(圖中一個(gè)框代表一個(gè)字節(jié))。圖8-2共用體成員的存儲對于具有上述相同成員的結(jié)構(gòu)體變量,則系統(tǒng)分配的內(nèi)存空間等于各成員的內(nèi)存長度之和,即為13字節(jié);而對于共用體變量,則該變量所占內(nèi)存空間為所有成員中最長的成員的長度,即為8字節(jié)。8.3共用體類型定義了一個(gè)名為data的共8.3
共用體類型定義了共用體類型之后,可用它來說明共用體變量。共用體變量的定義方式和結(jié)構(gòu)體變量的定義方式相同,也有三種形式。(1)先定義共用體類型,再用共用體類型定義該類型的共用體變量unionperdata{intclass;charofficae[10];};unionperdataa,b;則先定義共用體類型perdata,再定義該類型的共用體變量a、b。(2)在定義共用體類型的同時(shí),定義該類型的共用體變量unionperdata{intclass;charoffice[10];}a,b;則定義共用體類型perdata的同時(shí),定義了該類型的共用體變量a、b(3)不定義共用體名直接定義共用體變量union{intclass;charoffice[10];}a,b;則直接定義了共用體變量a、b。8.3.2共用體變量的定義8.3共用體類型定義了共用體類型之后,可用8.3
共用體類型共用體變量的引用和結(jié)構(gòu)體變量的引用一樣,不能對一個(gè)共用體變量作為整體來引用,只能引用其中的成員。共用體變量中成員引用的一般形式為:共用體變量名.成員名;如a被定義為上述perdata類型的變量之后,可使用a.class、a.office。另外,也可以通過指針變量引用共用體變量的成員。例如:unionperdata*p,a;p=&a;p->class;8.3.3共用體變量的引用和賦值8.3共用體類型共用體變量的引用和結(jié)構(gòu)體變8.3
共用體類型對于共用體變量的賦值,不允許只用共用體變量名作賦值或其他操作,也不允許對共用體變量作初始化賦值,賦值只能在程序中進(jìn)行。還要再強(qiáng)調(diào)說明的是,一個(gè)共用體變量,每次只能賦予一個(gè)成員值。換句話說,一個(gè)共用體變量的值就是共用體變量的某一個(gè)成員值。8.3共用體類型對于共用體變量的賦值,不8.3
共用體類型例8.14設(shè)有一個(gè)教師與學(xué)生通用的表格,教師數(shù)據(jù)有姓名、年齡、職業(yè)、教研室四項(xiàng)。學(xué)生有姓名、年齡、職業(yè)、班級四項(xiàng)。編寫程序輸入人員數(shù)據(jù),再以表格形式輸出。#include<stdio.h>#include<malloc.h>#include<stdlib.h>voidmain(){struct{charname[10];intage;charjob;union/*定義共用體變量*/{intclass1;charoffice[10];}depa;}body[2];/*定義結(jié)構(gòu)體數(shù)組*/
8.3共用體類型例8.14設(shè)有一個(gè)教師與學(xué)生通用的表格,8.3
共用體類型intn,i;for(i=0;i<2;i++){printf("inputname,age,jobanddepartment:");scanf("%s%d%c",body[i].name,&body[i].age,&body[i].job);if(body[i].job=='s')scanf("%d",&body[i].depa.class1);elsescanf("%s",body[i].depa.office);}printf("name\tage\tjob\tclass1/office\n");for(i=0;i<2;i++){if(body[i].job=='s')printf("%s\t%3d\t%3c\t%d\n",body[i].name,body[i].age,body[i].job,body[i].depa.class1);elseprintf("%s\t%3d\t%3c\t%s\n",body[i].name,body[i].age,body[i].job,body[i].depa.office);}}8.3共用體類型intn,i;8.3
共用體類型程序運(yùn)行結(jié)果:inputname,age,jobanddepartment:Chen18S2↙inputname,age,jobanddepartment:Zhang51Tprof↙Nameagejobclass/officeChen18S2Zhang51Tprof本例程序用一個(gè)結(jié)構(gòu)數(shù)組body來存放人員數(shù)據(jù),該結(jié)構(gòu)共有四個(gè)成員。其中成員項(xiàng)depa是一個(gè)共用體類型,這個(gè)共用體又由兩個(gè)成員組成,一個(gè)為整型量class,一個(gè)為字符數(shù)組office。在程序的第一個(gè)for語句中,輸入人員的各項(xiàng)數(shù)據(jù),先輸
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度生態(tài)園林除草項(xiàng)目合同4篇
- 二零二五年度美甲店品牌形象與國際市場拓展合同4篇
- 2025年度房地產(chǎn)預(yù)售合同擔(dān)保執(zhí)行標(biāo)準(zhǔn)4篇
- 2025年度云計(jì)算解決方案提供商服務(wù)合同4篇
- 2025年度綠色出行產(chǎn)品銷售與回購合同范本4篇
- 二零二五年度大型水庫生態(tài)修復(fù)工程承包合同范本4篇
- 二零二五版防水材料綠色采購與環(huán)保認(rèn)證合同2篇
- 二零二五年度公墓墓位銷售與管理服務(wù)合同4篇
- 二零二五年度民營企業(yè)出納崗位勞動(dòng)合同范本(含加班費(fèi)規(guī)定)4篇
- 二零二四年同安區(qū)二手房買賣合同房屋質(zhì)量保證協(xié)議3篇
- 2024年高純氮化鋁粉體項(xiàng)目可行性分析報(bào)告
- 安檢人員培訓(xùn)
- 危險(xiǎn)性較大分部分項(xiàng)工程及施工現(xiàn)場易發(fā)生重大事故的部位、環(huán)節(jié)的預(yù)防監(jiān)控措施
- 《榜樣9》觀后感心得體會四
- 2023事業(yè)單位筆試《公共基礎(chǔ)知識》備考題庫(含答案)
- 化學(xué)-廣東省廣州市2024-2025學(xué)年高一上學(xué)期期末檢測卷(一)試題和答案
- 2025四川中煙招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- EHS工程師招聘筆試題與參考答案(某大型央企)2024年
- 營銷策劃 -麗亭酒店品牌年度傳播規(guī)劃方案
- 2025年中國蛋糕行業(yè)市場規(guī)模及發(fā)展前景研究報(bào)告(智研咨詢發(fā)布)
- 護(hù)理組長年底述職報(bào)告
評論
0/150
提交評論