第12章 自定義數(shù)據(jù)類型_第1頁(yè)
第12章 自定義數(shù)據(jù)類型_第2頁(yè)
第12章 自定義數(shù)據(jù)類型_第3頁(yè)
第12章 自定義數(shù)據(jù)類型_第4頁(yè)
第12章 自定義數(shù)據(jù)類型_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第12章自定義數(shù)據(jù)類型程序設(shè)計(jì)語(yǔ)言主要內(nèi)容結(jié)構(gòu)體類型與變量結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體與函數(shù)鏈表在程序里表示一個(gè)人(姓名、年齡、性別、成績(jī)),怎么表示?想表示多個(gè)人呢?如何用計(jì)算機(jī)程序?qū)崿F(xiàn)下述表格的管理?思考I.使用數(shù)組MaryJohnPeterRoseKateFMFMF01020304058978.56797.564解決方案:scorenumsexname不能建立數(shù)組間的關(guān)系II.使用多維數(shù)組MaryJohnPeterRoseKateFMFMF01020304058978.56797.564C語(yǔ)言不允許一個(gè)數(shù)組包含多種數(shù)據(jù)類型III.使用結(jié)構(gòu)體numnamesexscoreC語(yǔ)言引入了稱為結(jié)構(gòu)體的數(shù)據(jù)存儲(chǔ)方式“結(jié)構(gòu)體”是一種構(gòu)造數(shù)據(jù)類型,它是由若干數(shù)據(jù)項(xiàng)組合而成的復(fù)雜數(shù)據(jù)對(duì)象,這些數(shù)據(jù)項(xiàng)稱為結(jié)構(gòu)體的成員。結(jié)構(gòu)體簡(jiǎn)介

structstructurename{ datatypevariable1; datatypevariable2; ...};結(jié)構(gòu)體成員{};結(jié)構(gòu)體名structstudentintnum;charname[20];charsex;定義結(jié)構(gòu)體floatscore;C語(yǔ)言中的有效數(shù)據(jù)類型結(jié)構(gòu)體類型定義1structstudent{intnum;charname[20];charsex;floatscore;};numnamesexstudent結(jié)構(gòu)體定義并不預(yù)留內(nèi)存結(jié)構(gòu)體定義放置在程序的開(kāi)始部分,位于頭文件聲明之后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)體類型的同時(shí)聲明結(jié)構(gòu)體變量struct{intnum;charname[20];charsex;floatscore;}student1,student2;III.直接聲明結(jié)構(gòu)體變量聲明一個(gè)類型為student結(jié)構(gòu)體的變量,將會(huì)為該變量分配內(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í)的順序一樣;允許初始化語(yǔ)句中的值的數(shù)目比結(jié)構(gòu)體成員數(shù)目少。student3.numstudent3.sex90.5student3.score結(jié)構(gòu)體變量的初始化student1student1.num=1;scanf("%s",);student1.sex='M';printf("請(qǐng)輸入成績(jī):\n");scanf("%f",&student1.score);1ZhangZiLiangM用輸入語(yǔ)句或賦值語(yǔ)句來(lái)給結(jié)構(gòu)體變量的各個(gè)成員賦值7878student2=student1;student21ZhangZiLiangM78strcpy(,"ZhangSan");結(jié)構(gòu)體變量的引用如果要將“zhang”改為“zhong”,只要將結(jié)構(gòu)變量student1中的數(shù)組成員name下標(biāo)為2的元素‘a(chǎn)’改為‘o’即可。

可以使用下列語(yǔ)句:

[2]='o';/*為結(jié)構(gòu)變量中的數(shù)組成員的一個(gè)元素賦值*/結(jié)構(gòu)體變量的引用structstudent{intnum;charname[20];charsex;floatscore;}student1;對(duì)結(jié)構(gòu)變量的整體操作 要對(duì)結(jié)構(gòu)體進(jìn)行整體操作有很多限制,C語(yǔ)言中能夠?qū)Y(jié)構(gòu)進(jìn)行整體操作的運(yùn)算不多,只有賦值“=”操作。例如:structdatesunday,today;

sunday=today; /*結(jié)構(gòu)變量整體賦值*/結(jié)構(gòu)體變量的引用不能將一個(gè)結(jié)構(gòu)變量作為一個(gè)整體直接訪問(wèn)。

例如,不能這樣引用:printf("%s,%c,%d,%d,%d\n",student1);如果成員本身又是一個(gè)結(jié)構(gòu)類型,則要用若干個(gè)成員運(yùn)算符,一級(jí)一級(jí)地找到最低的一級(jí)的成員。例如,對(duì)上面定義的結(jié)構(gòu)變量student1,可以這樣訪問(wèn)各個(gè)成員:

student1.sex student1.birthday.month student1.birthday.day student1.birthday.year結(jié)構(gòu)體變量的引用struct{intnum;charname[20];charsex;

structdatebirthday;floatscore;}student1,student2;問(wèn)題描述:根據(jù)學(xué)員的成績(jī),輸出不及格學(xué)員的詳細(xì)信息。

#include<stdio.h>structstudent{ intnum;//學(xué)號(hào)

charname[10];//姓名 charsex;//性別 floatscore;//成績(jī)};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("沒(méi)有不及格的學(xué)員。\n");return0;}不及格學(xué)員的名單如下:3姚光明M59.00stu11張亞鵬M78stu22周晶晶F92stu33姚光明M59使用結(jié)構(gòu)體示例structstudent

stu,*pstu;*pstu=&stu;(*pstu).num

或者:pstu->num一個(gè)指針當(dāng)用來(lái)指向一個(gè)結(jié)構(gòu)體時(shí),稱之為結(jié)構(gòu)體指針變量。結(jié)構(gòu)體指針變量中的值是所指向的結(jié)構(gòu)體變量的首地址。結(jié)構(gòu)體指針變量聲明的一般形式為:

