2012-04-02 31 views
2

編輯:我也不會介意知道這是否只是太曖昧讓你瞭解和或者尋找什麼是錯的,我一知道這與代碼沒有直接關係,因爲當我即將退出函數時發生更改,而不是在實際的「代碼」期間發生。所以我希望這已經足夠,不管我是否需要添加更多。先謝謝你!指針似乎沒有明顯的原因重新設置

我想做一個簡單的(單向)鏈接列表,我必須自己做,不使用STL或任何其他已經制作的動態容器。我已經做了一個簡單的,但我似乎有一個問題,我根本無法包裹我的頭。每當我在列表中創建一個新節點(我總是返回列表的第一個節點,以防它已被更改,我不使用「哨兵」或「虛擬」節點)新節點是好的直到我到達程序中的某個點時,它將自己重置到我介紹的第一個節點。

要儘量保持我的帖子儘可能乾淨,我會插入更少的代碼和更多的「功能」或模式,但如果它不夠,我會添加更多。

這裏是它如何工作的:

我的節點項目

struct Node { // simplified example 
    string type; //can be ignored 
    int ap_nr;  // I sort by apartment number 
    int sum;  // can also be ignored 
    Node *next; 
}; 

在主我初始化我的第一個節點是「假的」節點(ap_nr = -1,其他ap_nr不能爲負)。

int main() 
{ 
    int command = 1; // used for loop 
    Node *begin; // head of my list 
    begin = new Node; 
    begin = create_node(); // initialize 
    while (command != 0) // This is for work with a "handler", accesses different mechanics of the program, I don't know exactly how to explain in english 
    { 
     input_command(command, begin); // reads command, sends result to handler 
    } 
return 0; 
} 

這是我輸入命令:

void input_command (int &command,Node *begin) 
{ 
    cout<<"Option #"; cin>>command; 
    input_validation (command, begin); 
} 

而我處理,我使用ATM的唯一部分:

void input_validation (int command, Node *begin) 
{ 
    if (command == 1 trough 15) // pseudo code 
     execute (command)  
} 

後,我將節點添加到列表中,我用調試跟蹤它,第一個保持原樣,但第二個節點(我在第一個節點之前添加它並返回新的「開始」),起初沒關係(有一個新的內存位置和new_begin->next = old_begin但在I退出ìnput_command結構它重​​置)

* 這裏是input_command結構和程序圖:*

主: - 初始化 '假' 節點/進入菜單環 - >前進到input_command。

UI: - 輸入命令 - >讀取命令 - >驗證 - >發送到處理程序。

列表: - 增加了慾望節點「列表」(沒有實際上本身的列表左右,剛剛掛節點) - >返回第一個節點。 第一個節點是確定(有新的地址,在舊節點)

返回到UI: - >輸入命令(下架)和復位(我的意思是,不管什麼節點I添加,它成爲我添加的第一個節點。假設我介紹1到10號公寓,它只記得「1」)。

AM我錯過了什麼?在我的設計中是否有邏輯錯誤? 你需要更多的代碼驢嗎? 只要告訴我要補充什麼,我意識到這有點模糊。

注:現在我只能我的主要節點之前添加節點,我不會強調任何新的,直到我做這項工作正常,只要我的設計是不是問題的一部分,我贏了也不會改變,但如果不好,我會欣賞筆記和建議。

這是add_node功能的唯一實現部分:

Node *add_node (Node *begin,string type, int sum, int ap_nr) // Node begin e primul nod din lista, trebuie mereu plimbat cu toate functiile pe lista 
{ 
// if first node is dummy node 

if (begin->ap_nr == -1) 
    { 
     begin->type = type; 
     begin->ap_nr = ap_nr; 
     begin->sum = sum; 
     begin->next = 0; 
     return begin; 
    } 

// else create new node and insert it in sorted position 

else 
{ 

    // if node should be inserted before first node (begin) 

    if (ap_nr <begin->ap_nr) 
    { 
     Node *cursor; 
     cursor = new Node; 
     cursor->ap_nr = ap_nr; 
     cursor->type = type; 
     cursor->sum = sum; 
     cursor->next = begin; 
     return cursor; 
    } 
} 
+0

請將來源添加到input_command函數中。我懷疑你沒有傳遞對它的引用,所以開始指針永遠不會被修改。 – 2012-04-02 12:03:54

回答

3

As RStrad說,你遇到的問題是你想修改一個函數中的指針,並且在那個函數之外還有那些修改保留在之外。

在C/C++中,所有東西都是按值傳遞的。如果你想要一個函數來改變某些東西,你需要傳遞一個指向的東西。所以,在你想改變一個指針的情況下,你需要一個指針傳遞給該指針,就像這樣:

*Node begin; 
input_command(command, &begin); 
// the pointer itself has an address, which you are sending with & 

input_command()定義將爲:

void input_command (int &command, Node **begin) 
// observe here the pointer to your pointer 

從內input_command() ,你對input_validation通話將必須:

input_validation (command, &(*begin)); 
// the address of the pointer towards which **begin points 

input_validation()定義將爲:

void input_validation (int command, Node **begin) 

...以及任何進一步的調用,比如對於實際添加節點的函數,將繼續遵循這種格式。總之,如果你有一個指針*P,並且你想在一個函數中修改它,你需要發送它的地址&P。該函數將接收到指針**P的指針,並且將包含P的地址的任何進一步調用將必須用&(*P)完成。

1

我真的需要看到的將節點添加到列表中的代碼。根據你所描述的在當前頭部之前添加節點,問題在於只在本地範圍內修改了開始,並且沒有從input_command返回(即通過引用或傳遞值)

+0

雖然我在拼貼畫,在我的國家,它被認爲是「非常好」,實際上它是垃圾,我知道指針很少,他們沒有解釋任何東西,也不會。我知道我應該自己學習,但如果我確實瞭解了他們自己跳過的一切,那麼在這裏就幾乎沒有任何意義。我所知道的是,我不知道如何正確地傳遞指針,以便在內部和外部修改指針(不在我當前的本地函數中) – Kalec 2012-04-02 12:53:38

+0

也重置爲第一個分配的節點。如果問題在於它保存在本地,爲什麼我的原始開頭也不會在本地被記住,然後被破壞?但它不是......它仍然存在。 – Kalec 2012-04-02 12:56:10

相關問題