2009-12-11 63 views
0
#include <iostream> 
using namespace std; 

struct Node 
{ 
    char item; 
    Node *next; 
}; 

void inputChar (Node *); 
void printList (Node *); 
char c; 

int main() 
{ 

    Node *head; 
    head = NULL; 
    c = getchar(); 
    if (c != '.') 
    { 
     head = new Node; 
     head->item = c; 
     inputChar(head); 
    } 
    printList(head); 
    return 0; 
} 

void inputChar(Node *p) 
{ 
    getchar(); 
    while (c != '.') 
    { 
     p->next = new Node;    
     p->next->item = c; 
     inputChar(p->next); 
    } 
    p->next = new Node; // dot signals end of list    
    p->next->item = c; 
} 

void printList(Node *p) 
{ 
    if(p = NULL) 
     cout << "empty" <<endl; 
    else 
    { 
     while (p->item != '.') 
     { 
      cout << p->item << endl; 
      printList(p->next); 
     } 
    } 
} 

我想製作一個由用戶輸入的字符鏈表。一段時間表示輸入結束。我的程序一直循環在inputChar函數上。有任何想法嗎?爲什麼我的inputchar函數保持循環?

+0

確定添加c = getchar()停止了循環。 – Brandon 2009-12-11 14:10:11

+0

我認爲你需要了解全局變量,以及爲什麼他們是一個壞主意。 – 2009-12-11 14:15:51

+0

好的。我把時間改爲if。 – Brandon 2009-12-11 14:16:17

回答

2

也許你應該加上:

c = getchar(); 

不過,這是一種危險的你在做什麼。在某些平臺上,使用先前的getchar()呼叫的ENTER鍵後,將立即返回getchar()。所以你應該在你的循環中考慮這一點。也許增加一個額外的getchar()到inputChar函數?

另外,保羅寫的是真的。您應該用簡單的if來更改while循環。

2

因爲你永遠不會改變循環內的c的值。那麼爲什麼它會爆發呢?

您只在循環之前設置一次值c

2

你有inputChar調用inputChar。當你將X深入到inputChars中,並且當它返回時,它的調用者的c仍然等於它在調用inputChar之前的任何值,所以它繼續循環。

+0

是的。沒有意識到這一點。也許他應該改變他的while循環,如果... – 2009-12-11 14:07:54

+0

不,我認爲他應該改變整個邏輯以避免所有的遞歸調用。他們沒有必要。 – 2009-12-11 14:47:32

+0

如何在不遞歸的情況下重新修改此問題?我不知道如何使用指針迭代來創建鏈表。 – Brandon 2009-12-11 14:57:25

2

澄清更改getchar();到c = getchar();在inputChar過程的第一行。

1

考慮一下類似的東西,它測試過早結束和指定的行尾定界符,並且將允許你指定一個不同於std :: cin的流。

void inputChar(Node *p, std::istream& in = std::cin) 
{ 
    char ch; 
    while(in.get(ch) && in && ch != '.') 
    { 
     ... 
    } 
}