2013-03-18 76 views
-1

//以下代碼生成訪問衝突或分段錯誤 //我正在尋找河內塔的簡單解決方案,我應該自己寫 //請註明以下代碼漏洞,而不是給你的精英代碼:)河內遞歸塔,訪問衝突/分段錯誤,在dev C++編譯器上

//使用三個棧

#include <iostream> 
    using namespace std; 

    #define max 50 

typedef struct stack{ //union? 
     int tos; 
     int els[max]; //stack->els[1] = tos 
}stack; //template stack? 


void toh(int, stack * , stack *, stack *); 
void display(stack *); 

int main(){ 
    cout<<"Enter the number of discs (<=50) in Tower of Hanoi\n"; 
    int n; 
    cin>>n; 
    stack *A,*B,*C; 
    toh(n, A,B,C); 
    system("pause"); 
    return 0; 
} 
void toh(int n, stack *A, stack *B, stack *C){ 
    if (n == 1) { 
     int temp = A->els[A->tos]; //switch case i=1,2,3 tos[i] 
     A->tos -= 1; //OR stack * A, A->tos? 
     C->tos += 1; 
     C->els[C->tos] = temp; 
       //  push the popped item in stack C 
     cout<<"A\t"; 
     display(A); 
     cout<<"\nB\t"; 
     display(B); 
     cout<<"\nC\t"; 
     display(C); 
    } 
    else { 
     toh(n-1, A, C, B); 
     toh(1, A, B, C); 
     toh(n-1, B, A, C); 
    } 
} 
void display(stack * X){ //and not int[] stack 
    cout<<"The stack elements are :\n"; 
      for(int i = 1; i <= X->tos; i++){//impo to start with 1 if tos = 0 init 
       cout<<X->els[i]; 
       cout<<"\t"; 
      } 
} 
+4

什麼是在進入'toh'遞歸A,B,C的值,在你看來? – 2013-03-18 18:41:41

+1

Steve向你暗示,你的程序永遠不會創建一個'stack'。 – 2013-03-18 18:50:00

+0

輸入no後,運行時異常很快發生。在我的情況下,光盤的數量是3,程序只是掛起.A,B,C是作爲堆棧實現的塔,A應該包含3個光盤,如3,2,1從下到上(如果我們假設3> 2> 1代表較大盤>中等>更小),對於B和C,它們每個都有3個NULL值。 – user1776433 2013-03-18 18:52:09

回答

4

正如上面給出的微妙的暗示是有點太微妙遞歸解決河內問題的塔,看看這個代碼:

stack *A,*B,*C; 
toh(n, A,B,C); 

您的指針永遠不會初始化。因此他們有未知的價值。

,最簡單的解決辦法是分配它們主要在堆棧上,然後傳遞指針到TOH功能:

stack A,B,C; 
toh(n, &A,&B,&C); 
+0

@ user1776433您沒有正確複製此答案中的代碼。 'stack A = 0,* B = 0,* C = 0;'創建一個'stack'和兩個指針。 – 2013-03-18 19:22:07

+0

@ user1776433爲什麼要向代碼添加錯誤? '堆棧A,B,C;'是正確的代碼。它創建3個堆棧。你堅持使用'stack * A = 0,* B = 0,* C = 0;'的代碼是不正確的。它創造了三個指向任何地方的指針。這就是爲什麼這個發佈的答案是告訴你停止這樣做。 – 2013-03-18 20:44:17

+0

@ user1776433已解釋代碼中的缺陷。已解釋瞭解決您的代碼的解決方案。目前還不清楚你正在尋找什麼「想法」,現在你知道什麼是錯的,應該做什麼。 – 2013-03-18 21:08:21