版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章結(jié)構(gòu)體與共用體8.1結(jié)構(gòu)體類(lèi)型的定義8.2結(jié)構(gòu)體類(lèi)型變量的定義、引用和初始化8.3結(jié)構(gòu)體數(shù)組8.4結(jié)構(gòu)體指針變量8.5鏈表8.6共同體、枚舉和用戶(hù)自定義類(lèi)型8.7程序舉例數(shù)組-----同類(lèi)型數(shù)據(jù)的有序集合有時(shí),需要將不同類(lèi)型的數(shù)據(jù)組合成一個(gè)整體,以便于引用例:學(xué)生的信息學(xué)號(hào)、姓名、性別、年齡、成績(jī)、家庭住址顯然,上述數(shù)據(jù)類(lèi)型是不相同的,但都是學(xué)生的信息,應(yīng)作為一個(gè)整體進(jìn)行考慮。C:允許用戶(hù)自己定義一種數(shù)據(jù)結(jié)構(gòu)------結(jié)構(gòu)體結(jié)構(gòu)體:不同數(shù)據(jù)類(lèi)型成員的集合使用時(shí):定義類(lèi)型用類(lèi)型定義變量給變量賦值引用變量的值8.1結(jié)構(gòu)體類(lèi)型的定義格式:
struct
結(jié)構(gòu)體名
{類(lèi)型成員1;類(lèi)型成員2;
…
類(lèi)型成員n;
};成員:可以是基本類(lèi)型,也可以是結(jié)構(gòu)類(lèi)型。可與程序中其他變量同名,代表不同對(duì)象,互不干擾。例:設(shè)計(jì)一個(gè)學(xué)生的情況登記表要求有學(xué)號(hào)、姓名、性別、年齡、家庭地址和三門(mén)課成績(jī)?nèi)T(mén)課是語(yǔ)文、數(shù)學(xué)和英語(yǔ)structscore{floatchinese;floatmath;floatenglish;};注:structscore、structstudent是類(lèi)型名,不占內(nèi)存,不能存放具體數(shù)據(jù)只有定義了變量,系統(tǒng)才會(huì)給變量分配內(nèi)存,才能往內(nèi)存里存放數(shù)據(jù)structstudent{intnumber;charname[9];charsex;
intage;charaddress[30];
structscoreachie;};8.2結(jié)構(gòu)體類(lèi)型變量的定義、引用和初始化8.2.1結(jié)構(gòu)體類(lèi)型變量的定義1.先定義結(jié)構(gòu)體類(lèi)型,再定義結(jié)構(gòu)體類(lèi)型變量例:structstudentNa,Nb,Nc;2.定義結(jié)構(gòu)體類(lèi)型同時(shí)定義該結(jié)構(gòu)體類(lèi)型變量例:structstudent{intnumber;……
structscoreachie;}Na,Nb,Nc;3.
直接定義無(wú)結(jié)構(gòu)名的結(jié)構(gòu)體類(lèi)型變量(少用)
例:struct
{intnumber;……
structscoreachie;}Na,Nb,Nc;8.2.2結(jié)構(gòu)體變量的引用及初始化引用方式:結(jié)構(gòu)體類(lèi)型變量名.成員名例:Na.age=18;
scanf(“%d”,&Na.age);Total=Na.age+Nb.age+Nc.age;
strcpy(Na.address,”Zhongshanroad”);
scanf(“%s”,N);gets(N);
Nc=Na;
//C允許將一個(gè)結(jié)構(gòu)變量直接賦值給另一個(gè)具有相同結(jié)構(gòu)的結(jié)構(gòu)變量
注:若成員本身又是結(jié)構(gòu)體類(lèi)型,則要用若干成員運(yùn)算符一級(jí)級(jí)引用下去,直到最低的一級(jí)成員。例:
Na.achie.math=86.0;
scanf(“%f”,&Nc.achie.chinese);結(jié)構(gòu)變量的初始化:(定義時(shí)賦初值,方法類(lèi)似于數(shù)組初始化)例:structstudentNa={1001,”Zhangsan”,’M’,19,”Zhongshanroad”,78.0,67,90};【例8.1】對(duì)結(jié)構(gòu)變量進(jìn)行初始化,并輸出各成員值。#include<stdio.h>structscore{floatchinese;floatmath;floatenglish;};structstudent{
intnumber;charname[9];charsex;
intage;charaddress[30];
structscoreachie;};main(){structstudentNa={10001,"wanli",'M',19,"zhongshanroad",78.0,67.0,90.0};
structstudentNb={10002,"lifang",'F',18,"huajinroad",80.0,77.0,86.0};
structstudentNc={10003,"huhai
li",'F',20,"beijinroad",58.0,68.0,93.0};printf("%d,%s,%c,%d,%s,%.1f,%.1f,%.1f\n",Na.number,N,Na.sex,
Na.age,Na.address,Na.achie.chinese,Na.achie.math,Na.achie.english);printf("%d,%s,%c,%d,%s,%.1f,%.1f,%.1f\n",Nb.number,N,Nb.sex,
Nb.age,Nb.address,Nb.achie.chinese,Nb.achie.math,Nb.achie.english);printf("%d,%s,%c,%d,%s,%.1f,%.1f,%.1f\n",Nc.number,N,Nc.sex,
Nc.age,Nc.address,Nc.achie.chinese,Nc.achie.math,Nc.achie.english);}8.3結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組:每個(gè)數(shù)字元素都是一個(gè)結(jié)構(gòu)體類(lèi)型的數(shù)據(jù)1.定義結(jié)構(gòu)體數(shù)組(類(lèi)似于結(jié)構(gòu)體變量的定義)三種方法:(1)先定義結(jié)構(gòu)體類(lèi)型,再定義結(jié)構(gòu)體類(lèi)型數(shù)組
struct
類(lèi)型名數(shù)組名[常量表達(dá)式];
例:structstudentstu[45];(2)定義結(jié)構(gòu)體類(lèi)型同時(shí)定義該結(jié)構(gòu)體類(lèi)型數(shù)組例:structstudent{intnumber;……}stu[45];(3)
直接定義無(wú)結(jié)構(gòu)名的結(jié)構(gòu)體類(lèi)型變量(少用)
例:struct
{intnumber;……}stu[45];2.結(jié)構(gòu)體數(shù)組的初始化可將初值寫(xiě)在一對(duì)大括號(hào):structstudentstu[]={…};也可采用分行初始化:structstudentstu[]={{…},{…},{…}};可以對(duì)數(shù)組全部或部分的元素賦初值例:structstudent{charname[20];longnumber;floatscore[4];};structstudentstu[4]={{“l(fā)iping”,1,67,72,65},{“zhaoming”,2,77,73,80}.{…},{…}};
例:對(duì)候選人得票的統(tǒng)計(jì)程序。設(shè)有3個(gè)候選人,每次輸入一個(gè)得票的候選人的名字,要求最后輸出各人得票結(jié)果。#include<string.h>structperson{charname[20];
intcount;
}leader[3]={"Li",0,"Zhang",0,"Fun",0};main(){int
i,j;
char
leader-name[20];
for(i=1;i<=10;i++){scanf("%s",leader-name);
for(j=0;j<3;j++)
if(strcmp(leader-name,leader[j].name)==0)leader[j].count++;}
printf("\n");
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);}
輸入:LiLiFunZhangZhangFunLiFunZhangLi結(jié)果:Li∶4Zhang∶3Fun∶3例:計(jì)算學(xué)生的平均成績(jī)和不及格的人數(shù)struct
stu{intnum;char*name;charsex;floatscore;};main(){
student[5]={{101,”liping”,’m’,45},{102,”zhangping”,’m’,62.5},{103,”hefang”,’f’,92.5},{104,”chengling”,’f’,87},{105,”wangming”,’m’,58}}
inti,c=0;floatave,s=0;
for(i=0;i<5;i++){s+=
;if(
<60)c++}
ave=s/5;
printf(“average=%f\ncount=%d”,ave,c);}struct
stustudent[i].scorestudent[i].score【例8.2】設(shè)某組有4個(gè)人,填寫(xiě)如下的登記表,除姓名、學(xué)號(hào)外,還有三科成績(jī),編程實(shí)現(xiàn)對(duì)表格的計(jì)算,求解出每個(gè)人的三科平均成績(jī),求出四個(gè)學(xué)生的單科平均,并按平均成績(jī)由高分到低分輸出。#include<stdio.h>struct
stu{charname[20];longnumber;floatscore[4];};voidout_row(struct
stu
arr[],intn){floatrow[4]={0,0,0,0};
int
i,j;
for(i=0;i<4;i++){for(j=0;j<n;j++)
row[i]=row[i]+arr[j].score[i];
row[i]=row[i]/n;}printf("|%19c|",'');
for(i=0;i<4;i++)printf("%7.2f|",row[i]);
printf("\n----------------------------\n");}voidorder(struct
stu
arr[],intn){struct
stutemp;
int
i,j,x,y;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)if(arr[j].score[3]>arr[j+1].score[3]){temp=arr[j];
arr[j]=arr[j+1];arr[j+1]=temp;}}voidoutput(struct
stu
arr[],intn){
int
i,j;
printf("***********************TABLE************************\n");
printf("----------------------------------------------------\n");printf("|%10s|%8s|%7s|%7s|%7s|%7s|\n","Name","Number","English","mathema","physics","average");
printf("----------------------------------------------------\n");
for(i=0;i<n;i++){printf("|%10s|%8ld|",arr[i].name,arr[i].number);
for(j=0;j<4;j++)printf("%7.2f|",arr[i].score[j]);
printf("\n");
printf("---------------------------------------------------\n");}}voidaver(struct
stu
arr[
],intn){int
i,j;
for(i=0;i<n;i++){arr[i].score[3]=0;
for(j=0;j<3;j++)arr[i].score[3]+=arr[i].score[j];arr[i].score[3]/=3;}}main(){struct
stustud[4]={{"liping",1,67.0,72.0,65.0},{"yaoming",2,77.0,73.0,80.0},{"liudong",3,81.0,79.0,90.0},{"zhangwei",4,68.0,78.0,89.0}};floatrow[3];//去掉aver(stud,4)order(stud,4);output(stud,4);out_row(stud,4);}8.4結(jié)構(gòu)體指針變量結(jié)構(gòu)體變量的指針:結(jié)構(gòu)體變量所占內(nèi)存段的起始地址結(jié)構(gòu)體指針變量:存放結(jié)構(gòu)體變量的首地址----指向結(jié)構(gòu)體變量也可指向結(jié)構(gòu)體數(shù)組中的元素
8.4.1結(jié)構(gòu)體指針變量的說(shuō)明和使用1、定義:struct
結(jié)構(gòu)體類(lèi)型名*結(jié)構(gòu)體指針變量名;
3種定義方法:例:①structstudent*p1,*p2;
②
structstudent{intnumber;……}*p1,*p2;③
struct
{intnumber;……}*p1,*p2;
2、賦值例:structstudent{intnumber;charname[9];charsex;
intage;charaddress[30];
structscoreachie;}Ny,stu[4],*p1,*p2;p1=&Ny;p2=stu;或p2=&stu[0];問(wèn):p1=&Ny.number?p1=(structstudent*)&Ny.number3、引用兩種方式:①
(*結(jié)構(gòu)體指針變量名).成員項(xiàng)名例:(*p1).age=19;即Ny.age=19;
(*p2).number=1001;即stu[0].number=1001;②結(jié)構(gòu)體指針變量->成員項(xiàng)名例:p1->age=19;p2->number=1001;【例8.3】指向結(jié)構(gòu)體變量的指針變量的使用。#include<stdio.h>voidmain(){structtest{int
i,j;charm,n;};
structtesta,b;
structtest*pa,*pb;pa=&a;
pb=&b;pa->i=pa->j=10;pa->m=pa->n='H';
printf("%d,%d,%c,%c\n",pa->i,pa->j,pa->m,pa->n);b=a;
printf("%d,%d,%c,%c\n",pb->i,pb->j,pb->m,pb->n);
printf("%d,%d,%c,%c\n",++pa->i,pa->j--,--pa->m,pa->n++);
printf("%d,%d,%c,%c\n",pb->i,pb->j,pb->m,pb->n);
pb=pa;
printf("%d,%d,%c,%c\n",++pa->i,pa->j--,--pa->m,pa->n++);
printf("%d,%d,%c,%c\n",pb->i,pb->j,pb->m,pb->n);}8.4.2結(jié)構(gòu)體數(shù)組指針變量結(jié)構(gòu)體數(shù)組名:結(jié)構(gòu)體數(shù)組所占內(nèi)存段的起址
指針變量
(可通過(guò)它使用數(shù)組元素)例:structstudentstu[4],*p;p=stu;即p=&stu[0];//指針p就指向了結(jié)構(gòu)體數(shù)組stu對(duì)數(shù)組元素的引用可采用三種方法:1、地址法:&stu[i]stu+i
p+istu[i].name(stu+i)->name(p+i)->name2、指針?lè)╬=stu;使用p->name等p++3、指針的數(shù)組表示法p=stu;p[i]stu[i]則p[i].name
stu[i].name
【例8.4】指向結(jié)構(gòu)體數(shù)組的指針變量的使用#include<stdio.h>structdata{intyear,month,day;};struct
stu{charname[20];longnum;
structdatabirthday;};voidmain(){inti;
struct
stu*p;
struct
stustudent[4]={{"zhouping",1,1983,7,2},{"wangling",2,1984,3,24},{"hubo",3,1982,5,16},{"huaqiang",4,1982,7,21}};p=student;printf("\n1----Outputname,number,year,month,day\n");
for(i=0;i<4;i++)printf("%16s%7ld%8d/%d/%d\n",(p+i)->name,(p+i)->num,
(p+i)->birthday.year,(p+i)->birthday.month,(p+i)->birthday.day);printf("\n2----Outputname,number,year,month,day\n");
for(i=0;i<4;i++,p++)printf("%16s%7ld%8d/%d/%d\n",p->name,p->num,
p->birthday.year,p->birthday.month,p->birthday.day);printf("\n3-----Outputname,number,year,month,day\n");
for(i=0;i<4;i++)printf("%16s%7ld%8d/%d/%d\n",(student+i)->name,(student+i)->num,
(student+i)->birthday.year,(student+i)->birthday.month,(student+i)->birthday.day);p=student;printf("\n4-----Outputname,number,year,month,day\n");
for(i=0;i<4;i++)printf("%16s%7ld%8d/%d/%d\n",p[i].name,p[i].num,
p[i].birthday.year,p[i].birthday.month,p[i].birthday.day);}8.4.3結(jié)構(gòu)體指針變量作函數(shù)參數(shù)
實(shí)參形參
值傳遞結(jié)構(gòu)體變量同類(lèi)型變量的定義
&結(jié)構(gòu)體變量地址傳遞結(jié)構(gòu)體指針變量同類(lèi)型結(jié)構(gòu)體指針變量的定義結(jié)構(gòu)體數(shù)組名例:structstudenta,stu[4],*p
p=&a;p=stu;實(shí)參:ap/&ap/stu
值拷貝地址傳遞形參:structstudentbstructstudent*ptr【例8.5】將例8.2改用結(jié)構(gòu)體指針變量作函數(shù)參數(shù)實(shí)現(xiàn)。#include<stdio.h>struct
stu{charname[20];longnumber;floatscore[4];};voidaver(struct
stu*ptr,intn){int
i,j;
for(i=0;i<n;i++){(ptr+i)->score[3]=0;
for(j=0;j<3;j++)(ptr+i)->score[3]+=(ptr+i)->score[j];(ptr+i)->score[3]/=3;}}voidorder(struct
stu*ptr,intn){struct
stutemp;
int
i,j,x,y;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)if((ptr+j)->score[3]>(ptr+j+1)->score[3]){temp=*(ptr+j);*(ptr+j)=*(ptr+j+1);*(ptr+j+1)=temp;}}voidoutput(struct
stu*ptr,intn){int
i,j;
printf("*******************TABLE***********************\n");
printf("----------------------------------------------------\n");printf("|%10s|%8s|%7s|%7s|%7s|%7s|\n","Name","Number","English","mathema","physics","average");
printf("----------------------------------------------------\n"
for(i=0;i<n;i++){printf("|%10s|%8ld|",(ptr+i)->name,(ptr+i)->number);
for(j=0;j<4;j++)printf("%7.2f|",(ptr+i)->score[j]);
printf("\n");
printf("---------------------------------------------------\n");}}voidout_row(struct
stu*ptr,intn){floatrow[4]={0,0,0,0};
int
i,j;
for(i=0;i<4;i++){for(j=0;j<n;j++)
row[i]=row[i]+(ptr+j)->score[i];
row[i]=row[i]/n;}printf("|%19c|",'');
for(i=0;i<4;i++)
printf("%7.2f|",row[i]);
printf("\n----------------------------------------------------\n");}main(){struct
stustud[4]={{"liping",1,67.0,72.0,65.0},{"yaoming",2,77.0,73.0,80.0},{"liudong",3,81.0,79.0,90.0},{"zhangwei",4,68.0,78.0,89.0}};aver(stud,4);order(stud,4);output(stud,4);out_row(stud,4);}8.5鏈表8.5.1
鏈表的概述存儲(chǔ)一批同類(lèi)型但個(gè)數(shù)不確定的數(shù)據(jù):①數(shù)組:靜態(tài)分配內(nèi)存方式即使用前需說(shuō)明數(shù)組大小,所占內(nèi)存空間連續(xù)需定義足夠大-------浪費(fèi)內(nèi)存②
鏈表:動(dòng)態(tài)分配內(nèi)存的方式允許用戶(hù)根據(jù)需要隨時(shí)增減數(shù)據(jù)項(xiàng)數(shù)據(jù)項(xiàng)在內(nèi)存中不必連續(xù)鏈表:結(jié)點(diǎn):①數(shù)據(jù)域:存放用戶(hù)需要的實(shí)際數(shù)據(jù)②指針域:存放下一個(gè)結(jié)點(diǎn)的地址
頭指針:存放表中第一個(gè)結(jié)點(diǎn)的地址單鏈表示意圖頭指針head:指向鏈表中第一個(gè)結(jié)點(diǎn)鏈表的尾節(jié)點(diǎn):由于無(wú)后續(xù)節(jié)點(diǎn),其指針域?yàn)榭?,?xiě)作NULL鏈表中的各結(jié)點(diǎn)在內(nèi)存的存儲(chǔ)地址不是連續(xù)結(jié)點(diǎn)類(lèi)型的定義:structnode{intnum;floatscore;
structnode*next;};1.malloc函數(shù)函數(shù)的原型聲明為:void*malloc(unsigned
size);函數(shù)的功能:分配大小為size(最大65535)個(gè)字節(jié)的內(nèi)存單元,成功返回所分配內(nèi)存單元的首地址(void類(lèi)型地址)失敗時(shí),則返回NULL(空)例:structnode*p1,*p2,*p3,*head,*p;p1=(structnode*)malloc(sizeof(structnode));p1->num=1;p1->score=67;p2……p3……p1->next=p2;p2->next=p3;p3->next=NULL;head=p1;p=headwhile(p!=NULL){printf(“%d:%f\n”,p->num,p->score);p=p->next;}2.calloc函數(shù)函數(shù)的原型聲明:void*calloc(unsigned
n,unsignedsize);函數(shù)的功能:分配n個(gè)size大小的連續(xù)內(nèi)存單元成功返回所分配內(nèi)存單元的首地址(void類(lèi)型地址)失敗,返回NULL。例:為有10個(gè)的浮點(diǎn)型數(shù)據(jù)分配內(nèi)存:float*p;…p=(float*)calloc(10,sizeof(float));3.free函數(shù)函數(shù)的原型聲明為:voidfree(void*ptr);函數(shù)的功能:釋放ptr指向的由calloc
或malloc分配的內(nèi)存空間函數(shù)無(wú)返回值釋放后的空間可以再次被使用例:free(p);對(duì)鏈表的操作主要有以下幾種:(1)建立并初始化鏈表:從無(wú)到有地建立起一個(gè)鏈表,即往空鏈表中依次插入若干結(jié)點(diǎn),并保持結(jié)點(diǎn)之間的前驅(qū)和后繼關(guān)系。(2)索引操作:按給定的結(jié)點(diǎn)索引號(hào)或檢索條件,查找某個(gè)結(jié)點(diǎn)。如果找到指定的結(jié)點(diǎn),則稱(chēng)為檢索成功;否則,稱(chēng)為檢索失敗。(3)插入操作:在結(jié)點(diǎn)ki-1與ki之間插入一個(gè)新的結(jié)點(diǎn)k’,使線(xiàn)性表的長(zhǎng)度增1,且ki-1與ki的邏輯關(guān)系發(fā)生如下變化:插入前,ki-1是ki的前驅(qū),ki是ki-1的后繼;插入后,新插入的結(jié)點(diǎn)k’成為ki-1的后繼、ki的前驅(qū),如圖8-3所示。(4)刪除操作:刪除結(jié)點(diǎn)ki,使線(xiàn)性表的長(zhǎng)度減1,且ki-1、ki和ki+1之間的邏輯關(guān)系發(fā)生如下變化:刪除前,ki是ki+1的前驅(qū)、ki-1的后繼;刪除后,ki-1成為ki+1的前驅(qū),ki+1成為ki-1的后繼,如圖8-4所示。8.5.2創(chuàng)建并輸出單鏈表【例8.6】創(chuàng)建一個(gè)存放整數(shù)(輸入-999做結(jié)束標(biāo)志)的單鏈表,并打印輸出。#include<stdlib.h>#include<stdio.h>structnode{ intnum;
structnode*next;};voidmain(){ structnode*create(); voidprint();
structnode*head; head=NULL; head=create(head); print(head);}structnode*create(structnode*head{ structnode*p1,*p2; p1=p2=(structnode*)malloc(sizeof(structnode)); scanf("%d",&p1->num); p1->next=NULL; while(p1->num!=-999) { if(head==NULL)head=p1; elsep2->next=p1; p2=p1; p1=(structnode*)malloc(sizeof(structnode)); scanf("%d",&p1->num);
p1->next=NULL; } returnhead;}voidprint(structnode*head){ structnode*temp; temp=head;
while(temp!=NULL) { printf("%6d",temp->num); temp=temp->next; }}
8.5.3單鏈表的刪除和插入【例8.7】創(chuàng)建包含學(xué)號(hào)、姓名結(jié)點(diǎn)的單鏈表。其結(jié)點(diǎn)數(shù)任意個(gè),表以學(xué)號(hào)為序,低學(xué)號(hào)的在前,高學(xué)號(hào)的在后,以輸入姓名為空作結(jié)束。在此鏈表中,要求刪除一個(gè)給定姓名的結(jié)點(diǎn),并插入一個(gè)給定學(xué)號(hào)和姓名的結(jié)點(diǎn)。#include"stdlib.h"#include"malloc.h"structnode{ intnum; charstr[20];
structnode*next;};voidmain(){ structnode*create();
structnode*insert();
structnode*delet(); voidprint();
structnode*head; charstr[20];
intn; head=NULL; head=create(head);
print(head);
printf("\ninputinsertednum,name:\n");
gets(str); n=atoi(str);
gets(str); head=insert(head,str,n);
print(head);
printf("\ninputdeletedname:\n");
gets(str); head=delet(head,str);
print(head); }structnode*create(structnode*head){ chartemp[30];
structnode*p1,*p2; p1=p2=(structnode*)malloc(sizeof(structnode));
printf("input
num,name:\n");
printf("exit:doubletimesEnter!\n");
gets(temp); gets(p1->str); p1->num=atoi(temp); p1->next=NULL; while(strlen(p1->str)>0){ if(head==NULL)head=p1; elsep2->next=p1; p2=p1; p1=(structnode*)malloc(sizeof(structnode));
printf("input
num,name:\n");
printf("exit:doubletimesEnter!\n");
gets(temp); gets(p1->str); p1->num=atoi(temp); p1->next=NULL; } returnhead;}structnode*insert(structnode*head,char*pstr,intn){ structnode*p1,*p2,*p3; p1=(structnode*)malloc(sizeof(structnode)); strcpy(p1->str,pstr); p1->num=n; p2=head; if(head==NULL) {head=p1;p1->next=NULL;}else {while(n>p2->num&&p2->next!=NULL) {p3=p2;p2=p2->next;} if(n<=p2->num) if(head==p2) {head=p1;p1->next=p2;} else {p3->next=p1;p1->next=p2;}else {p2->next=p1;p1->next=NULL;} }
return(head);}structnode*delet(structnode*head,char*pstr){ structnode*temp,*p; temp=head; if(head==NULL)
printf("\nListisnull!\n"); else { temp=head;
while(strcmp(temp->str,pstr)!=0&&temp->next!=NULL)
{p=temp;temp=temp->next;}
if(strcmp(temp->str,pstr)==0) {if(temp==head){head=head->next;free(temp);}else{p->next=temp->next;
printf("delete
string:%s\n",temp->str);
free(temp);} } elseprintf("\nnofindstring!\n"); }
return(head);}voidprint(structnode*head){ structnode*temp; temp=head;
printf("\noutputstrings:\n");
while(temp!=NULL){ printf("\n%d----%s\n",temp->num,temp->str); temp=temp->next; }}8.6共用體、枚舉和用戶(hù)自定義類(lèi)型8.6.1共用體類(lèi)型共用體:不同數(shù)據(jù)類(lèi)型的變量(成員)共占同一段內(nèi)存1、定義類(lèi)型形式:union共用體名
{類(lèi)型成員1;類(lèi)型成員2;
…
類(lèi)型成員n;
};例:unionshare{inti;charc;floatf;};2、定義變量三種方式:①
unionsharev1,v2,v3;②
unionshare{inti;charc;floatf;}v1,v2,v3;③union{inti;charc;floatf;}v1,v2,v3;系統(tǒng)為v1、v2、v3各分配多少字節(jié)?注:①結(jié)構(gòu)體變量所占字節(jié)數(shù)為各成員所占字節(jié)數(shù)之和②共用體變量所占字節(jié)數(shù)則是各成員中的最大長(zhǎng)度也可以定義指向共用體變量的指針變量例:unionshare*p;
p=&v1;3、共用體變量的引用引用共用體變量成員的方式:①共用體變量名.成員名:v1.f②共用體指針名->成員名:p->f或(*p).f注意:①共用體變量中起作用的成員是最后一次存放的成員值例:v1.i=3;v1.c=‘a(chǎn)’;②共用體變量的地址和它的各成員的地址都是同一地址
p1=&v1等價(jià)于
p1=(unionshare*)&v1.iv1.cv1.f③不能對(duì)共用體變量賦值,也不能通過(guò)引用共用體變量名來(lái)得到其成員的值,也不能在定義共用體變量時(shí)對(duì)它進(jìn)行初始化。④不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)返回共用體變量,但可以使用指向共用體變量的指針。【例8.8】上機(jī)運(yùn)行該程序,并請(qǐng)分析得到的結(jié)果。
#include<stdio.h>unionshare{inti;
intj;floatf;}sh;voidmain(){sh.f=10.5;
sh.i=20;
sh.j=30;printf("%.1f,%d,%d\n",sh.f,sh.i,sh.j);
sh.f=1387.5;
sh.j=30;
sh.i=20;printf("%d,%d,%.1f\n",sh.i,sh.j,sh.f);
sh.j=200;
sh.i=20;
sh.f=1357.5;printf("%d,%d,%.1f\n",sh.i,sh.j,sh.f);}8.6.2枚舉類(lèi)型若變量只有幾個(gè)可能的值-----可定義為枚舉類(lèi)型例:一個(gè)星期內(nèi)有7天,一年有12月枚舉:將變量的值一一列舉出來(lái)變量的值僅限于列舉出來(lái)的值的范圍內(nèi)------枚舉變量枚舉類(lèi)型仍是一種基本數(shù)據(jù)類(lèi)型1、定義枚舉類(lèi)型形式:enum
枚舉類(lèi)型名{枚舉元素列表};例:enumweek{Sun,Mon,Tue,Wed,Thu,Fri,Sat};
2、定義枚舉類(lèi)型變量的方法①先定義類(lèi)型,再定義變量例:enumweekfirst,second;
②定義類(lèi)型同時(shí)定義變量例:enum
week{Sun,Mon,Tue,Wed,Thu,Fri,Sat}first,second;
③定義類(lèi)型省掉類(lèi)型名同時(shí)定義變量(少用)
例:enum{Sun,Mon,Tue,Wed,Thu,Fri,Sat}first,second;常量,值不可變枚舉變量的使用同普通變量,但其值只能是枚舉常量例:first,second是二個(gè)enumweek類(lèi)型的枚舉變量,其值只能取sun---sat之一first=Wed;second=Fri;3、說(shuō)明①C編譯時(shí),對(duì)枚舉元素按常量處理-----枚舉常量(值不可改變)系統(tǒng)給枚舉常量按定義時(shí)的順序編號(hào):由0開(kāi)始,從小到大自動(dòng)取0~n-1整數(shù)值例:enumweek{Sun,Mon,Tue,Wed,Thu,Fri,Sat};
Sun是0,Mon是1,…Sat是6;也可在定義枚舉元素表時(shí),指定各某些枚舉元素的序號(hào),其后元素的值將按順序自動(dòng)加一遞增。例:enumweek{Sun=1,Mon,Tue,Wed=8,Thu,Fri,Sat};Sun是1,Mon是2,Tue是3,
Wed是8,Thu是9,F(xiàn)ri是10,Sat是11。若first=Wed;則first的值為8可用printf(“%d”,first);可不可直接first=8?②不能把一個(gè)整數(shù)直接賦給枚舉變量例:first=Wed;√first=8;×
如果要用整型值賦必須通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換:
first=(enumweek)8;√③枚舉元素可用來(lái)判斷比較比較的規(guī)則:按其在定義時(shí)的順序號(hào)比較大小
例:if(first==Sat)printf(“雙休日到了\n”);first>=second枚舉變量可進(jìn)行算術(shù)運(yùn)算例:first++;first的值為T(mén)ue(在順序號(hào)上加減)④枚舉元素是常量,不是變量。不能在程序中用賦值語(yǔ)句再對(duì)它賦值。例:Mon=2;×【例8.9】口袋中有紅、黃、藍(lán)、白、黑5種顏色的球若干個(gè)。每次從口袋中取出3個(gè)球,問(wèn)得到3種不同色的球的可能取法,打印出每種組合的3種顏色。#include<stdio.h>voidmain(){enumcolor{red,yellow,blue,white,black}x,y,z,p;
intcount=0,i;
for(x=red;x<=black;x++)
for(y=red;y<=black;y++)
if(x!=y){for(z=red;z<=black;z++)
if(z!=x&&z!=y) {count++; printf("No.%-4d",count);
for(i=1;i<=3;i++) {switch(i) {case1:p=x;break; case2:p=y;break; case3:p=z;break; }
switch(p){casered:printf("%-10s","red");break; caseyellow:printf("%-10s","yellow");break; caseblue:printf("%-10s","blue");break; casewhite:printf("%-10s","white");break; caseblack:printf("%-10s","black");break; }}
printf("\n"); }}printf("\ntotal:%5d\n",count);}8.6.3用戶(hù)自定義類(lèi)型
在說(shuō)明數(shù)據(jù)的類(lèi)型時(shí),可以使用基本類(lèi)型、構(gòu)造類(lèi)型、指針類(lèi)型和空類(lèi)型等。但在用結(jié)構(gòu)體、共用體、枚舉類(lèi)型等定義變量時(shí)比較麻煩。C語(yǔ)言:允許用戶(hù)自己定義類(lèi)型說(shuō)明符即允許由用戶(hù)為系統(tǒng)原有的數(shù)據(jù)類(lèi)型換名字通過(guò)typedef給已經(jīng)存在的系統(tǒng)類(lèi)型或用戶(hù)構(gòu)造的類(lèi)型重新命名1、格式:typedef
原類(lèi)型名用戶(hù)自定義類(lèi)型名;例:①typedef
intINTEGER; INTEGERi,j=100; 等價(jià)于:inti,j=100②typedef
structstudentSTUDENT;STUDENTna,nb;等價(jià)于:structstudentna,nb;③typedeffloatARRAY[10]; ARRAYa,b; 等價(jià)于:floata[10],b[10];2、定義新類(lèi)型名的方法①
先按定義變量的方法寫(xiě)出定義體②
將變量名換成新類(lèi)型名③在最前面加typedef④用新類(lèi)型名定義變量定義一個(gè)字符指針類(lèi)型:①
char*s;②char*STRING;③Typedefchar*STRING;④STRING
str; 等價(jià)于:char*str;說(shuō)明:①
typedef只可定義類(lèi)型名,不可定義變量②typedef只是給已存在的類(lèi)型增加一類(lèi)型名,而沒(méi)有創(chuàng)造新類(lèi)型③
typedef與#define
相似:typedef
intCOUNT;#define
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度四川省公共營(yíng)養(yǎng)師之二級(jí)營(yíng)養(yǎng)師提升訓(xùn)練試卷A卷附答案
- 2025年中國(guó)膠棉拖把行業(yè)發(fā)展監(jiān)測(cè)及投資策略研究報(bào)告
- 2024年鈮項(xiàng)目投資分析及可行性報(bào)告
- 2024年固廢污染治理項(xiàng)目可行性分析報(bào)告
- 中國(guó)石化智能倉(cāng)儲(chǔ)市場(chǎng)前瞻與投資戰(zhàn)略規(guī)劃分析報(bào)告
- 廢氣焚燒裝置項(xiàng)目商業(yè)計(jì)劃書(shū)
- 豆油碟行業(yè)市場(chǎng)發(fā)展及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 山東軸承、齒輪、傳動(dòng)和驅(qū)動(dòng)部件的制造市場(chǎng)前景及投資研究報(bào)告
- 湖南某年產(chǎn)20萬(wàn)噸功能性生態(tài)肥項(xiàng)目可行性研究報(bào)告
- 傳媒行業(yè)發(fā)展前景預(yù)測(cè)及投資戰(zhàn)略研究報(bào)告
- 2025年包鋼集團(tuán)公司招聘筆試參考題庫(kù)含答案解析
- 2024國(guó)有企業(yè)與私營(yíng)企業(yè)之間的混合所有制改革合作協(xié)議
- 2024年廣西廣播電視技術(shù)中心招聘歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- [QC成果]提高剪力墻施工質(zhì)量一次合格率
- 8站小車(chē)呼叫的plc控制
- _ 基本粒子與宏觀物體內(nèi)在聯(lián)系
- 象棋比賽積分編排表
- 小學(xué)贛美版六年級(jí)美術(shù)上冊(cè)第二十課向往和平課件(16張)ppt課件
- DPP4抑制劑比較篇PPT課件
- 中藥飲片購(gòu)進(jìn)驗(yàn)收記錄表格模板
- TCM遠(yuǎn)紅外發(fā)展初析
評(píng)論
0/150
提交評(píng)論