? ? ? ?我是一名編程自學(xué)者。只學(xué)了java由于沒有C語言指針基礎(chǔ),所以學(xué)大話數(shù)據(jù)結(jié)構(gòu)很是費(fèi)勁。今天我把自己遇到的疑惑解答出來,希望后來者可以少爬一些坑,也當(dāng)做是我個(gè)人的學(xué)習(xí)筆記。
進(jìn)入正題
今天解答鏈表操作方法參數(shù)中什么時(shí)候帶*號,什么時(shí)候不帶*比如Status GetElement(LinkList L,int i,ElemeType *e) L之前沒有*。
Status LinkInsert(LinkList *L,int i,ElemType e) L之前帶了*
首先線性表單鏈表的存儲(chǔ)結(jié)構(gòu)如下:
typedef struct Node//這是定義結(jié)構(gòu)體變量的格式
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node ?*LinkList;//此處理解是關(guān)鍵
其實(shí)上面這句代碼應(yīng)該這樣寫會(huì)更合理如下:
typedef struct Node* ?LinkList;
什么意思呢?
指針變量的類型是Node*? ? ,通過
typedef struct Node*? LinkList;
LinkList可以代表Node*或者說兩者是同一個(gè)類型
接下來用LinkList聲明一個(gè)變量如下
LinkList ? L;(相當(dāng)于*Node ?L)
此處L就是一個(gè)指針的變量名,此指針指向誰呢?
指向Node。
那如果我這樣寫呢如下
LinkList ? *L;
這是什么意思呢?和上面一樣嗎?當(dāng)然不一樣
上述代碼相當(dāng)于LinkList* ? L;
L是一個(gè)指針不假,但此指針指向的是LinkList(是*Node不是Node),
LinkList本身就是一個(gè)指向Node節(jié)點(diǎn)的指針類型
也就是說L是一個(gè)指向指針(指向Node節(jié)點(diǎn))的指針
那什么時(shí)候在方法參數(shù)里用LinkList什么時(shí)候用LinkList*呢?
這就涉及到值傳遞了比如有如下代碼:
main(){
Node ?i;
LinkList a;
a=&i;//a指向i
LinkList* b;
b=&a;
void methodOne(LinkList L)//對method方法進(jìn)行聲明
methodOne(a);//對methodOne方法進(jìn)行調(diào)用
調(diào)用methodOne是把a(bǔ)的值傳遞給L
a的值就是i的地址
如圖
執(zhí)行methodOne方法體內(nèi)具體代碼前

此時(shí)L的地址也是i的地址
執(zhí)行methodOne方法體內(nèi)具體代碼后

此時(shí)L的地址是j的地址,a的地址還是i的地址
也就是說調(diào)用methodOne之后并沒有對a有所改變
或者說操作不了a,操作的只是L,而L在調(diào)用完methodOne方法后就沒用了,沒人管它。
void methodTwo(LinkList *L);
接下來調(diào)用methodTwo
methodTwo(b);
執(zhí)行methodTwo方法體內(nèi)具體代碼前

執(zhí)行methodTwo方法體內(nèi)具體代碼后

此時(shí)實(shí)現(xiàn)了對a的實(shí)際操作,因?yàn)閙ethodTwo方法中P=*L,P拿到的就是a,所以對a實(shí)現(xiàn)了具體的操作。
void methodOne(LinkList L){
.......具體方法對L 進(jìn)行操作
比如
Node j;
L=&j;
}
void methodTwo(LinkList *L){
Node j;
LinkList p;
p=*L;
p=&j;
}
綜上你就應(yīng)該知道鏈表操作方法參數(shù)中什么時(shí)候帶*號,什么時(shí)候不帶*了吧。