2016-09-20 53 views
0

我工作的這個問題回報k到第一個單向鏈表路過指針目標C - 鏈表

的最後一個元素,我想實現其按引用傳遞的價值這款C解決方案。並通過指針

這樣做的目標C通過目前的代碼無限地運行,我不知道是否有可能在目標C路過指針

C++示例代碼首先

C example code

My example in Objective C

enter image description here

+0

歡迎來到StackOverflow。請閱讀並遵守幫助文檔中的發佈準則。 [最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)適用於此處。在您發佈代碼並準確描述問題之前,我們無法有效幫助您。最值得注意的是,我們無法從屏幕截圖中輕鬆再現您的問題。 – Prune

+0

便宜的調試提示:將一個** print **語句放到每個例程的頂部。打印例程名稱和所有參數。爲了跟蹤無限遞歸,還包括一個全局計數器:在每次打印時增加,並在達到有用限制時中止程序(這裏應該是50)。 – Prune

+0

謝謝你,這是一個好主意。我會試試:) – mparrish91

回答

1

剛出於好奇,你爲什麼試圖在Obj-C中做到這一點?你可以使用C++進行編譯。我問,因爲你似乎沒有通過引用與指針的傳遞的把握。另外,如果你確實想在Obj-C中做到這一點,你仍然可以通過引用傳遞。

在任何情況下,你有幾個問題,你的代碼:

  • 既然你已經改爲使用指針,你需要通過我的地址 。
  • 既然你現在使用的是指針,你要提領, 增量,並重新分配您的增量
  • 你沒有正確複製的例子 代碼及以下使用head代替head->next

的完整代碼。我沒有編譯或仔細檢查它是否真正運行。基於對您的代碼和您提供的示例的視覺檢查。

- (Node *)nthToLast:(int)k withHead:(Node *)head andCounter:(int *)i { 
    // If Node is an Obj-C class, then use nil 
    // If Node is a C++ struct/class then use NULL 
    // If you have c++11 and it is a C++ struct/class use nullptr 
    if (head == nil) { 
     return nil; 
    } 

    Node *nd = [self nthToLast:k withHead:head->next andCounter:i]; 

    // I've pulled the value in count to make it clear what is being done 
    // i++ is pointer arithmetic, which is not what you want to do here 
    int count = *i; 

    ++count; 

    *i = count; 

    if (count == k) { 
     return head; 
    } 

    return nd; 
} 

- (Node *)nthToLast:(int)k withHead:(Node *)head { 
    int i=0; 
    return [self nthToLast:k withHead:head andCounter:&i]; 
} 
1

我在一個小時後發現相同。讓我們看看我是否可以在您的工作模式下解釋這個...

您的循環的直接問題是,您傳遞的地址爲i,但隨後使用該值就好像它是變量的值一樣。因此,你正在隨機地步入記憶中,每次只讀一個單詞,尋找恰好等於k的單詞。這不太可能發生。相反,嘗試

i* = i* + 1; 
if (i* == k) { 
    ... 

或者它崩:

if (++(i*) == k) return head; 

我認爲你可以修復頭戴式>未來沒有進一步幫助的問題。


如果使用打印語句,那麼你應該看到你內心的通話中一個生動的效果:即「價值」 應該是一些大的幅度,在每次迭代通過增加4 。當你認爲你正在增加時,步長爲4是一個暗示你指向算術的巨大暗示。