2012-08-10 115 views
0

對我的代碼有一些問題。你相應地工作,我需要實現「橫向」功能。C編程,函數指針

此外,我無法理解有什麼特定的函數指針是: 函數指針=>無效(*訪問)(鏈接)

void traverse (link ls, void (*visit)(link)) { 
    if (ls == NULL) { 
    return; 
    } 
    (*visit) (ls); 
    traverse (ls->next, visit); 
    return; 
} 

void traverseR (link ls, void (*visit)(link)) { 
    if (ls == NULL) { 
    return; 
    } 
    traverseR (ls->next, visit); 
    (*visit)(ls); 
    return; 
} 


void square (link l) { 
    // link tmp = NULL; 
    int container = l->item; 
    container = SQUARE(container); 

    l->item = container; 

} 

void squareAll (link ls){ 

    link curr = ls; 
    while (curr != NULL){ 
    square(curr); 
    curr = curr->next; 
    } 

    ls = curr; 
} 
+1

請告訴我你的問題與'traverse'和'traverseR'功能?他們看起來很好。至於理解什麼,例如'void(* visit)(link)'的意思,參見[this link](http://c-faq.com/decl/spiral.anderson.html)。 – 2012-08-10 08:52:27

+0

如果列表很長(或循環),那麼它們就會吹出堆棧。 – Porculus 2012-08-10 09:12:13

回答

0

這些函數指針允許您使用函數來執行一些自定義操作當列表正在遍歷時,你自己在每個列表項上。例如,你可能會寫降低每個節點的數據的功能:

void decrease_item(link node) 
{ 
    --node->item; 
} 

的時候可以調用traverse(list_head, decrease_item)在列表中降低每一個項目的價值。您可以創建一個用於打印每個元素的項目等功能。

順便說一下,在你的代碼上面,你可以在一個更優雅的方式改寫squareAll功能:

void squareAll (link ls){ 
    traverse(ls, square); 
} 
+0

哇,這是在橫越(ls,square)上的高明; 偉大的代碼,謝謝! – ryantata 2012-08-10 09:15:07

0

Also i have trouble understanding what the given function pointers are for: Function pointers => void (*visit)(link)

你的函數指針可以在任何函數的地址存儲與類型:

void()(link) // a function that takes an argument of type 'link' as first 
       // parameter and returns void. 
       // ex: void random_func(link param) 

visit只是程序中使用的指針名稱。 可以聲明,分配和執行跟着一個函數指針:

// protoype of an implemented function 
int char_to_int(char c); 
// your pointer declaration 
int (*pointer_name)(char); 
// assignment 
pointer_name = &char_to_int; 
// use of a function pointer 
(*pointer_name)(some_character); 
0

除了已經取得的說,少模糊的語法將使代碼更容易理解。

typedef void(*visit_t)(link); 


void traverse (link ls, visit_t visit) { 
    if (ls == NULL) { 
    return; 
    } 

    visit (ls); 
    traverse (ls->next, visit); 
    return; 
} 

void traverseR (link ls, visit_t visit) { 
    if (ls == NULL) { 
    return; 
    } 

    traverseR (ls->next, visit); 
    visit (ls); 
    return; 
} 
+0

作爲一個經驗法則:在使用函數指針時不使用typedef的C程序員要麼是不好的程序員要麼是虐狂分子:) – Lundin 2012-08-10 09:08:52

0
void (*visit)(link) 

這是一個函數指針,它取一個類型的鏈路,並返回一個空隙。

爲如:

有一個函數void function1(Link a)

的,你可以調用函數遍歷象下面這樣:

traverse (ls, &function1) ;