




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第12章自定義數(shù)據(jù)類型程序設(shè)計(jì)語言主要內(nèi)容結(jié)構(gòu)體類型與變量結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體與函數(shù)鏈表在程序里表示一個人(姓名、年齡、性別、成績),怎么表示?想表示多個人呢?如何用計(jì)算機(jī)程序?qū)崿F(xiàn)下述表格的管理?思考I.使用數(shù)組MaryJohnPeterRoseKateFMFMF01020304058978.56797.564解決方案:scorenumsexname不能建立數(shù)組間的關(guān)系II.使用多維數(shù)組MaryJohnPeterRoseKateFMFMF01020304058978.56797.564C語言不允許一個數(shù)組包含多種數(shù)據(jù)類型III.使用結(jié)構(gòu)體numnamesexscoreC語言引入了稱為結(jié)構(gòu)體的數(shù)據(jù)存儲方式“結(jié)構(gòu)體”是一種構(gòu)造數(shù)據(jù)類型,它是由若干數(shù)據(jù)項(xiàng)組合而成的復(fù)雜數(shù)據(jù)對象,這些數(shù)據(jù)項(xiàng)稱為結(jié)構(gòu)體的成員。結(jié)構(gòu)體簡介
structstructurename{ datatypevariable1; datatypevariable2; ...};結(jié)構(gòu)體成員{};結(jié)構(gòu)體名structstudentintnum;charname[20];charsex;定義結(jié)構(gòu)體floatscore;C語言中的有效數(shù)據(jù)類型結(jié)構(gòu)體類型定義1structstudent{intnum;charname[20];charsex;floatscore;};numnamesexstudent結(jié)構(gòu)體定義并不預(yù)留內(nèi)存結(jié)構(gòu)體定義放置在程序的開始部分,位于頭文件聲明之后score結(jié)構(gòu)體類型定義2聲明結(jié)構(gòu)體變量structstudent{intnum;charname[20];charsex;floatscore;};structstudentstudent1,student2;I.先定義結(jié)構(gòu)體類型,再聲明結(jié)構(gòu)體變量structstudent{intnum;charname[20];charsex;floatscore;}student1,student2;II.在定義結(jié)構(gòu)體類型的同時聲明結(jié)構(gòu)體變量struct{intnum;charname[20];charsex;floatscore;}student1,student2;III.直接聲明結(jié)構(gòu)體變量聲明一個類型為student結(jié)構(gòu)體的變量,將會為該變量分配內(nèi)存,大小等于其所有成員變量的大小之和。
定義結(jié)構(gòu)體變量structdate{intmonth;intday;intyear;};struct{intnum;charname[20];charsex;
structdatebirthday;floatscore;}student1,student2;嵌套結(jié)構(gòu)體類型定義用typedef定義數(shù)據(jù)類型則structstudents1;與STUs1;具有相同的作用。typedefstructstudent{intnum;charname[20];charsex;
structdatebirthday;floatscore;}STU;內(nèi)存student3structstudentstudent3={3,"YaoMing",'M',90.5};
3YaoMingM賦值的順序應(yīng)與成員聲明時的順序一樣;允許初始化語句中的值的數(shù)目比結(jié)構(gòu)體成員數(shù)目少。student3.numstudent3.sex90.5student3.score結(jié)構(gòu)體變量的初始化student1student1.num=1;scanf("%s",);student1.sex='M';printf("請輸入成績:\n");scanf("%f",&student1.score);1ZhangZiLiangM用輸入語句或賦值語句來給結(jié)構(gòu)體變量的各個成員賦值7878student2=student1;student21ZhangZiLiangM78strcpy(,"ZhangSan");結(jié)構(gòu)體變量的引用如果要將“zhang”改為“zhong”,只要將結(jié)構(gòu)變量student1中的數(shù)組成員name下標(biāo)為2的元素‘a(chǎn)’改為‘o’即可。
可以使用下列語句:
[2]='o';/*為結(jié)構(gòu)變量中的數(shù)組成員的一個元素賦值*/結(jié)構(gòu)體變量的引用structstudent{intnum;charname[20];charsex;floatscore;}student1;對結(jié)構(gòu)變量的整體操作 要對結(jié)構(gòu)體進(jìn)行整體操作有很多限制,C語言中能夠?qū)Y(jié)構(gòu)進(jìn)行整體操作的運(yùn)算不多,只有賦值“=”操作。例如:structdatesunday,today;
sunday=today; /*結(jié)構(gòu)變量整體賦值*/結(jié)構(gòu)體變量的引用不能將一個結(jié)構(gòu)變量作為一個整體直接訪問。
例如,不能這樣引用:printf("%s,%c,%d,%d,%d\n",student1);如果成員本身又是一個結(jié)構(gòu)類型,則要用若干個成員運(yùn)算符,一級一級地找到最低的一級的成員。例如,對上面定義的結(jié)構(gòu)變量student1,可以這樣訪問各個成員:
student1.sex student1.birthday.month student1.birthday.day student1.birthday.year結(jié)構(gòu)體變量的引用struct{intnum;charname[20];charsex;
structdatebirthday;floatscore;}student1,student2;問題描述:根據(jù)學(xué)員的成績,輸出不及格學(xué)員的詳細(xì)信息。
#include<stdio.h>structstudent{ intnum;//學(xué)號
charname[10];//姓名 charsex;//性別 floatscore;//成績};intmain(){structstudentstu1={1,“張亞鵬",'M',61};structstudentstu2={2,"周晶晶",'F',92.5};structstudentstu3={3,"姚光明",'M',59};printf("不及格學(xué)員的名單如下:\n");if(stu1.score<60)printf("%d\t%s\t%c\t%5.2f\n",stu1.num,,stu1.sex,stu1.score);if(stu2.score<60)printf("%d\t%s\t%c\t%5.2f\n",stu2.num,,stu2.sex,stu2.score);if(stu3.score<60)printf("%d\t%s\t%c\t%5.2f\n",stu3.num,,stu3.sex,stu3.score);if(stu1.score>=60&&stu2.score>=60&&stu3.score>=60)printf("沒有不及格的學(xué)員。\n");return0;}不及格學(xué)員的名單如下:3姚光明M59.00stu11張亞鵬M78stu22周晶晶F92stu33姚光明M59使用結(jié)構(gòu)體示例structstudent
stu,*pstu;*pstu=&stu;(*pstu).num
或者:pstu->num一個指針當(dāng)用來指向一個結(jié)構(gòu)體時,稱之為結(jié)構(gòu)體指針變量。結(jié)構(gòu)體指針變量中的值是所指向的結(jié)構(gòu)體變量的首地址。結(jié)構(gòu)體指針變量聲明的一般形式為:
struct結(jié)構(gòu)體名*結(jié)構(gòu)體指針變量名通過結(jié)構(gòu)體指針可以訪問該結(jié)構(gòu)體變量的成員,一般形式為:
(*結(jié)構(gòu)體指針變量).成員名或者結(jié)構(gòu)體指針變量->成員名
結(jié)構(gòu)體指針變量#include<stdio.h>structstudent{ intnum; char*name; charsex; floatscore;}stu={1,"張賓",'F',55},*pstu;intmain(){pstu=&stu;printf("學(xué)號:%d姓名:%s\n",stu.num,);printf("性別:%c成績:%5.2f\n\n",stu.sex,stu.score);printf("學(xué)號:%d姓名:%s\n",(*pstu).num,(*pstu).name);printf("性別:%c成績:%5.2f\n\n",(*pstu).sex,(*pstu).score);printf("學(xué)號:%d姓名:%s\n",pstu->num,pstu->name);printf(“性別:%c成績:%5.2f\n\n",pstu->sex,pstu->score);return0;}學(xué)號:1姓名:張賓性別:F成績:55.00學(xué)號:1姓名:張賓性別:F成績:55.00學(xué)號:1姓名:張賓性別:F成績:55.00Pressanykeytocontinue結(jié)構(gòu)體指針變量主要內(nèi)容結(jié)構(gòu)體類型與變量結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體與函數(shù)鏈表structstudent{intnum;charname[20];charsex;floatscore;}stu[30];元素為結(jié)構(gòu)體類型的數(shù)組稱為結(jié)構(gòu)體數(shù)組。在實(shí)際應(yīng)用中,經(jīng)常用結(jié)構(gòu)體數(shù)組來表示具有相同數(shù)據(jù)結(jié)構(gòu)體的一個群體。例如一個班的學(xué)員檔案,一個公司的職工檔案等。定義了一個結(jié)構(gòu)體數(shù)組stu,共有30個元素,stu[0]~stu[29]。每個數(shù)組元素都具有structstudent的結(jié)構(gòu)體形式。結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組的初始化structstudentstu[3]={{1,"李芳",'F',45},
{2,"于紅",'F',62.5},
{3,"何萬山",'M',92.5},
{4,"程亞麗",'M',87},
{5,"王明",'M',58}};structstudent{intnum;charname[20];charsex;floatscore;}stu[30];結(jié)構(gòu)體數(shù)組示例學(xué)生結(jié)構(gòu)體類型定義如下:找出N個學(xué)生分?jǐn)?shù)最低的學(xué)生,輸出其姓名和成績。輸入:依次輸入每個學(xué)生姓名與成績輸出:分?jǐn)?shù)最低的學(xué)生姓名與成績typedefstruct{charnum[10];ints;}STREC;主要內(nèi)容結(jié)構(gòu)體類型與變量結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體與函數(shù)鏈表可以將結(jié)構(gòu)體作為參數(shù)傳遞給函數(shù),也可以定義返回結(jié)構(gòu)體值的函數(shù)。結(jié)構(gòu)體作為函數(shù)參數(shù)有兩種不同方法:將結(jié)構(gòu)體變量作為參數(shù)值傳遞給函數(shù)。將結(jié)構(gòu)體指針作函數(shù)的參數(shù)。結(jié)構(gòu)體作為函數(shù)參數(shù)結(jié)構(gòu)體變量作參數(shù)【例1】編寫程序,計(jì)算二維平面上兩點(diǎn)p1和p2間的直線距離。輸入:兩點(diǎn)的坐標(biāo)值輸出:兩點(diǎn)的距離輸入樣例:10-10輸出樣例:2.000000結(jié)構(gòu)體變量作參數(shù)#include<stdio.h>#include<math.h>structpoint{doublex,y;}intmain(){structpointp1,p2;
doublee;
scanf(“%lf%lf”,&p1.x,&p1.y);scanf(“%lf%lf”,&p2.x,&p2.y);e=fun(p1,p2);printf(“%lf\n”,e);return0;}doublefun(structpointa, structpointb){doublex,y;
x=a.x
–b.x;
y=a.y–b.y;returnsqrt(x*x+y*y);結(jié)構(gòu)體指針作參數(shù)【例2】修改學(xué)生信息#include<stdio.h>#include<string.h>structstudent{longsno;charname[10];floatscore[3];};voidfun(structstudent
*b)
{
b__1__=10004;
strcpy(b__2__,"LiJie");
}intmain()
{
structstudent
t={10002,"ZhangQi",
{93,85,87}};
int
i;
fun(__3__);
printf("No:%ld
Name: %s\nScores:",t.sno,);
for(i=0;i<3;i++)
printf("%6.2f", t.score[i]);
printf("\n");
return0;
}【例3】學(xué)生信息的排序#include<stdio.h>#include<string.h>structstudent{longsno;charname[10];floatscore[3];};voidfun(structstudent
a[],int
n)
{
__1__t;
int
i,j;
for(i=0;i<__2__;i++)
for(j=i+1;j<n;j++)
if(strcmp(__3__)>0)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}結(jié)構(gòu)體數(shù)組作參數(shù)intmain(){structstudent s[4]={{10001,"ZhangSan",{95,80,88}},
{10002,"LiSi",{85,70,78}},
{10003,"CaoKai",{75,60,88}},
{10004,"FangFang",{90,82,87}}};inti,j;fun(s,4);printf("Thedataaftersorting:\n");for(j=0;j<4;j++){printf("\nNo:%ldName:%-8s
Scores:",s[j].sno,s[j].name);for(i=0;i<3;i++)printf("%6.2f",s[j].score[i]);}printf("\n");return0;}主要內(nèi)容結(jié)構(gòu)體類型與變量結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體與函數(shù)鏈表29鏈表是種常見的重要數(shù)據(jù)結(jié)構(gòu)。
鏈表作用:動態(tài)地進(jìn)行存儲分配,根據(jù)需要開辟內(nèi)存單元。
鏈表結(jié)構(gòu):
1249
head1249A13561356B14751475C10211021DNull鏈表有一個頭指針變量,存放一個地址,指向一個元素(結(jié)點(diǎn))結(jié)點(diǎn):包括兩部分:①用戶需要的實(shí)際數(shù)據(jù)。②下一個結(jié)點(diǎn)的地址。1.鏈表概述30錯誤:
structList{charname[20];List*pN;Listm;};鏈表特點(diǎn):鏈表中各元素在內(nèi)存中可以不是連續(xù)存放,對鏈表中數(shù)據(jù)只能進(jìn)行順序存取。
鏈表實(shí)現(xiàn):利用指針變量實(shí)現(xiàn),即:一個結(jié)點(diǎn)中應(yīng)包括一個指針變量,用它存放下一個結(jié)點(diǎn)的地址。
next:是指針類型成員名,指向 structstudent數(shù)據(jù)類型( 即所在的結(jié)構(gòu)體類型)。 每個結(jié)點(diǎn)都屬于struct student類型,它的next成 員存放下一個結(jié)點(diǎn)的地址。例如:學(xué)生鏈表
structstudent{intnum;charname[20];floatscore;student*next;};鏈表的分類: 單向鏈表 單向環(huán)形鏈表 雙向鏈表 雙向環(huán)形鏈表1.鏈表概述2.鏈表的操作31(1)建立(2)輸出鏈表(3)查找結(jié)點(diǎn)(4)刪除結(jié)點(diǎn)(5)插入結(jié)點(diǎn)(6)釋放鏈表以學(xué)生鏈表為例:
structStudent{intnumber;floatscore;Student*next;};(1)創(chuàng)建鏈表
是指從無到有的建立起一個鏈表,即一個一個的輸入各結(jié)點(diǎn)數(shù)據(jù),并建立起前后相連的關(guān)系。
32
head
p1
p28910189.5
8910390
(n=2)(n=1)
p18910785
(n=3)
p100
p2
p2
p1NULL(1)創(chuàng)建鏈表33
是指從無到有的建立起一個鏈表,即一個一個的輸入各結(jié)點(diǎn)數(shù)據(jù),并建立起前后相連的關(guān)系。
算法:
開辟一個新結(jié)點(diǎn),并使p1,p2指向它
讀入一個學(xué)生數(shù)據(jù)給p1所指的結(jié)點(diǎn)
head=NULL
當(dāng)讀入的p1->num
不是零Head==NULL
head=p1(把p1所指的結(jié)點(diǎn)作為第一個結(jié)點(diǎn))
p2->next=p1(把p1所指的結(jié)點(diǎn)連接到表尾)
p2=p1(p2移到表尾)
再開辟一個新結(jié)點(diǎn),使p1指向它讀入一個學(xué)生數(shù)據(jù)給p1所指結(jié)點(diǎn)
表尾結(jié)點(diǎn)的指針變量置NULL真假34structStudent*Create(){structStudent*head;
//開始頭指針為空
head=NULL;//當(dāng)前創(chuàng)建的結(jié)點(diǎn)指針
structStudent*p1;//當(dāng)前鏈尾的結(jié)點(diǎn)指針,
//新的結(jié)點(diǎn)插入到其后
structStudent*p2;//開始生成結(jié)點(diǎn)
p1=(structStudent*)malloc(sizeof(structStudent));printf(“Inputnumberandscoreof astudent,endwith00:\n”);scanf(“%d%f”,p1->number,p1->score);p2=p1;//連接
while(p1->number!=0){
if(head==NULL)head=p1;elsep2->next=p1;p2=p1; p1=(structStudent*)malloc(sizeof(structStudent));scanf(“%d%f”,p1->number, p1->score);}
//尾結(jié)點(diǎn)
p2->next=NULL;free(p1);returnhead;}//主函數(shù)的調(diào)用voidmain(){structStudent*head;head=Create();}(1)創(chuàng)建鏈表(2)輸出鏈表35將鏈表中各結(jié)點(diǎn)的數(shù)據(jù)依次輸出。
head
NULLp=head,使p指向第一個結(jié)點(diǎn)
p指向的不是尾結(jié)點(diǎn)
當(dāng)p指的不是表尾
輸出p所指向的結(jié)點(diǎn)P移向指向下一個結(jié)點(diǎn)真假ppp36voidShowList(structStudent*head){ structStudent*p=head; printf(“Theitemsoflistare:\n”);
while(p!=NULL) { printf(“%d,%f\n”,p->number,p->score);
p=p->next; }}//主函數(shù)的調(diào)用voidmain(){structStudent*head;head=Create();ShowList(head);}(2)輸出鏈表(3)釋放鏈表37鏈表使用完畢后,需要釋放各個結(jié)點(diǎn)空間。遍歷鏈表,釋放當(dāng)前結(jié)點(diǎn),直到所有結(jié)點(diǎn)均釋放為止。voidFreeList(structStudent*head){printf(“Freetheitemsoflist\n”);structStudent*p;
while(head!=NULL){p=head;
head=head->next;free(p);}}(4)查詢鏈表-查找某個結(jié)點(diǎn)38遍歷鏈表,比較結(jié)點(diǎn)信息,直到找到相應(yīng)結(jié)點(diǎn)或鏈表結(jié)束仍然沒找到。例如:查詢學(xué)生鏈表,找學(xué)號為number的結(jié)點(diǎn),顯示信息
調(diào)用函數(shù)struct
Student*search(structStudent*head,intnumber);39structStudent*Search(structStudent*head,intnumber){ structStudent*p;//當(dāng)前結(jié)點(diǎn)指針,
p=head;
while(p!=NULL) { if(p->number==number) { printf(“該學(xué)生的成績?yōu)椋骸?; printf(“%f\n”,p->score);
returnp; }
p=p->next; } printf(“查找的學(xué)生不存在\n”); returnp;}(4)查詢鏈表(5)刪除鏈表結(jié)點(diǎn)40遍歷鏈表,比較結(jié)點(diǎn)信息,直到找到相應(yīng)結(jié)點(diǎn)或鏈表結(jié)束仍然沒找到。如果找到則將該結(jié)點(diǎn)刪除。關(guān)鍵要保證結(jié)點(diǎn)的連接不會因刪除而中斷。p2刪除前:p1p1->next刪除:關(guān)鍵代碼:p2->next=p1->next; deletep1;41
刪除鏈表結(jié)點(diǎn)1
structStudent*Delete(structStudent*head,intnumber){ structStudent*p1,*p2;//當(dāng)前結(jié)點(diǎn)指針,前一結(jié)點(diǎn)指針
p2=p1=head; while(p1!=NULL) { p2=p1; p1=p1->next; }
returnhead;}//如果發(fā)現(xiàn)結(jié)點(diǎn),刪除if(p1->number==number){p2->next=p1->next;free(p1);printf(“foundanddelete!\n”);returnhead;}//如果發(fā)現(xiàn)結(jié)點(diǎn),刪除if(p1->number==number){ if(p1==head)//如果是首結(jié)點(diǎn)
head=p1->next; else//其他結(jié)點(diǎn)
p2->next=p1->next; free(p1); printf(“foundanddelete!”);
returnhead;}?Head=NULL?尾結(jié)點(diǎn)?首結(jié)點(diǎn)printf(“NotFound!”);head=p1->next;deletep1;p2headp1p1->nextheadp2if(head==NULL){cout<<“ListisNull”<<endl;returnhead;}42主函數(shù)的調(diào)用voidmain(){structStudent*head;head=Create();
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幾何概率面試真題及答案
- 達(dá)州市鄉(xiāng)村振興移民安置房屋建設(shè)培訓(xùn)課件
- 特殊教育需求與資源配置調(diào)研課件
- 《河流的水文特征》課件
- 《基因技術(shù)》課件2
- 《數(shù)據(jù)分析與可視化課件設(shè)計(jì)》
- 山東計(jì)算機(jī)二級考試單選題100道及答案
- 《胰島素治療的合理應(yīng)用》課件
- 振動的描述課件魯科版選修:波動的奧秘課件人教版選修
- 《神經(jīng)內(nèi)科疾病教學(xué)》課件
- 江蘇省南京市、鹽城市2025屆高三年級5月第二次模擬考試政治試題及答案(南京鹽城二模)
- 快遞員合同協(xié)議書范本
- (完整版)年產(chǎn)30萬噸甲醇工藝設(shè)計(jì)畢業(yè)設(shè)計(jì)
- 信息光學(xué)課件
- 北師大版數(shù)學(xué)八年級下冊全冊同步練習(xí)附答案
- 開放水域潛水員理論知識考試試題與答案
- 機(jī)械設(shè)計(jì)基礎(chǔ)課程設(shè)計(jì)題目范文
- 報(bào)價單報(bào)價表
- 職業(yè)衛(wèi)生檔案全套
- 管道開挖技術(shù)交底
評論
0/150
提交評論