初步剖析C語言編程中的結(jié)構(gòu)體_第1頁
初步剖析C語言編程中的結(jié)構(gòu)體_第2頁
初步剖析C語言編程中的結(jié)構(gòu)體_第3頁
初步剖析C語言編程中的結(jié)構(gòu)體_第4頁
初步剖析C語言編程中的結(jié)構(gòu)體_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

本文格式為Word版,下載可任意編輯——初步剖析C語言編程中的結(jié)構(gòu)體C語言布局體,可謂是C強大功能之一,也是C++語言之所以能衍生的有利條件,事實上,當(dāng)布局體中成員中有函數(shù)指針了后,那么,布局體也即C++中的類了。接待大家閱讀!更多相關(guān)信息請關(guān)注相關(guān)欄目!

C語言中,布局體的聲明、定義是用到關(guān)鍵字struct,就像聯(lián)合體用到關(guān)鍵字union、枚舉類型用到enum關(guān)鍵字一樣,事實上,聯(lián)合體、枚舉類型的用法幾乎是參照布局體來的。布局體的聲明格式如下:

structtag-namemember1;…memberN;;

因此,定義布局體變量的語句為:structtag-namevarible-name,如structpointpt;其中,point為tag-name,pt是布局體structpoint變量。當(dāng)然,也可以一次性聲明布局體類型和變量,即如下:structtag-name…x,y,z;就類似于intx,y,z;語句一樣。也可以在定義布局體變量時即賦初值,即變量初始化,structpointpt=320,200;

當(dāng)然,也就可以有布局體指針、布局體數(shù)組了。訪問布局體變量中的member的方法有:假設(shè)是由布局體變量名來訪問,那么是structure-variable-name.member;假設(shè)是由布局體變量指針來訪問,那么是structure-variable-pointer-member;

好了,上面的不是重點,也不難掌管,只是細(xì)節(jié)問題。布局體具有重要的應(yīng)用,如下的:

如自引用的布局體,常用來作為二叉樹等重要數(shù)據(jù)布局的實現(xiàn):假設(shè)我們要實現(xiàn)一個普遍的問題的解決算法——統(tǒng)計某些輸入的各單詞展現(xiàn)的頻數(shù)。由于輸入的單詞數(shù)是未知,內(nèi)容未知,長度未知,我們不能對輸入舉行排序并采用二分查找?!敲?,一種解決手段是:將已知的單詞排序——通過將每個到達(dá)的單詞排序到適當(dāng)位置。當(dāng)然,實現(xiàn)此功能不能通過線性排序,由于那樣有可能很長,相應(yīng)地,我們將使用二叉樹來實現(xiàn)。該二叉樹每一個單詞為一個二叉樹結(jié)點,每個結(jié)點包括:

apointertothetextofthewordacountofthenumberofoccurencesapointertotheleftchildnodeapointertotherightchildnode

其寫在程序中,即:

structtnode/*thetreenode:*/char*word;/*pointstothenext*/intcount;/*numberofoccurences*/structtnode*left;/*leftchild*/structtnode*right;/*rightchild*/

完成上述功能的完整程序如下:

#include#include#include#includetNode.h

#defineMAXWORD100structtnode*addtreestructtnode*,char*;voidtreeprintstructtnode*;intgetwordchar*,int;

structtnode*tallocvoid;char*strdup2char*;

/*wordfrequencycount*/main

structtnode*root;

charword[MAXWORD];

root=NULL;

whilegetwordword,MAXWORD!=EOF

ifisalphaword[0]

root=addtreeroot,word;

treeprintroot;

return0;

#defineBUFSIZE100charbuf[BUFSIZE];/*bufferforungetch*/

intbufp=0;/*nextfreepositioninbuf*/

intgetchvoid/*getapossiblypushedbackcharacter*/

returnbufp0?buf[--bufp]:get;

voidungetchintc/*pushbackcharacteroninput*/

ifbufp=BUFSIZE

printfungetch:toomanycharactersn;

else

buf[bufp++]=c;

/*getword:getnextwordorcharacterfrominput*/intgetwordchar*word,intlim

intc,getchvoid;

voidungetchint;

char*w=word;

whileisspacec=getch;

ifc!=EOF

*w++=c;

if!isalphac

*w=;

returnc;

for;--lim0;w++

if!isalnum*w=getch

ungetch*w;

break;

*w=;

returnword[0];

/*addtree:addanodewithw,atorbelowp*/structtnode*addtreestructtnode*p,char*w

intcond;

ifp==NULL/*anewwordhasarrived*/

p=talloc;/*makeanewnode*/

p-word=strdupw;

p-count=1;

p-left=p-right=NULL;

elseifcond=strcmpw,p-word==0

p-count++;/*repeatedword*/

elseifcond0less=than=into=left=p-=left=addtreep-left,w;

else/*greaterthanintorightsubtree*/

p-right=addtreep-right,w;

returnp;/*treeprint:in-orderprintoftreep*/voidtreeprintstructtnode*p

ifp!=NULL

treeprintp-left;

printf%4d%sn,p-count,p-word;

treeprintp-right;

#include/*talloc:makeatnode*/structtnode*tallocvoid

returnstructtnode*mallocsizeofstructtnode;

char*strdup2char*s/*makeaduplicateofs*/

char*p;

p=char*mallocstrlens+1;/*+1for*/

ifp!=NULL

strcpyp,s;

returnp;

其中,其它的關(guān)于union、enum這里就不多說了,再說一個關(guān)于布局體的分外重要的應(yīng)用——位操作:

當(dāng)然,我們知道,對于位操作,我們可通過#definetables(即用宏和C中的位操作來實現(xiàn))

如:

#defineKEYWORD01/*0001*/#defineEXTERNAL02/*0010*/#defineSTATIC04/*0100*/

enumKEYWORD=01,EXTERNAL=02,STATIC=04;

那么,flags|=EXTERNAL|STATIC;將開啟flags的EXTERNAL和STATIC位,而

flags=~EXTERNAL|STATIC;將關(guān)閉flags的EXTERNAL和STATIC位.

然而,上述定義的位模式可以用布局體如下寫:

structunsignedintis_keyword:1;unsignedintis_extern:1;unsignedintis_static:1;f

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論