基本數(shù)據(jù)類(lèi)型
整型int,long,字符型char,浮點(diǎn)型float、double,常用的基本數(shù)據(jù)類(lèi)型就這些。
結(jié)構(gòu)體
結(jié)構(gòu)體可以理解為開(kāi)發(fā)者用已有的數(shù)據(jù)類(lèi)型為原料組合成的數(shù)據(jù)類(lèi)型。例如數(shù)組就是這樣的類(lèi)型,數(shù)組其實(shí)就是我們開(kāi)發(fā)者自己定義的一個(gè)數(shù)據(jù)類(lèi)型,由多個(gè)相同數(shù)據(jù)類(lèi)型的變量組合而所得,例如:
int a[maxSize];
上面這句話(huà)相當(dāng)于把maxSize個(gè)int型變量擺在一起,其中各個(gè)int型變量之間的關(guān)系由數(shù)組的下標(biāo)反映。
試想,如果我們想要定義這樣的數(shù)組,這個(gè)數(shù)組里面第一個(gè)變量是整形的,第二個(gè)變量是字符型的,第三個(gè)變量是浮點(diǎn)型的,此時(shí)就需要用到結(jié)構(gòu)體。
結(jié)構(gòu)體是系統(tǒng)提供給程序員制作新數(shù)據(jù)類(lèi)型的一種機(jī)制,即可以用系統(tǒng)已有的不同的基本數(shù)據(jù)類(lèi)型或用戶(hù)定義的結(jié)構(gòu)型,組合成用戶(hù)需要的復(fù)雜數(shù)據(jù)類(lèi)型。
剛剛提到的那個(gè)“奇怪的數(shù)組”,可以用結(jié)構(gòu)體實(shí)現(xiàn)如下:
typedef struct
{
int a;
char b;
float c;
} MyType;
現(xiàn)有語(yǔ)句如下:
MyType a[3];
思考一下,上面這句話(huà)是什么意思呢?
顯然,上面這句話(huà)定義了一個(gè)數(shù)組,這個(gè)數(shù)組由3個(gè)MyType類(lèi)型的元素組成。
因?yàn)榍懊嬉呀?jīng)定義好了MyType類(lèi)型的數(shù)據(jù)結(jié)構(gòu),MyType其實(shí)含有3個(gè)分量。
因此其實(shí)你可以把a(bǔ)類(lèi)比為一個(gè)二維數(shù)組。
就好像下面這句話(huà):
int b[3][3];
上面這句話(huà)定義了一個(gè)名字為b的二維數(shù)組,二維數(shù)組可以看成一個(gè)一維數(shù)組,其數(shù)組元素也是一個(gè)一維數(shù)組。
b中取第一個(gè)元素的第一個(gè)分量:
b[0][0]
a中取第一個(gè)元素的第一個(gè)分量:
a[0].a
指針
變量里面裝的是數(shù)據(jù)元素的內(nèi)容。
指針里面裝的是變量的地址。
通過(guò)指針可以找出變量在內(nèi)存中的位置。
指針對(duì)于每種數(shù)據(jù)類(lèi)型都有特定的定義方法,有專(zhuān)門(mén)指向int的指針,也有專(zhuān)門(mén)指向float的指針...
對(duì)于每種變量,其指針的定義規(guī)則類(lèi)似:
int *a ;
char *b ;
float *c ;
MyType *d ;
上面這段話(huà)表示:指向整形變量的指針a,指向字符型變量的指針b...
指針變量的定義只是在變量名前面多了一個(gè)*號(hào)
如果a是一個(gè)指針型變量,且這個(gè)指針型變量已經(jīng)指向了一個(gè)變量b,則a中存放的就是變量b的地址
*a
上面這句話(huà)表示取變量a中的內(nèi)容,其實(shí)就相當(dāng)于b
&b
上面這句話(huà)表示取變量b的地址
a = &b ;
上面這句話(huà)表示,將變量b的地址存放于指針a中,也可以叫做指針a指向b
鏈表結(jié)點(diǎn)的構(gòu)造
鏈表結(jié)點(diǎn)有2個(gè)域,即數(shù)據(jù)域和指針域。數(shù)據(jù)域存放數(shù)據(jù),指針域存放下一個(gè)結(jié)點(diǎn)的位置
鏈表結(jié)點(diǎn)的結(jié)構(gòu)型定義為:
typedef struct Node
{
int data ;
struct Node *next;
}Node ;
上面這段話(huà)的含義,請(qǐng)仔細(xì)理解一下
首先結(jié)構(gòu)型的名字為Node
因?yàn)榻M成此結(jié)構(gòu)體的成員中有一個(gè)指向和自己類(lèi)型相同的變量的指針
并且內(nèi)部要用自己來(lái)定義這個(gè)指針,所以要寫(xiě)成:
struct Node *next;
凡是結(jié)構(gòu)體a內(nèi)部含義指針b
并且b是用來(lái)存放和a類(lèi)型相同的結(jié)構(gòu)體變量地址的指針類(lèi)型(比如說(shuō)鏈表的應(yīng)用場(chǎng)景,鏈表中結(jié)點(diǎn)的指針域指向的也是結(jié)點(diǎn)變量)
則在定義結(jié)構(gòu)體時(shí),a的typedef struct語(yǔ)句之后要加上a這個(gè)結(jié)構(gòu)體的名字,比如上面的Node
從語(yǔ)法上來(lái)說(shuō),這里的兩個(gè)Node可以是不一樣的,編譯器也不會(huì)報(bào)錯(cuò),但是從程序的可讀性而言,最好這兩處的名稱(chēng)是一樣的
二叉樹(shù)結(jié)點(diǎn)的構(gòu)造
二叉樹(shù)的結(jié)點(diǎn)其實(shí)和鏈表的結(jié)點(diǎn)差不多,直接看代碼:
typedef stuct BTNode
{
int data ;
struct BTNode *lchid;
struct BTNode *rchild;
}BTNode;
代碼不難理解,和剛剛鏈表結(jié)點(diǎn)的構(gòu)造差不多
當(dāng)然如果要寫(xiě)得復(fù)雜點(diǎn),還可以這樣寫(xiě):
typedef stuct BTNode
{
int data ;
struct BTNode *lchid;
struct BTNode *rchild;
}BTNode,*btnode;
可以發(fā)現(xiàn),后面多寫(xiě)了個(gè)*btnode,為什么要這樣寫(xiě)呢?
考慮我們要定義一個(gè)結(jié)點(diǎn)指針p
如果用第一種定義方法(比較簡(jiǎn)單的那個(gè)),我們需要這樣寫(xiě):
BTNode *p ;
如果你用第二種定義方法(比較復(fù)雜的那個(gè),后面加了點(diǎn)東西)。我們可以這樣寫(xiě):
btnode p ;
兩種方法各有利弊:
簡(jiǎn)單的方法利于理解,但是你定義結(jié)點(diǎn)的時(shí)候需要多寫(xiě)一點(diǎn),不容易搞混
復(fù)雜的方法寫(xiě)的時(shí)候復(fù)雜,但是定義的時(shí)候可以少寫(xiě)一點(diǎn),容易搞混
下面介紹制作新結(jié)點(diǎn)的方法:
第一種方法這么寫(xiě)
BTNode BT ;
訪(fǎng)問(wèn)的時(shí)候這樣寫(xiě)(結(jié)構(gòu)體變量直接取其分量)
x = BT.data ;
該方法只用一句話(huà)就制作了一個(gè)結(jié)點(diǎn)
但是我們一般不會(huì)這么寫(xiě),而采用如下方法
第二種方法這么寫(xiě)
BTNode *BT ;
BT = (BtNode*)malloc(sizeof(BTNode));
首先定義一個(gè)節(jié)點(diǎn)的額指針BT
然后使用函數(shù)malloc申請(qǐng)一個(gè)結(jié)點(diǎn)的內(nèi)存空間
最后讓BT指向這片內(nèi)存空間
其中malloc函數(shù)是系統(tǒng)提供的內(nèi)存分配函數(shù)
當(dāng)然BT可以離開(kāi)這個(gè)結(jié)點(diǎn)而轉(zhuǎn)向其他結(jié)點(diǎn),所以說(shuō)第二種方法比較靈活
訪(fǎng)問(wèn)的時(shí)候這樣寫(xiě)(指向結(jié)構(gòu)體變量的指針取結(jié)構(gòu)體的分量)
x = BT -> data ;
當(dāng)然你也可以這樣寫(xiě)
x = (*BT).data ;
動(dòng)態(tài)申請(qǐng)數(shù)組空間
剛剛是一次只申請(qǐng)一個(gè)結(jié)點(diǎn),其實(shí)還有一次申請(qǐng)一組結(jié)點(diǎn)的方法
假設(shè)申請(qǐng)一個(gè)數(shù)組,數(shù)組內(nèi)的元素類(lèi)型為int型,長(zhǎng)度為n,當(dāng)然了,此處的int可以換成任意的數(shù)據(jù)類(lèi)型,包括你自己定義的結(jié)構(gòu)體類(lèi)型
int *p ;
p = (int *)malloc(n * sizeof(int)) ;
上述語(yǔ)句申請(qǐng)了一個(gè),由p指向的,元素為int類(lèi)型的,長(zhǎng)度為n的動(dòng)態(tài)數(shù)組
當(dāng)然p指向的是數(shù)組中第一個(gè)元素的地址
取元素的時(shí)候,和一般的靜態(tài)數(shù)組都是一樣的
對(duì)比
對(duì)比制作結(jié)點(diǎn)的第二種方法和動(dòng)態(tài)申請(qǐng)數(shù)組空間的方法,其不同之處僅僅在于,sizeof運(yùn)算符前要乘以n
請(qǐng)注意sizeof是運(yùn)算符,不是函數(shù)
typedef
typedef就是給現(xiàn)有的數(shù)據(jù)類(lèi)型起一個(gè)別名
比如typedef struct{...} TypeA
就是給struct{...}取一個(gè)別名TypeA
# define
給常量取個(gè)別名
給0、1取ERROR、OK以及maxSize等常數(shù)的別名上用的比較多
?
本文摘自 :https://blog.51cto.com/u