版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《C語(yǔ)言大學(xué)教程》課件(第10章)
教材編著:PaulDeitel(美國(guó))
HarveyDeitel(美國(guó))翻譯:蘇小紅等(哈爾濱工業(yè)大學(xué))第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型本章主要內(nèi)容結(jié)構(gòu)體及其參數(shù)傳遞方法共用體及其特點(diǎn)枚舉類(lèi)型位運(yùn)算結(jié)構(gòu)體定義學(xué)號(hào)姓名年齡性別成績(jī)1成績(jī)2平均成績(jī)
1AA19M8090902BB18F7870733CC17M8175794DD18F8060755EE19M768383每行的數(shù)據(jù)類(lèi)型不相同,如何表示此二維數(shù)據(jù)?如何交換兩行值?能否將一行看成一個(gè)整體?定義一種類(lèi)型,把不同的數(shù)據(jù)作為一個(gè)整體來(lái)處理——結(jié)構(gòu)體結(jié)構(gòu)體概述將不同種類(lèi)型的數(shù)據(jù)有序地組合在一起,構(gòu)造出一個(gè)新的數(shù)據(jù)類(lèi)型,這種形式稱(chēng)為結(jié)構(gòu)體。結(jié)構(gòu)體是多種類(lèi)型組合的數(shù)據(jù)類(lèi)型。同一個(gè)結(jié)構(gòu)體可以存儲(chǔ)多種類(lèi)型的數(shù)據(jù);是比數(shù)組更靈活的的數(shù)據(jù)格式.結(jié)構(gòu)體是C++面向?qū)ο螅?lèi))的基石;結(jié)構(gòu)體定義數(shù)組
------有相同類(lèi)型的數(shù)據(jù)集合結(jié)構(gòu)體------不同類(lèi)型的數(shù)據(jù)集合構(gòu)造數(shù)據(jù)類(lèi)型:
由簡(jiǎn)單數(shù)據(jù)類(lèi)型(int、float、char)組合而成的(有機(jī)整體)數(shù)據(jù)類(lèi)型。基本類(lèi)型:
整型、實(shí)型、字符型.......第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.2結(jié)構(gòu)體的定義結(jié)構(gòu)體屬于派生數(shù)據(jù)類(lèi)型,即它們是用其他數(shù)據(jù)類(lèi)型的對(duì)象來(lái)構(gòu)建的。定義:struct
名稱(chēng)
{
類(lèi)型名1變量名1;類(lèi)型名2變量名2;
};結(jié)構(gòu)的聲明若要?jiǎng)?chuàng)建一種類(lèi)型來(lái)描述學(xué)生信息,先要定義這種類(lèi)型的數(shù)據(jù)屬性——structStudent
//結(jié)構(gòu)聲明{intnum;//一個(gè)int成員
charname[20];//一個(gè)char數(shù)組成員
charsex;//一個(gè)char成員
intage;//一個(gè)int成員
floatscore;//一個(gè)float成員
charaddr[30];//一個(gè)char數(shù)組成員};
結(jié)構(gòu)描述的組成部分structStudent
{intnum;
charname[20];
charsex;
intage;
floatscore;
charaddr[30];
};
struct關(guān)鍵字標(biāo)識(shí)符成為結(jié)構(gòu)體類(lèi)型的名稱(chēng)結(jié)構(gòu)成員(域)起始括號(hào)和結(jié)束括號(hào)分號(hào)結(jié)束模板聲明說(shuō)明(1)結(jié)構(gòu)體類(lèi)型是一種構(gòu)造數(shù)據(jù)類(lèi)型,它與int,char,float等系統(tǒng)定義的基本數(shù)據(jù)類(lèi)型具有同等地位,是由用戶(hù)自行定義的。構(gòu)造的數(shù)據(jù)類(lèi)型可以用來(lái)定義變量。(2)結(jié)構(gòu)體類(lèi)型不分配任何存儲(chǔ)空間。相應(yīng)結(jié)構(gòu)體類(lèi)型的變量、數(shù)組及動(dòng)態(tài)開(kāi)辟的存儲(chǔ)單元占存儲(chǔ)空間。結(jié)構(gòu)體變量定義(方法一)先定義結(jié)構(gòu)體類(lèi)型,再單獨(dú)進(jìn)行定義struct結(jié)構(gòu)體名
{成員列表};struct結(jié)構(gòu)體名變量名列表;structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};structstudent
student1,student2;結(jié)構(gòu)體類(lèi)型名變量1變量2注意:
結(jié)構(gòu)體類(lèi)型只是一種數(shù)據(jù)類(lèi)型,不占內(nèi)存空間,只有定義結(jié)構(gòu)體類(lèi)型變量時(shí)才開(kāi)辟內(nèi)存空間。編譯時(shí),僅對(duì)變量分配空間,不對(duì)類(lèi)型分配空間結(jié)構(gòu)體變量定義(方法一)結(jié)構(gòu)體變量定義例如:
structCard { char*face;char*suit; };
structCardc1,c[10],*p;二、在定義類(lèi)型的同時(shí)定義變量structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}
student1,student2;struct
結(jié)構(gòu)體名
{
成員列表
…………
}變量名列表;
緊接著定義變量結(jié)構(gòu)體變量定義(方法二)三、直接定義結(jié)構(gòu)體類(lèi)型變量struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;struct
{
成員列表
…………
}變量名列表;
不出現(xiàn)結(jié)構(gòu)體名結(jié)構(gòu)體變量定義(方法三)結(jié)構(gòu)體類(lèi)型的幾點(diǎn)說(shuō)明
類(lèi)型與變量是完全不同的概念。先定義結(jié)構(gòu)類(lèi)型,再定義變量為該類(lèi)型。
類(lèi)型:不可賦值、存貯、運(yùn)算;系統(tǒng)不分配空間。變量:可賦值、存貯、運(yùn)算;系統(tǒng)要分配空間。結(jié)構(gòu)體中的成員可以象變量一樣使用。例如:struct
date/*聲明一個(gè)結(jié)構(gòu)體類(lèi)型strcutdate*/
{intmonth;intday;intyear;};struct
student/*聲明一個(gè)結(jié)構(gòu)體類(lèi)型strcutstudent*/{int
num;
char
name[20];
char
sex;
int
age;
struct
date
birthday;
/*birthday是structdate類(lèi)型*/
charaddr[30];};先聲明一個(gè)structdate類(lèi)型,它代表“日期”,包括3個(gè)成員:month(月)、day(日)、year(年)。然后在聲明structstudent類(lèi)型時(shí),將成員birthday指定為structdate類(lèi)型。已聲明的類(lèi)型
structdate與其他類(lèi)型一樣可以用來(lái)定義成員的類(lèi)型。圖11-3birthdayaddrNumnamesexageMonthdayyear
成員可以是另一個(gè)結(jié)構(gòu)體變量結(jié)構(gòu)體類(lèi)型的幾點(diǎn)說(shuō)明結(jié)構(gòu)體中的成員也可為結(jié)構(gòu)體變量structstudent{intnum;charname[12];charsex;
struct{intyear;intmonth;intday;}birthday;floatsc[4];};結(jié)構(gòu)體類(lèi)型的附加說(shuō)明結(jié)構(gòu)體類(lèi)型的變量在內(nèi)存按成員的順序排列,所占空間是其全體成員所占空間的總和對(duì)結(jié)構(gòu)體中各個(gè)成員可以單獨(dú)引用、賦值,其作用與普通變量等同。格式:變量名.
成員名
date1.day‘.’——成員運(yùn)算符(優(yōu)先級(jí)最高)成員名可與程序中的變量名相同,但二者無(wú)關(guān)。結(jié)構(gòu)體的成員可以是另一個(gè)結(jié)構(gòu)體類(lèi)型structdate{intmonth;intday;intyear;}date1;structstudent0{intnum;charname[20];date
birthday;};
說(shuō)明:結(jié)構(gòu)體聲明的位置很重要放在main()之前,稱(chēng)為外部聲明;外部聲明可以被其后面的任何函數(shù)使用;放在main()函數(shù)中,稱(chēng)為內(nèi)部聲明;內(nèi)部聲明只能被該聲明所屬的函數(shù)使用;通常應(yīng)使用外部聲明,這樣所有函數(shù)都可以使用這種類(lèi)型的結(jié)構(gòu)。//練習(xí).畫(huà)出下列結(jié)構(gòu)的內(nèi)存設(shè)置圖:
structxyz{shortx;inty;floatz;};xyza;4個(gè)字節(jié)z4個(gè)字節(jié)y2個(gè)字節(jié)x變量astructuvw{charu[10];int*v;intw[5];};uvwb;//練習(xí)畫(huà)出下列結(jié)構(gòu)的內(nèi)存設(shè)置圖:
20個(gè)字節(jié)w[1]w[0]w[4]4個(gè)字節(jié)v......10個(gè)字節(jié)...u[10]變量b結(jié)構(gòu)體類(lèi)型變量初始化structstudent
{intnum;charname[12];charsex;}std1={10101,"LiMing",‘M’};structstrudentstd2={10001,”AA”,’F’};注意:一一對(duì)應(yīng)賦初值,不允許跳躍賦值??芍唤o前面的成員賦值,可以從后面缺省。4結(jié)構(gòu)體變量的引用在定義了結(jié)構(gòu)體變量以后,當(dāng)然可以引用這個(gè)變量。但應(yīng)遵守以下規(guī)則:
(1)不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體進(jìn)行輸入和輸出。例如:已定義student1和student2為結(jié)構(gòu)體變量并且它們已有值。printf(″%d,%s,%c,%d,%f,%\n″,student1);
結(jié)構(gòu)體類(lèi)型變量初始化數(shù)組中的每個(gè)元素是一個(gè)結(jié)構(gòu)體類(lèi)型的數(shù)據(jù),因此將此成員的值依次放在一對(duì)花括號(hào)中例:structbookcard{charnum[5];floatmoney;}bk[3]={{"NO.1",35.5},{"NO.2",25.0},{"NO.3",66.7}};給二維結(jié)構(gòu)體數(shù)組賦初值例struct{charch;inti;floatx;}arr[2][3]={{{'a',1,3e10},{'a',2,4e10},{'a',3,5e10}},{{'b',1,6e5},{'b',2,7e5},{'b',3,8e5}}};如何使用結(jié)構(gòu)體中的成員以下3種形式等價(jià):(p是個(gè)指針)結(jié)構(gòu)體變量.成員名(*p).成員名p->成員名結(jié)構(gòu)體變量的成員可以像普通變量一樣進(jìn)行各種運(yùn)算.
structdata{intmonth;intday;intyear;};structstudent{charname[20];charsex;
databirthday;intsc[4];}std1,arr[5],*p;(1)使用sexstd1.sex(通過(guò)結(jié)構(gòu)體變量引用)引用arr[0]中的sex:
arr[0].sex不能寫(xiě)作arr.sex(*p).sexP->sex(2)引用sc中的元素,如sc[1]:std1.sc[1](通過(guò)結(jié)構(gòu)體變量引用)(3)成員為字符串,如name:(通過(guò)結(jié)構(gòu)體變量引用)
arr[0].name(4)內(nèi)嵌結(jié)構(gòu)體成員的引用,逐層使用成員名定位引用std1中的出生年份,std1.birthday.year如何使用結(jié)構(gòu)體中的成員例是字符串,可以對(duì)它進(jìn)行對(duì)任何字符串允許的操作,包括輸入輸出。對(duì)結(jié)構(gòu)體變量中的每個(gè)成員,可對(duì)它進(jìn)行同類(lèi)變量所允許的任何操作。對(duì)結(jié)構(gòu)體變量中的成員進(jìn)行操作(1)對(duì)name的操作
scanf(“%s”,);注意:不能寫(xiě)成="LiMing”;(2)對(duì)sex的操作 ①scanf(“%c”,&std1.sex); ②for(i=0;i<3;i++) scanf(“%c”,&pers[i].sex); ③std1.sex='M';對(duì)結(jié)構(gòu)體變量中的成員進(jìn)行操作(3)對(duì)birthday中year的操作 ①scanf(“%d”,&std1.birthday.year); ②std1.birthday.year=1962;對(duì)結(jié)構(gòu)體變量中的成員進(jìn)行操作對(duì)結(jié)構(gòu)體變量中的成員進(jìn)行操作整體賦值
structt{inti,j;charname[10];};structtt1={12,48,"LiLi"},t2;t2=t1;其中“t2=t1;”等同于:t2.i=t1.i;t2.j=t1.j;strcpy(,);第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.4對(duì)結(jié)構(gòu)體成員的訪問(wèn)圖10.2程序:結(jié)構(gòu)體訪問(wèn)1/*Fig.10.2:fig10_02.c2Usingthestructurememberand3structurepointeroperators*/4#include<stdio.h>56/*cardstructuredefination*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.4對(duì)結(jié)構(gòu)體成員的訪問(wèn)圖10.2程序:結(jié)構(gòu)體訪問(wèn)7structcard{8char*face;9char*suit;10}/*endstructurecard*/1112intmain(void)13{第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.4對(duì)結(jié)構(gòu)體成員的訪問(wèn)圖10.2程序:結(jié)構(gòu)體訪問(wèn)14structcardaCard;15structcard*cardPtr;1617/*placestringinaCard*/18aCard.face=“Ace”;19aCard.suit=“Spades”;20第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.4對(duì)結(jié)構(gòu)體成員的訪問(wèn)圖10.2程序:結(jié)構(gòu)體訪問(wèn)21cardPtr=&aCard;2223printf(“%s%s%s\n%s%s%s\n%s%s%s\n”,aCard.face,“of”,aCard.suit,24cardPtr->face,“of”,cardPtr->suit,第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.4對(duì)結(jié)構(gòu)體成員的訪問(wèn)圖10.2程序:結(jié)構(gòu)體訪問(wèn)25(*cardPtr).face,“of”,(*cardPtr).suit,26return0;27}/*endmain*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.4對(duì)結(jié)構(gòu)體成員的訪問(wèn)圖10.2程序執(zhí)行結(jié)果AceofSpadesAceofSpadesAceofSpades第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.5在函數(shù)中使用結(jié)構(gòu)體將結(jié)構(gòu)體傳遞給函數(shù)的方式傳遞結(jié)構(gòu)體的個(gè)別成員;值傳遞傳遞整個(gè)結(jié)構(gòu)體:值傳遞當(dāng)結(jié)構(gòu)體包含一個(gè)數(shù)組時(shí),該數(shù)組為值傳遞傳遞一個(gè)指向結(jié)構(gòu)體的指針:引用用typedef聲明類(lèi)型
用typedef聲明一個(gè)新的類(lèi)型名來(lái)代替已有的類(lèi)型名。例如:typedefintINTEGER;//指定用標(biāo)識(shí)符INTEGER代表int類(lèi)型typedeffloatREAL;//指定用REAL代表float類(lèi)型以下兩行等價(jià):①inti,j;floata,b;②INTEGERi,j;REALa,b;第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.6typedef的使用為已定義好的數(shù)據(jù)類(lèi)型創(chuàng)建同義詞typedefstructcardCard;typedefstruct{char*face;char*suit;}Card;structCarddeck[52];第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌1/*Fig.10.3:fig10_3.c2TheCardshufflingdealingprogramusingstructures*/3#include<stdio.h>4#include<stdlib.h>5#include<time.h>67/*cardstructuredefinition*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌8structurecard{9constchar*face;10constchar*suit;11}/*endstructurecard*/1213typedefstructcardCard;14第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌15/*prototypes*/16voidfilldeck(Card*constwDeck,constchar*wFace[],17constchar*wSuit[]);18voidshuffle(Card*constwDeck);19voiddeal(constCard*constwDeck);第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌2021intmain(void)22{23Carddeck[52];2425/*initializearrayofpointers*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌26constchar*face[]={“Ace”,“Deuce”,“Three”,“Four”,27“Five”,“Six”,“Seven”,“Eight”,28“Nine”,“Ten”,“Jack”,“Queen”,“King”};2930/*initializearrayofpointers*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌31constchar*suit[4]={“Hearts”,“Diamonds”,“Clubs”,“Spades”};3233srand(time(NULL));3435fillDeck(deck,face,suit);36shuffle(deck);第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌37deal(deck,face,suit);38return0;39}/*endmain*/4041/*placestringsintocardstructure*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌42voidfillDeck(Card*constwDeck,constchar*wFace,43constchar*wSuit)44{45inti;4647/*loopthroughwDeck*/48for(i=0;i<=51;i++){第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌49wDeck[i].face=wFace[i%13];50wDeck[i].suit=wSuit[i/13];51}/*endfor*/52}/*endfillDeck*/5354/*shufflecards*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌55voidshuffle(Card*constwDeck)56{57inti;58intj;/*0-51randomvalue*/59Cardtemp;6061/*koopthroughwDeckrandomlyswappingCards*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌62for(i=0;i<=51;i++){63j=rand()%52;64temp=wDick[i];65wDeck[i]=wDeck[j];66wDeck[j]=temp;67}/*endfor*/68}/*endshuffle*/69第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌70/*dealcards*/71voiddeal(constCard*constwDeck)72{73inti;7475/*loopthrouthwDeck*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序:用結(jié)構(gòu)體數(shù)組來(lái)表示紙牌76for(i=0;card<=51;i++){77printf(“%5sof%-8s%s”,wDeck[i].face,wDeck[i].suit,78(i+1)%4?““:“\n”);79}/*endfor*/80}/*enddeal*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.7實(shí)例:高性能的洗牌與發(fā)牌模擬圖10.3程序執(zhí)行結(jié)果
鏈表的概念的引出//定義結(jié)構(gòu)體數(shù)組存儲(chǔ)80個(gè)學(xué)生信息
structstudent{intnum;floatscore;}stu[80];
用結(jié)構(gòu)體數(shù)組只能靜態(tài)存儲(chǔ)數(shù)據(jù)定長(zhǎng)連續(xù)存放89stu[0]100167.5stu[1]1002stu[2]100356...stu[79]1000numscore學(xué)生1:100189學(xué)生2:100267.5學(xué)生3:100356…學(xué)生80:…2000100189100267.51003561000300030002000NULL.........鏈表:不定長(zhǎng);鏈表的每一個(gè)元素稱(chēng)為結(jié)點(diǎn),其組成:若干數(shù)據(jù)成員;
指向下一個(gè)結(jié)點(diǎn)的指針成員;按需分配結(jié)點(diǎn)存放數(shù)據(jù),不用時(shí)隨時(shí)釋放;頭結(jié)點(diǎn);頭指針:head;尾結(jié)點(diǎn);空指針:NULL#defineNULL01000Head
891001200067.510023000561003NULL100020003000用鏈表存儲(chǔ)結(jié)構(gòu)指針存儲(chǔ)結(jié)構(gòu)
邏輯結(jié)構(gòu)用結(jié)構(gòu)體類(lèi)型描述鏈表結(jié)點(diǎn)structstudent{intnum;floatscore;student*next;};student*head;5610031000891001NULL2000head20003000100067.510023000scorenumnext結(jié)點(diǎn)類(lèi)型遞歸定義建立鏈表的過(guò)程
生成頭結(jié)點(diǎn);//head指向頭結(jié)點(diǎn) 將其余結(jié)點(diǎn)逐個(gè)加入鏈表; 生成尾結(jié)點(diǎn);//尾結(jié)點(diǎn)指針域?yàn)椋危眨蹋?7.71002300088.51003NULL1000head1000200030009910012000
生成頭結(jié)點(diǎn);//head指向頭結(jié)點(diǎn) 將其余結(jié)點(diǎn)逐個(gè)加入鏈表; 生成尾結(jié)點(diǎn);//尾結(jié)點(diǎn)指針域?yàn)椋危眨蹋蘳tructstudent{intnum;floatscore;student*next;}s1={1001,99},s2={1002,77.7},s3={1003,88.5};
77.71002
88.51003
100020003000991001
s1s2s3建立鏈表的過(guò)程建立鏈表的過(guò)程
生成頭結(jié)點(diǎn);//head指向頭結(jié)點(diǎn) 將其余結(jié)點(diǎn)逐個(gè)加入鏈表; 生成尾結(jié)點(diǎn);//尾結(jié)點(diǎn)指針域?yàn)椋危眨蹋蘳tructstudent{intnum;floatscore;student*next;}s1={1001,99},s2={1002,77.7},s3={1003,88.5};77.71002
88.51003
1000head100020003000991001
s1s2s3建立鏈表的過(guò)程
生成頭結(jié)點(diǎn);//head指向頭結(jié)點(diǎn)
將其余結(jié)點(diǎn)逐個(gè)加入鏈表; 生成尾結(jié)點(diǎn);//尾結(jié)點(diǎn)指針域?yàn)椋危眨蹋蘳tructstudent{intnum;floatscore;student*next;}s1={1001,99},s2={1002,77.7},s3={1003,88.5};
77.71002300088.51003NULL1000head1000200030009910012000s1s2s3建立鏈表的過(guò)程
structstudent{intnum;floatscore;student*next;}s1={1001,99},s2={1002,77.7},s3={1003,88.5};intmain(){student*head;head=&s1;s1.next=&s2;s2.next=&s3;s3.next=NULL;
…}77.71002300088.51003NULL1000head1000200030009910012000s1s2s3
建立一個(gè)鏈表intmain(){
student*head;//生成頭結(jié)點(diǎn)
head=&s3;
//連接鏈表其余結(jié)點(diǎn)
s3.next=&s1;s1.next=&s2;
//生成尾結(jié)點(diǎn)
s2.next=NULL;…}s3->s1->s2
3000Head991001
100077.71002
2000300088.5100310002000NULLs3s1s2
2000&s299100177.7100288.510031000&s13000&s3
.........991001200077.71002NULL3000head30001000200088.510031000定義一個(gè)指向鏈表結(jié)點(diǎn)類(lèi)型的輔助指針變量pp=head;//p指向頭結(jié)點(diǎn)
do{cout<<p->num<<‘’<<p->score<<endl;p=p->next;}while(p!=NULL);
p//輸出*p結(jié)點(diǎn)數(shù)據(jù)//p指向下一個(gè)結(jié)點(diǎn)pp遍歷鏈表:依次輸出各個(gè)結(jié)點(diǎn)的數(shù)據(jù)30001000
共用體類(lèi)型(union)
幾種不同類(lèi)型的變量存放到同一段內(nèi)存單元中。例如把一個(gè)整型變量、一個(gè)字符型變量、一個(gè)雙精度型變量放在同一個(gè)地址開(kāi)始的內(nèi)存單元中.變量在內(nèi)存中占的字節(jié)數(shù)不同,但都從同一地址開(kāi)始存放。這種使幾個(gè)不同的變量共占同一段內(nèi)存的結(jié)構(gòu),稱(chēng)為共用體(union)類(lèi)型的結(jié)構(gòu)。聲明共用體類(lèi)型的一般形式為
union共用體類(lèi)型名{成員表列};定義共用體變量的一般形式為共用體類(lèi)型名共用體變量名;共用體類(lèi)型(union)union
data{charch;shortinti;floatf;};
共用體關(guān)鍵字:union
共用體類(lèi)型名:data共用體成員變量:
charch;shortinti;floatf;內(nèi)存設(shè)置圖(union
data)chif共用體能夠存儲(chǔ)不同的數(shù)據(jù)類(lèi)型,但每次只能存儲(chǔ)其中的一種類(lèi)型;共用體的長(zhǎng)度為其最大成員的長(zhǎng)度引用和賦值dataa,b,*p;P=&b;共用體變量成員賦值a.ch='h';a.i=120;a.f=12.34;p->ch='h',p->i=120;p->f=12.34;uniondata{charch;inti;floatf;};hich
變量af1000ich
變量bf2000...p...12012.34
共用體指針p指向共用體變量bp=&b;2000h12012.34
unionun{charstr[10];struct{shortintx;shortinty;floatz;}dat;};una;
//定義un型變量a//引用舉例a.str[0]='h';a.dat.x=12;a.dat.y=12345;a.dat.z=3.14;strcpy(a.str,”helloabc”);內(nèi)存設(shè)置圖(unionun)xyzstr例畫(huà)出以下共用體類(lèi)型的內(nèi)存設(shè)置圖共用體的應(yīng)用舉例strcutwidget{charbrand[20];//名稱(chēng)
inttype;//類(lèi)別
unionid{longid_num;charid_char[20];}id_val;//商品id};…structwidgetprize;…if(prize.type==1)//根據(jù)類(lèi)別的不同取值決定id的用法
scanf(“%ld”,&prize.id_val.id_num);elsescanf(“%c”,&prize.id_val.id_char);共用體的用途之一——當(dāng)數(shù)據(jù)項(xiàng)使用兩種或更多種格式(但不會(huì)同時(shí)使用)時(shí),可節(jié)省空間。例如:一個(gè)管理小商品目錄,其中有一些商品的ID為整數(shù),而另一些的ID為字符串;共用體類(lèi)型數(shù)據(jù)的特點(diǎn)(1)使用共用體變量的目的是希望用同一個(gè)內(nèi)存段存放幾種不同類(lèi)型的數(shù)據(jù)。但請(qǐng)注意:在每一瞬時(shí)只能存放其中一種,而不是同時(shí)存放幾種。(2)能夠訪問(wèn)的是共用體變量中最后一次被賦值的成員,在對(duì)一個(gè)新的成員賦值后原有的成員就失去作用。(3)共用體變量的地址和它的各成員的地址都是同一地址。(4)不能對(duì)共用體變量名賦值;不能企圖引用變量名來(lái)得到一個(gè)值;不能在定義共用體變量時(shí)對(duì)它初始化;不能用共用體變量名作為函數(shù)參數(shù)。72unionun{inti;doubley;};structst{chara[10];unionunb;};printf(“%d”,sizeof(structst));1873voidmain(void){unionEXAMPLE{struct{intx;inty;}in;inta,b;}e;e.a=1;e.b=2;e.in.x=e.a*e.a;e.in.y=e.b+e.b;printf(“%d%d”,&e.in.x,e.in.y);}inxyabb1248輸出:48第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符位運(yùn)算符用于處理整型操作數(shù)的各個(gè)二進(jìn)制數(shù)位。將各類(lèi)數(shù)據(jù)當(dāng)作無(wú)符號(hào)整型數(shù)處理位運(yùn)算符種類(lèi)按位與:&,按位或:¦,按位異或:^左移:<<,右移:>>按位取反:~第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符位運(yùn)算符種類(lèi)第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.7程序:按位顯示一個(gè)無(wú)符號(hào)整數(shù)1/*Fig.10.7:fig10_07.c*/2Printinganunsignedintegerinbits*/3#include<stdio.h>45voiddisplayBits(unsignedvalue);6第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.7程序:按位顯示一個(gè)無(wú)符號(hào)整數(shù)7intmain(void)8{9unsignedx;1011printf(“Enteranunsignedinteger:“);12scanf(“%u”,&x);第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.7程序:按位顯示一個(gè)無(wú)符號(hào)整數(shù)1314displayBits(x);15return0;16}/*endmain*/1718/*displaybitsofanunsignedintegervalue*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.7程序:按位顯示一個(gè)無(wú)符號(hào)整數(shù)19voiddisplayBits(unsignedvalue)20{21unsignedc;2223/*definedisplayMaskandleftshift31bits*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.7程序:按位顯示一個(gè)無(wú)符號(hào)整數(shù)24unsigneddisplayMask=1<<31;2526printf(“%10u=”,value);2728/*loopthroughbits*/29for(c=1;c<=32;c++)第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.7程序:按位顯示一個(gè)無(wú)符號(hào)整數(shù)30putchar(value&displayMask?‘1’:‘0’);31value<<=1;3233if(c%8==0){34putchar(‘‘);35}/*endif*/36}/*endfor*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.7程序:按位顯示一個(gè)無(wú)符號(hào)整數(shù)3738putchar(‘\n’);39}/*enddisplayBits*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.7程序執(zhí)行結(jié)果Enteranunsignedinteger:6500065000=00000000000000001111110111101000第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用1/*Fig.10.9:fig10_09.c2UsingthebitwiseAND,bitewiseOR,bitewise3exclusiveORandbitwise
complementoperators*/4#include<stdio.h>5第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用6voiddisplayBits(unsignedvalue);78intmain(void)9{10unsignednumber1;11unsignednumber2;/*異或*/12unsignedmask;/*與運(yùn)算*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用13unsignedsetBits;/*或運(yùn)算*/1415/*demonstrateAND(&)*/16number1=65535;17mask=1;18printf(“Theresultofcombiningthefollowing\n”);第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用19displayBits(number1);20displayBits(mask);21printf(“usingthebitwiseANDoperator&is\n”);22displayBits(number1&mask);2324/*demonstrateinclusiveOR(|)*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用25number1=15;26setBits=241;27printf(“Theresultofcombiningthefollowing\n”);28displayBits(number1);29displayBits(setBits);第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用30printf(“usingthebitwiseinclusiveORoperator|is\n”);31displayBits(number1|mask);3233/*demonstrateexclusiveOR(^)*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用34number1=139;35number2=199;36printf(“Theresultofcombiningthefollowing\n”);37displayBits(number1);38displayBits(number2);39printf(“usingthebitwiseexcluseveORoperator^is\n”);第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用40displayBits(number1^number2);4142/*demonstratebitwisecomplement(~)*/43number1=21845;44printf(“\nTheone’scomplementof\n”);第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用45displayBits(number1);46printf(“is\n”);47displayBits(~number1);48return0;49}/*endmain*/50第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用51/*displaybitsofanunsignedintegervalue*/52voiddisplayBits(unsignedvalue)53{54unsignedc;5556/*declaredisplayMaskandleftshift31bits*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用57unsigneddisplayMask=1<<31;5859printf(“%10u=”,value);6061/*loopthroughbits*/62for(c=1;c<=32;c++)第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用63putchar(value&displayMask?‘1’:‘0’);64value<<=1;6566if(c%8==0){67pucchar(‘‘);68}/*endif*/69}/*endfor*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序:按位與、或等運(yùn)算符的使用7071putchar(‘\n’);72}/*enddisplayBits*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序執(zhí)行結(jié)果Theresultofcombiningthefollowing65535=000000000000000011111111111111111=0000000000000000
00000000
00000001usingthebitwiseANDoperator&is1=0000000000000000
00000000
00000001第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序執(zhí)行結(jié)果Theresultofcombiningthefollowing15=0000000000000000
00000000
00001111241=0000000000000000
00000000
11110001usingtheincluseveORoperator|is255=0000000000000000
00000000
11111111第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序執(zhí)行結(jié)果Theresultofcombiningthefollowing139=0000000000000000
0000000010001011199=0000000000000000
00000000
11000111usingtheexclusiveORoperator^is76=0000000000000000
00000000
01001100第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.9程序執(zhí)行結(jié)果Theone’scomplementof21845=00000000000000000101010101010101is4294945450=11111111111111111010101010101010第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.13程序:按位左移和右移1/*Fig.10.13:fig10_13.c2Usingtheshiftoperators*/3#include<stdio.h>45voiddisplayBits(unsignedvalue);67intmain(void)8{第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.13程序:按位左移和右移9unsignednumber1=960;1011/*demonstrateleftshift*/12printf(“\nTheresultofleftshifting\n”);13displayBits(number1);14printf(“8bitpositionsusingthe”);第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.13程序:按位左移和右移15printf(“l(fā)efttshiftoperator<<is\n”);16displayBits(number1<<8);1718/*demonstraterightshift*/19printf(“\nTheresultofrightshifting\n”);第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.13程序:按位左移和右移20displayBits(number1);21printf(“8bitpositionsusingthe”);22printf(“rightshiftoperator>>is\n”);23displayBits(number1>>8);24return0;25}/*endmain*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.13程序:按位左移和右移2627/*displaybitsofanunsignedintegervalue*/28voiddisplayBits(unsignedvalue)29{30unsignedc;3132/*definedisplayMaskandleftshift31bits*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.13程序:按位左移和右移33unsigneddisplayMask=1<<31;3435printf(“%7u=”,value);3637/*loopthroughbits*/38for(c=1;c<=32;c++)第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.13程序:按位左移和右移39putchar(value&displayMask?‘1’:‘0’);40value<<=1;4142if(c%8==0){43pucchar(‘‘);44}/*endif*/45}/*endfor*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.13程序:按位左移和右移4647putchar(‘\n’);48}/*enddisplayBits*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.13程序執(zhí)行結(jié)果Theresultofleftshifting960=0000000000000000
00000011110000008bitspositionsusingtheleftshiftoperator<<is245760=0000000000000011
1100000000000000第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符圖10.13程序執(zhí)行結(jié)果Theresultofrightshifting960=0000000000000000
00000011110000008bitspositionsusingtherightshiftoperator<<is3=00000000000000000000000000000011第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符例:將一個(gè)整數(shù)的二進(jìn)制位顛倒過(guò)來(lái)請(qǐng)編寫(xiě)一個(gè)程序,顛倒一個(gè)無(wú)符號(hào)整數(shù)的二進(jìn)制位的順序。該程序請(qǐng)用戶(hù)輸入一個(gè)無(wú)符號(hào)整數(shù)值,然后調(diào)用函數(shù)reverseBits來(lái)打印其反序的二進(jìn)制位。按二進(jìn)制格式打印該整數(shù)顛倒處理前后的值,以驗(yàn)證數(shù)位已被正確地顛倒了。第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符例:將一個(gè)整數(shù)的二進(jìn)制位顛倒過(guò)來(lái)/*hw10_17.c*/#include<stdio.h>#include<ctype.h>
voiddisplayBits(unsignedvalue);voidreverseBits(unsignedvalue);
第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符例:將一個(gè)整數(shù)的二進(jìn)制位顛倒過(guò)來(lái)intmain(){
unsignedintu;
printf("請(qǐng)輸入一個(gè)無(wú)符號(hào)整型數(shù):");
scanf("%u",&u);
printf("%u的二進(jìn)制編碼是:\n",u);
displayBits(u);第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符例:將一個(gè)整數(shù)的二進(jìn)制位顛倒過(guò)來(lái)
printf("%u的反序二進(jìn)制編碼是:\n",
u);
reverseBits(u);
printf("\n");
return0;}/*endmain*/第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符例:將一個(gè)整數(shù)的二進(jìn)制位顛倒過(guò)來(lái)voiddisplayBits(unsignedvalue){
unsignedc;
unsigneddisplayMask=1<<31;
printf("%10u=",value);
第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符例:將一個(gè)整數(shù)的二進(jìn)制位顛倒過(guò)來(lái)/*loopthroughbits*/for(c=1;c<=32;c++) {
putchar(value&displayMask?
'1':'0');value<<=1;
if(c%8==0){
putchar('');第10章結(jié)構(gòu)體、共用體、位操作和枚舉類(lèi)型10.9位運(yùn)算符例:將一個(gè)整數(shù)的二進(jìn)制
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)一年級(jí)加減法口算100道A4直接打印
- 小學(xué)五年級(jí)數(shù)學(xué)上期小數(shù)點(diǎn)乘除法計(jì)算習(xí)題
- 中國(guó)中學(xué)生心理健康量表共60項(xiàng)-分為10個(gè)因子-各因子所包
- 企業(yè)財(cái)務(wù)報(bào)表附注
- 《華為管理之道教材》課件
- 電火焊工必知必會(huì)知識(shí)點(diǎn)
- 食品行業(yè)食品安全檢測(cè)總結(jié)
- 健身行業(yè)的個(gè)人發(fā)展規(guī)劃計(jì)劃
- 印刷行業(yè)印刷排版培訓(xùn)總結(jié)
- 紡織業(yè)人事工作總結(jié)
- 《廣東省普通高中學(xué)生檔案》模板
- GB/T 41120-2021無(wú)損檢測(cè)非鐵磁性金屬材料脈沖渦流檢測(cè)
- GB/T 2-2016緊固件外螺紋零件末端
- GB/T 12467.5-2009金屬材料熔焊質(zhì)量要求第5部分:滿(mǎn)足質(zhì)量要求應(yīng)依據(jù)的標(biāo)準(zhǔn)文件
- GB 17740-1999地震震級(jí)的規(guī)定
- 安全生產(chǎn)事故舉報(bào)獎(jiǎng)勵(lì)制度
- 冠心病健康教育完整版課件
- 國(guó)家開(kāi)放大學(xué)《理工英語(yǔ)1》單元自測(cè)8試題答案
- 重癥患者的容量管理課件
- 期貨基礎(chǔ)知識(shí)TXT
- 《尖利的物體會(huì)傷人》安全教育課件
評(píng)論
0/150
提交評(píng)論