2012-11-12 52 views
2

有3個鏈表,其中2個(headX和headY)按降序排列,函數作業是將它們排序成單個列表(headZ)。C指針在遞歸中恢復到舊地址

由於某些原因,該算法可以正常工作,但是當它完成並通過遞歸返回時,3個指針在通過遞歸「返回」時恢復爲舊值。

void SortedMergeRecur(Node* headX, Node* headY, Node* headZ) 
{ 
    if (headX == NULL && headY == NULL) 
     return; 

else if (headX == NULL && headY != NULL) 
{ 
    if (headZ == 0) 
    { 
     headZ = headY; 
     headY = headY->link; 
     headZ->link = NULL; 
    } 
    else 
    { 
     headZ->link = headY; 
     headY = headY->link; 
     headZ = headZ->link; 
     headZ->link = NULL; 
    } 

    SortedMergeRecur(headX, headY, headZ); 
} 

else if (headX != NULL && headY == NULL) 
{ 
    if (headZ == 0) 
    { 
     headZ = headX; 
     headX = headX->link; 
     headZ->link = NULL; 
    } 
    else 
    { 
     headZ->link = headX; 
     headX = headX->link; 
     headZ = headZ->link; 
     headZ->link = NULL; 
    } 

    SortedMergeRecur(headX, headY, headZ); 
} 

if (headX != NULL && headY != NULL) 
{ 
    if (headX->data > headY->data) 
    { 
     if (headZ == NULL) 
     { 
      headZ = headY; 
      headY = headY->link; 
      headZ->link = NULL; 
     } 
     else 
     { 
      headZ->link = headY; 
      headY = headY->link; 
      headZ = headZ->link; 
      headZ->link = NULL; 
     } 
    } 
    else 
    { 
     if (headZ == NULL) 
     { 
      headZ = headX; 
      headX = headX->link; 
      headZ->link = NULL; 
     } 
     else 
     { 
      headZ->link = headX; 
      headX = headX->link; 
      headZ = headZ->link; 
      headZ->link = NULL; 
     } 
    } 
    SortedMergeRecur(headX, headY, headZ); 
} 
} 

我知道,這部分可以簡化(如追加整個列表如果任headX或令人興奮的是空的),但我寫的這種方式,因爲我認爲它可能會解決問題,它沒有....

+0

你期望什麼?這聽起來像你想通過引用傳遞指針。 – oldrinb

回答

3

指針由值複製同樣的方式變量是:

void test(int x) 
{ 
    x = 5; 
} 
int y = 3; 
test(y); 
//y is 3 

同樣的想法:

void test(int* x, int* y) 
{ 
    x = y; 
} 
int a = 5; int b = 6; 
int* x = &a; 
int* y = &b; 
test(x, y); 
//x is still &a and y is still &b 

如果你想改變的指針,你必須指針傳遞到指針:由於您使用的

void test(int** x, int *y) 
{ 
    *x = y; 
} 
int a = 5; int b = 6; 
int* x = &a; 
int* y = &b; 
test(&x, y); 
//x is now &b and y is still &b 
//(note that a and b are still 5 and 6, respectively) 

C++,另一個選擇是通過引用傳遞:

void test(int*& x, int *y) 
{ 
    x = y; 
} 
int a = 5; int b = 6; 
int* x = &a; 
int* y = &b; 
test(x, y); 
//x is now &b and y is still &b 
//(note that a and b are still 5 and 6, respectively) 
+1

指針指針!我甚至不知道那些存在。非常感謝! – digitalfrenchfry

+0

@ user1732919對於C++,您最好使用對指針的引用。指向指針的指針可能會很快看起來很難受。不過,有時候我發現一個指針不那麼容易混淆。 – Corbin

1

如果你想修改參數,並保持功能之外的變化,你需要按引用傳遞它們 - 例如

void SortedMergeRecur(Node*& headX, Node* headY, Node* headZ) 
//       |  
//     pass by reference 

如果修改headX的函數的內n,這些更改將在返回後保留。對headYheadZ的更改不會,因爲它們是按值傳遞的。

1

請記住,在C中,參數總是按值傳遞,絕不參考。

當你傳遞一個指針的函數一樣

void SortedMergeRecur(Node* headX, Node* headY, Node* headZ) 

如果你改變(即集)正式指針參數headX在調用中使用您的SortedMergeRecur實際指針參數的體內不會受到影響。

如果你想影響他們在函數體中,使自己的設置被傳播到主叫方,申報形參指針的指針,就像

void SortedMergeRecur(Node** pheadX, Node** pheadY, Node** pheadZ) 

然後將身體內部:

*pheadY = (*pheadY)->link; 

在C++中,你可以通過引用傳遞正式參數&