struct結(jié)構(gòu)體名*結(jié)構(gòu)體指針變量名通過(guò)結(jié)構(gòu)體指針可以訪問(wèn)該結(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é)號(hào):%d姓名:%s\n",stu.num,);printf("性別:%c成績(jī):%5.2f\n\n",stu.sex,stu.score);printf("學(xué)號(hào):%d姓名:%s\n",(*pstu).num,(*pstu).name);printf("性別:%c成績(jī):%5.2f\n\n",(*pstu).sex,(*pstu).score);printf("學(xué)號(hào):%d姓名:%s\n",pstu->num,pstu->name);printf(“性別:%c成績(jī):%5.2f\n\n",pstu->sex,pstu->score);return0;}學(xué)號(hào):1姓名:張賓性別:F成績(jī):55.00學(xué)號(hào):1姓名:張賓性別:F成績(jī):55.00學(xué)號(hào):1姓名:張賓性別:F成績(jī):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ù)組來(lái)表示具有相同數(shù)據(jù)結(jié)構(gòu)體的一個(gè)群體。例如一個(gè)班的學(xué)員檔案,一個(gè)公司的職工檔案等。定義了一個(gè)結(jié)構(gòu)體數(shù)組stu,共有30個(gè)元素,stu[0]~stu[29]。每個(gè)數(shù)組元素都具有structstudent的結(jié)構(gòu)體形式。結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組的初始化structstudentstu[3]={{1,"李芳",'F',45},

{2,"于紅",'F',62.5},

{3,"何萬(wàn)山",'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個(gè)學(xué)生分?jǐn)?shù)最低的學(xué)生,輸出其姓名和成績(jī)。輸入:依次輸入每個(gè)學(xué)生姓名與成績(jī)輸出:分?jǐn)?shù)最低的學(xué)生姓名與成績(jī)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鏈表是種常見(jiàn)的重要數(shù)據(jù)結(jié)構(gòu)。

鏈表作用:動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配,根據(jù)需要開(kāi)辟內(nèi)存單元。

鏈表結(jié)構(gòu):

1249

head1249A13561356B14751475C10211021DNull鏈表有一個(gè)頭指針變量,存放一個(gè)地址,指向一個(gè)元素(結(jié)點(diǎn))結(jié)點(diǎn):包括兩部分:①用戶需要的實(shí)際數(shù)據(jù)。②下一個(gè)結(jié)點(diǎn)的地址。1.鏈表概述30錯(cuò)誤:

structList{charname[20];List*pN;Listm;};鏈表特點(diǎn):鏈表中各元素在內(nèi)存中可以不是連續(xù)存放,對(duì)鏈表中數(shù)據(jù)只能進(jìn)行順序存取。

鏈表實(shí)現(xiàn):利用指針變量實(shí)現(xiàn),即:一個(gè)結(jié)點(diǎn)中應(yīng)包括一個(gè)指針變量,用它存放下一個(gè)結(jié)點(diǎn)的地址。

next:是指針類型成員名,指向 structstudent數(shù)據(jù)類型( 即所在的結(jié)構(gòu)體類型)。 每個(gè)結(jié)點(diǎn)都屬于struct student類型,它的next成 員存放下一個(gè)結(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)建鏈表

是指從無(wú)到有的建立起一個(gè)鏈表,即一個(gè)一個(gè)的輸入各結(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

是指從無(wú)到有的建立起一個(gè)鏈表,即一個(gè)一個(gè)的輸入各結(jié)點(diǎn)數(shù)據(jù),并建立起前后相連的關(guān)系。

算法:

開(kāi)辟一個(gè)新結(jié)點(diǎn),并使p1,p2指向它

讀入一個(gè)學(xué)生數(shù)據(jù)給p1所指的結(jié)點(diǎn)

head=NULL

當(dāng)讀入的p1->num

不是零Head==NULL

head=p1(把p1所指的結(jié)點(diǎn)作為第一個(gè)結(jié)點(diǎn))

p2->next=p1(把p1所指的結(jié)點(diǎn)連接到表尾)

p2=p1(p2移到表尾)

再開(kāi)辟一個(gè)新結(jié)點(diǎn),使p1指向它讀入一個(gè)學(xué)生數(shù)據(jù)給p1所指結(jié)點(diǎn)

表尾結(jié)點(diǎn)的指針變量置NULL真假34structStudent*Create(){structStudent*head;

//開(kāi)始頭指針為空

head=NULL;//當(dāng)前創(chuàng)建的結(jié)點(diǎn)指針

structStudent*p1;//當(dāng)前鏈尾的結(jié)點(diǎn)指針,

//新的結(jié)點(diǎn)插入到其后

structStudent*p2;//開(kāi)始生成結(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指向第一個(gè)結(jié)點(diǎn)

p指向的不是尾結(jié)點(diǎn)

當(dāng)p指的不是表尾

輸出p所指向的結(jié)點(diǎn)P移向指向下一個(gè)結(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鏈表使用完畢后,需要釋放各個(gè)結(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)查詢鏈表-查找某個(gè)結(jié)點(diǎn)38遍歷鏈表,比較結(jié)點(diǎn)信息,直到找到相應(yīng)結(jié)點(diǎn)或鏈表結(jié)束仍然沒(méi)找到。例如:查詢學(xué)生鏈表,找學(xué)號(hào)為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é)生的成績(jī)?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é)束仍然沒(méi)找到。如果找到則將該結(jié)點(diǎn)刪除。關(guān)鍵要保證結(jié)點(diǎn)的連接不會(huì)因刪除而中斷。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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論