2013-05-26 25 views
0
typedef struct slist *LInt; 

typedef struct slist{ 

int value; 
LInt next; 
}Node; 

void reverse(LInt *l){ 

LInt tail; 
if(*l){ 
    tail=(*l)->next; 
    reverse(&tail); 
    snoc(&tail,(*l)->value); 
    free(*l), 
    *l=tail; 
    } 
} 

在main上,我調用如下函數:reverse(& l); (l是一個「LInt l」),snoc做的是把值放在列表的最後一個鏈接上。反轉鏈接列表,傳遞指針的地址

我的問題是,爲什麼我們在調用函數時必須通過「l」的地址?爲什麼在相反的標題上有「LInt * l」?它是我通過的地址的指針嗎?

對不起,如果這是一個愚蠢的問題,如果我犯了任何語法錯誤(英語不是我的母語)。

預先感謝您。

+1

打開您的警告。 'reverse'接受一個'LInt',並將它傳遞給'LInt *'。不一樣。 – StoryTeller

回答

0

回答1(爲什麼我們要通過「L」的地址,調用函數時?)

功能reverse()是想改變原有的列表中。但是函數的非數組輸入是inputs,它們是按值傳遞的。它們不影響原始l。所以要更改l,請將其地址更改爲reverse()。這允許reverse()更改l,因爲它知道l存在的位置。

答案2(爲什麼反向的頭,有「皮棉* L」?)

查看答案1. reverse需要知道以影響變化的類型LInt地址

例子:

int x,y; // 2 non-array variables. 
y = f(x); // X does not change. You expect y to change. 
g(&x);  // After g() is done, the value of x may have changed. 
      // Of course, the _address_ of x, being what you passed to g(), did not change. 
0

您定義的typedef皮棉爲指針結構

typedef struct slist *LInt;    

這就是爲什麼你不指定 '下一個' 爲下一皮棉;在結構上。如果你「VE的typedef定義爲

typedef struct slist LInt; 

然後傳遞參數皮棉* L

是有效的。你正在傳遞一個結構指針。

類型定義是,以幫助您創建小可以理解的數據類型(同義詞並不是一個新)

考慮定義是這樣的:

typedef struct slist LIST; //i prefer this mostly 
    typedef struct slist * LIST_PTR; 

所以當你定義新的列表不會混淆你。

LIST *head; //creating a pointer - Head of linkedlist 
    LIST_PTR head;