版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C語言程序設(shè)計第10章哈爾濱理工大學(xué)計算中心結(jié)構(gòu)結(jié)構(gòu)(struct)是一種構(gòu)造數(shù)據(jù)類型(由基本數(shù)據(jù)類型派生而來)可以將一些不同的數(shù)據(jù)類型組合在一起使用數(shù)組也是一種構(gòu)造數(shù)據(jù)類型,但數(shù)組中的所有元素都是同一數(shù)據(jù)類型的結(jié)構(gòu)如,想在一個整體中表示一個學(xué)生的學(xué)號、姓名、性別、年齡、成績、地址等可定義結(jié)構(gòu)如下structstudent/*struct為關(guān)鍵字,struct為結(jié)構(gòu)名*/{intnum;/*每個數(shù)據(jù)項稱為一個結(jié)構(gòu)成員*/charname[20];charsex;intage;floatscore;charaddr[30];};/*結(jié)構(gòu)定義應(yīng)以;來結(jié)束*/10010LiM1887.5Beijingnumnamesexagescoreaddr結(jié)構(gòu)的定義struct
結(jié)構(gòu)體名{數(shù)據(jù)類型成員名1;數(shù)據(jù)類型成員名2;...數(shù)據(jù)類型成員名n;};結(jié)構(gòu)定義實例如,處理學(xué)生成績數(shù)據(jù),每個學(xué)生有考號、姓名、三門課程的成績、總成績等變量。structstudent{longkaohao;/*考號*/charname[10];/*姓名*/intscore1;/*成績*/intscore2;intscore3;inttotal;/*總成績*/};結(jié)構(gòu)變量定義定義結(jié)構(gòu)了結(jié)構(gòu)體后并不能直接使用,一個結(jié)構(gòu)體相當(dāng)于一個結(jié)構(gòu)變量的"類型"或一個"框架",具體使用時要定義結(jié)構(gòu)變量當(dāng)前面定義了student這個結(jié)構(gòu)體后,可定義結(jié)構(gòu)變量如下structstudents1,s2;此時,表示定義了兩個結(jié)構(gòu)變量s1,s2,每個結(jié)構(gòu)變量都包含了在前述定義結(jié)構(gòu)體時所定義的所有成員,如s1中包含了kaohao,name,score1,score2,score3,total等各個成員結(jié)構(gòu)變量定義 定義結(jié)構(gòu)的同時聲明變量structstudent{longkaohao;/*考號*/charname[10];/*姓名*/intscore1;/*成績*/intscore2;intscore3;inttotal;/*總成績*/}s1,s2;結(jié)構(gòu)變量定義不定義結(jié)構(gòu)體,直接定義結(jié)構(gòu)變量struct
{longkaohao;/*考號*/charname[10];/*姓名*/intscore1;/*成績*/intscore2;intscore3;inttotal;/*總成績*/}s1,s2;這種方式與前兩種方式最主要的區(qū)別是沒有定義結(jié)構(gòu)體,因此,以后也就無法利用這一結(jié)構(gòu)類型來定義其他的變量。結(jié)構(gòu)變量的存儲4bytes10bytes2bytes2bytes2bytes2byteskaohaoname[10]score1score2score3total每個結(jié)構(gòu)變量(如s1,s2)均占連續(xù)的22bytes的內(nèi)存空間每個結(jié)構(gòu)變量所占內(nèi)存空間等于結(jié)構(gòu)體各個成員所占空間之和結(jié)構(gòu)變量的引用一個結(jié)構(gòu)變量由若干個成員(分量)組成當(dāng)使用結(jié)構(gòu)變量時,只能每次引用一個成員,而不能同時使用所有成員結(jié)構(gòu)變量的引用是通過引用其成員(分量)的形式來實現(xiàn)的結(jié)構(gòu)變量名.結(jié)構(gòu)成員名如,,s1.num,s1.score1,s1.total,,…s1.num=1010;s2.total=s2.score1+s2.score2+s2.score3;每個結(jié)構(gòu)成員都可當(dāng)做一個變量來使用,類型為在定義結(jié)構(gòu)時所指定的數(shù)據(jù)類型結(jié)構(gòu)變量的引用結(jié)構(gòu)變量的成員(分量)使用方法與普通內(nèi)存變量沒有區(qū)別??梢詫ζ滟x值、參與運算或作為函數(shù)的參數(shù)。如,s1.score1=60;strcpy(,"Li");/*字符數(shù)組賦值要用字符串拷貝函數(shù)*/s2.total=s2.score1+s2.score2+s2.score3;printf("=%s\n",);結(jié)構(gòu)變量的引用可以對結(jié)構(gòu)變量的各個成員取地址struct
{longkaohao;/*考號*/charname[10];/*姓名*/intscore1;/*成績*/intscore2;intscore3;inttotal;/*總成績*/}s1,s2;long*p;scanf("%ld",&s1.kaohao);p=&s1.kaohao;printf("s1.kaohao=%ld\n",*p);結(jié)構(gòu)的嵌套 前面所舉的結(jié)構(gòu)成員都是基本數(shù)據(jù)類型,如int、char等,結(jié)構(gòu)的成員也可以是另一個結(jié)構(gòu),此時稱為結(jié)構(gòu)的嵌套對于嵌套的結(jié)構(gòu),定義與引用結(jié)構(gòu)成員的方式均有所區(qū)別結(jié)構(gòu)嵌套實例 structdate{intyear;intmonth;intday;};structstudent{longnum;charname[10];intscore[3];inttotal;structdatebirth;}s1;對于嵌套的結(jié)構(gòu),只能引用"最低級別"的成員,如s1.num,,s1.birth.year,s1.birth.month結(jié)構(gòu)嵌套實例結(jié)構(gòu)嵌套定義也可以寫為:structstudent{longnum;charname[10];intscore[3];inttotal;structdate{intyear;intmonth;intday;}birth;}s1;此時,使用結(jié)構(gòu)變量s1的方式與前面例子中完全相同結(jié)構(gòu)變量的初始化同其他類型變量一樣,可以在定義結(jié)構(gòu)的同時定義結(jié)構(gòu)變量,稱為結(jié)構(gòu)變量的"初始化"structstudent{longkaohao;charname[10];intscore[3];inttotal;}s1={2390,"LiMing",84,74,90,0};此時賦值的順序應(yīng)與結(jié)構(gòu)變量各成員的順序一致結(jié)構(gòu)變量的初始化先定義結(jié)構(gòu),再定義結(jié)構(gòu)變量并初始化structstudent{longkaohao;charname[10];intscore[3];inttotal;};structstudents1={2390,"LiMing",84,74,90,0};structstudents2={2391,"WangPing",74,86,90,0};結(jié)構(gòu)變量的初始化2390LiMing8474900kaohaoname[10]score1score2score3total結(jié)構(gòu)變量s1各成員初始化后的內(nèi)容結(jié)構(gòu)數(shù)組一個結(jié)構(gòu)變量可存儲一個數(shù)據(jù)的整體,如一個學(xué)生的信息,若需要同時存儲多個學(xué)生的數(shù)據(jù),則需要同時定義多個結(jié)構(gòu)變量,此時可以使用數(shù)組若數(shù)組的每一個成員是一個結(jié)構(gòu)變量,則該數(shù)組稱為結(jié)構(gòu)數(shù)組定義方法結(jié)構(gòu)體名數(shù)組名[元素個數(shù)];結(jié)構(gòu)數(shù)組的定義structstudent{longkaohao;charname[10];intscore[3];inttotal;}structstudents[3];此時s[3]是一個有3個元素的數(shù)組,但每個數(shù)組元素不再是一個基本類型的變量,而是一個結(jié)構(gòu)類型的變量,引用數(shù)組元素時要按結(jié)構(gòu)變量的方式來使用結(jié)構(gòu)數(shù)組的使用每個結(jié)構(gòu)數(shù)組的元素(s[0],s[1],s[2])是一個結(jié)構(gòu)變量;所以,如下的引用是正確的:s[0].kaohaos[0].names[0].score[0]s[0].score[1]s[0].score[2]s[0].totals[1].kaohaos[1].name…結(jié)構(gòu)數(shù)組的存儲s[0]s[1]s[2]4bytes10bytes2bytes2bytes2bytes2byteskaohaoname[10]score[0]score[1]score[2]total22bytes數(shù)組是相同類型的數(shù)據(jù)集,并且數(shù)組的所有元素一定是連續(xù)存儲的,結(jié)構(gòu)數(shù)組也不例外結(jié)構(gòu)數(shù)組的初始化結(jié)構(gòu)數(shù)組變量的初始化與結(jié)構(gòu)變量的初始化基本相同,但要注意同時為多個結(jié)構(gòu)變量賦初值,如:structstudents[3]={{2390,"Li",84,74,90,0},{2391,"Wang",75,86,90,0},{2392,"Zhao",71,84,76,0}}結(jié)構(gòu)數(shù)組的初始化2390Li84749002391Wang75869002392Zhao7184760kaohaonamescore1score2score3totals[0]s[1]s[2]結(jié)構(gòu)數(shù)組初始化后的結(jié)果結(jié)構(gòu)數(shù)組應(yīng)用舉例對候選人得票的統(tǒng)計程序。設(shè)有三個候選人,每次輸入一個人的名字,統(tǒng)計各人得票結(jié)果候選人的信息用一個結(jié)構(gòu)來描述structperson{charname[20];/*名字*/intcount;/*票數(shù)*/}結(jié)構(gòu)數(shù)組應(yīng)用舉例#include<stdio.h>structperson{charname[20];intcount;}leader[3]={"L",0,"Z",0,"F",0};/*定義結(jié)構(gòu)并初始化*/main(){inti,j;charleader_name[20];for(i=1;i<=10;i++)/*允許輸入10個名字*/{scanf("%s",leader_name);for(j=0;j<3;j++)if(strcmp(leader_name,leader[j].name)==0)/*名字相等時得票數(shù)加一*/ leader[j].count++;}printf("\n");for(i=0;i<3;i++)/*輸出每個人的得票數(shù)*/printf("%5s:%d\n",leader[i].name,leader[i].count);}結(jié)構(gòu)指針一個結(jié)構(gòu)變量的指針就是該變量所占內(nèi)存空間的起始地址可以定義結(jié)構(gòu)指針變量,用來保存結(jié)構(gòu)變量的地址與其他類型的指針用法相似,可以通過指針來引用結(jié)構(gòu)變量結(jié)構(gòu)指針變量的定義格式struct
結(jié)構(gòu)名*結(jié)構(gòu)指針變量名如,structstudent*p;結(jié)構(gòu)指針實例例:structstudent{longkaohao;charname[10];floatscore[3];floattotal;};structstudents;structstudent*p;此時p為結(jié)構(gòu)指針變量,*p相當(dāng)于一個結(jié)構(gòu)變量可以對用結(jié)構(gòu)變量的地址對結(jié)構(gòu)指針變量賦值p=&s;結(jié)構(gòu)成員引用方式s.kaohaos.score[0]s.score[1]s.score[2]s.total(*p).kaohao(*p).name(*p).score[0](*p).score[1](*p).score[2](*p).totalp->kaohaop->namep->score[0]p->score[1]p->score[2]p->total當(dāng)使用結(jié)構(gòu)指針變量引用結(jié)構(gòu)成員時,需要用運算符指向運算符"->"結(jié)構(gòu)嵌套中成員引用方式structdate{intyear,month,day;}structstudent{longkaohao;charname[10];structdatebirth,enter;floatscore[3];floattotal;}s,*p;p=&s;p->kaohaop->namep->birth->yearp->birth->monthp->birth->dayp->enter->yearp->enter->monthp->enter->dayp->score[0]p->score[1]p->score[2]p->total當(dāng)使用結(jié)構(gòu)指針引用結(jié)構(gòu)成員時,嵌套結(jié)構(gòu)的所有成員都要用指向運算符"->"指針與結(jié)構(gòu)數(shù)組實例:structstudent{longkaohao;charname[10];floatscore[3];floattotal;}s[10],*p;p=s;p是指向結(jié)構(gòu)數(shù)組s的指針 與指針部分所講內(nèi)容類似,也可以用結(jié)構(gòu)指針變量來訪問結(jié)構(gòu)數(shù)組; 此時,p++是指向s[1]的指針,p+2是指向s[2]的指針...;p+9是指向s[9]的指針 *p相當(dāng)于s[0]指針與結(jié)構(gòu)數(shù)組structstudent{intnum;charname[20];charsex;intage;};structstudents[3]={{10101,"L",'M',18},{10102,"Z",'M',19},{10104,"W",'F',20}};main(){structstudent*p;printf("No.Namesexage\n");for(p=s;p<s+3;p++) printf("%5d%-20s%2c%4d\n",p->num,p->name,p->sex,p->age);}結(jié)構(gòu)變量的存儲如下圖所示指針與結(jié)構(gòu)數(shù)組10101LM1810102ZM1910104WF20s[0]s[1]s[2]pp+1p+2結(jié)構(gòu)與函數(shù)結(jié)構(gòu)成員作為函數(shù)參數(shù)將單個的結(jié)構(gòu)成員作為函數(shù)參數(shù)與基本類型變量作為函數(shù)實參用法相同可以使用傳值或傳地址方式如printf("%d%s\n",s[0].num,s[0].name);結(jié)構(gòu)與函數(shù)結(jié)構(gòu)變量作為函數(shù)實參此時將一個結(jié)構(gòu)變量的所有成員一次傳遞給函數(shù)作為實際參數(shù)當(dāng)形參與實參都定義為結(jié)構(gòu)變量時,傳遞的是兩個結(jié)構(gòu)變量的對應(yīng)成員之間數(shù)據(jù)的"拷貝",即傳值方式例:結(jié)構(gòu)變量作實參和形參的調(diào)用方式和對應(yīng)成員項之間的數(shù)據(jù)拷貝結(jié)構(gòu)與函數(shù)結(jié)構(gòu)變量作函數(shù)參數(shù)#include<stdio.h>structstudent{ charname[10];intscore1; intscore2; intscore3;};/*定義結(jié)構(gòu)體*/int
pr(structstudents)/*打印結(jié)構(gòu)內(nèi)容的函數(shù)*/{printf("name:%s\n",);printf("score1:%d\n",s.score1);printf("score2:%d\n",s.score2);printf("score3:%d\n",s.score3);}/*endpr*/main(){structstudents1;/*定義結(jié)構(gòu)變量s1*/strcpy(,"lcy");/*為結(jié)構(gòu)變量的各個成員賦值*/s1.score1=60;s1.score2=70;s1.score3=90;pr(s1);}/*endmain*/結(jié)構(gòu)與函數(shù)結(jié)構(gòu)數(shù)組做為函數(shù)參數(shù)這時傳遞給函數(shù)的是結(jié)構(gòu)數(shù)組的首地址屬于"傳地址"調(diào)用例:輸出結(jié)構(gòu)數(shù)組內(nèi)容的函數(shù)結(jié)構(gòu)與函數(shù)structstudent{ longnum; charname[10];charsex[4];intscore[3];inttotal;};main(){inti,j;staticstructstudents[]={{2390,"LI","m",84,74,90,0},{2391,"WANG","m",75,86,90,0}};for(i=0;i<2;i++) for(j=0;j<3;j++) s[i].total+=s[i].score[j]; output(s);/*調(diào)用函數(shù)output,實參為結(jié)構(gòu)數(shù)組s*/}output(structstudenta[])/*輸出結(jié)構(gòu)數(shù)組內(nèi)容的函數(shù),形參類型為結(jié)構(gòu)數(shù)組*/{inti,j;for(i=0;i<2;i++) { printf("%8d%10s%4s",a[i].num,a[i].name,a[i].sex); for(j=0;j<3;j++) printf("%5d",a[i].score[j]); printf("%5d\n",a[i].total); }}結(jié)構(gòu)指針做函數(shù)參數(shù)結(jié)構(gòu)數(shù)據(jù)在函數(shù)間傳遞的方式:結(jié)構(gòu)成員做函數(shù)參數(shù)結(jié)構(gòu)變量做函數(shù)參數(shù)結(jié)構(gòu)數(shù)組做函數(shù)參數(shù)結(jié)構(gòu)指針做函數(shù)參數(shù)結(jié)構(gòu)指針做函數(shù)參數(shù)例,#include<stdio.h>structgrade/*定義結(jié)構(gòu)體*/{intscore1,score2,total;};main(){structgrade*s1;/*定義結(jié)構(gòu)指針*/s1=(structgrade*)malloc(sizeof(structgrade));/*動態(tài)分配內(nèi)存給結(jié)構(gòu)指針*/s1->score1=80;s1->score2=90;s1->total=s1->score1+s1->score2;copy(s1);/*調(diào)用copy函數(shù),實參為結(jié)構(gòu)指針*/printf("s1->score1=%d,s1->score2=%d,s1->total=%d\n",s1->score1,s1->score2,s1->total);}/*endmain*/copy(structgrade*s2){s2->score1=60;s2->score2=70;s2->total=s2->score1+s2->score2;printf("s2->score1=%d,s2->score2=%d,s2->total=%d\n",s2->score1,s2->score2,s2->total);}返回結(jié)構(gòu)類型的函數(shù)函數(shù)定義的形式struct
結(jié)構(gòu)名函數(shù)名(參數(shù)表)此時函數(shù)的返回值是一個結(jié)構(gòu)變量,用這種方法可以一次返回多個值。結(jié)構(gòu)類型函數(shù)舉例structstudent{charname[10];intscore1;intscore2;};structstudentin();in(){structstudenta;scanf("%s%d%d",,&a.score1,&a.score2);returna;}結(jié)構(gòu)應(yīng)用實例—鏈表鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),是可以動態(tài)地分配存儲空間的一種結(jié)構(gòu)。相比而言數(shù)組是一種靜態(tài)地分配存儲空間的方式鏈表的構(gòu)成:頭指針,存放一個地址,指向鏈表的第一個元素鏈表中每個元素稱為一個"結(jié)點",每個結(jié)點包括兩部分:用戶數(shù)據(jù)和指向下一個結(jié)點的地址最后一個元素稱為"表尾",其地址為NULL(空地址)ABCDNULLhead簡單鏈表舉例定義structstudent{longnum;floatscore;structstudent*next;}a,b,c,*head,*p;head=&a;a.next=&b;b.next=&c;c.next=NULL;動態(tài)建立鏈表假設(shè)在鏈表中已存在a,b,c三個結(jié)點,在該鏈表中加入一個結(jié)點:p=(structstudent*)malloc(structstudent);/*分配空間*/c.next=p;/*原鏈表表尾指向p*/p->next=NULL;/*p為新表尾結(jié)點*/scanf("%d",p->num);/*讀入結(jié)點內(nèi)容*/NULLpABCheadNULL鏈表的遍歷從頭結(jié)點開始,沿鏈的順序走過所有的結(jié)點,通常用于處理鏈表中的數(shù)據(jù),如輸出、查找等。structstudent*;p=head;if(head!=NULL)do程序段(如輸出鏈表結(jié)點內(nèi)容)p=p->next;while(p!=NULL)ABCDNULLheadp共用體與結(jié)構(gòu)類似,共用體也是一種構(gòu)造數(shù)據(jù)類型共用體中有多個成員共用體中的多個成員共用一個存儲空間,這點是和結(jié)構(gòu)的一個主要區(qū)別共用體定義共用體的定義:union共用體名{成員表;}共用體變量的定義可在定義共用體類型時直接定義共用體變量;不定義共用體類型直接定義共用體變量;union共用體名共用體變量名;實例unionexam{inta;floatb;charc;}unionexamx,y;union所占的空間:2bytes4bytes1bytesMAX4bytes1bytes1bytes1bytes1bytesx.cx.ax.bunionexamunion引用方式共用體的引用方式與結(jié)構(gòu)類似,但共用體變量中同時只能存儲一個成員如:x.a,x.b,x.c;共用體指針unionexam*px,x;px=&x;px->a,px->b,px->c;union程序舉例p289例12,p289-12.c#include<string.h>struct{ intnum; charname[10]; charsex; charjob;
union/*在結(jié)構(gòu)體中嵌套使用了共用體*/ { intclass; charposition[10]; }category;}person[2];main(){intn,i;person[0].num=101;strcpy(person[0].name,"LI");person[0].sex='f';person[0].job='s';person[0].category.class=501;person[1].num=102;strcpy(person[1].name,"WANG");person[1].sex='m';person[1].job='t';strcpy(person[1].category.position,"professor");for(i=0;i<2;i++){ if(person[i].job=='s') printf("%-6d%-10s%-3c%-3c%-6d\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.class); else printf("%-6d%-10s%-3c%-3c%-10s\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.position);}/*endfor*/}/*endmain*/枚舉類型(enum)枚舉(enumeration),就是當(dāng)變量只有幾種可能值時,將變量的值一一列舉出來,此時變量的取值只限于列出的值如一周內(nèi)的星期幾,一年中的月份等枚舉數(shù)據(jù)是一個被命名為整型常數(shù)的集合枚舉的定義枚舉的定義與結(jié)構(gòu)、聯(lián)合相似格式:enum
類型名{枚舉值表}變量名表;枚舉舉例enum
day{s
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025海運進(jìn)口貨物報關(guān)委托合同范本
- 2025北京市房屋出租代理合同版2
- 二零二五年度文化用品紙箱定制供應(yīng)合同范本3篇
- 2025深圳市建筑裝飾工程施工合同(III)
- 二零二五年度倉儲物流園區(qū)開發(fā)建設(shè)合同3篇
- 2025年度電商平臺虛擬商品交易合作合同4篇
- 二零二四年校長職務(wù)聘任合同與績效掛鉤范本3篇
- 2025年度二零二五社區(qū)食堂建設(shè)與運營承包協(xié)議3篇
- 2025年度存量房買賣及租賃期限調(diào)整合同范本4篇
- 二零二四年木地板國際貿(mào)易結(jié)算與支付合同3篇
- 建筑工程施工安全管理思路及措施
- 高中語文教學(xué)課例《勸學(xué)》課程思政核心素養(yǎng)教學(xué)設(shè)計及總結(jié)反思
- 中國農(nóng)業(yè)銀行小微企業(yè)信貸業(yè)務(wù)貸后管理辦法規(guī)定
- 領(lǐng)導(dǎo)干部的情緒管理教學(xué)課件
- 初中英語-Unit2 My dream job(writing)教學(xué)課件設(shè)計
- 市政道路建設(shè)工程竣工驗收質(zhì)量自評報告
- 優(yōu)秀支行行長推薦材料
- 中國版梅尼埃病診斷指南解讀
- 暨南大學(xué)《經(jīng)濟(jì)學(xué)》考博歷年真題詳解(宏觀經(jīng)濟(jì)學(xué)部分)
- 藥店員工教育培訓(xùn)資料
- eNSP簡介及操作課件
評論
0/150
提交評論