2017-02-15 121 views
1

我必須編寫一個函數來反轉一個雙向鏈表,以便尾部成爲頭部。反向雙向鏈表

例如,之前的元素: {(1,1),(1,2),(2,2),(2,3)}

後: {(2,3) ,(2,2),(1,2),(1,1)}

這裏的結構:

struct snake { 
    unsigned int i; 
    unsigned int j; 
    struct snake *next; 
    struct snake *prev; 
    }; 

這是函數prototipe我必須使用:

void snake_reverse(struct snake **s); 

我想這樣的事情和其他一些嘗試

void snake_reverse(struct snake **s) { 
struct snake *last, *tmp = NULL; 

last = *s; 

while (last != NULL) 
{ 
    tmp = last->prev; 
    last->prev = last->next; 
    last->next = tmp; 
    last = last->prev; 
} 

if(tmp != NULL) 
    *s = tmp->prev; 
} 

也試過這樣:

while (last != NULL) 
{ 
    tmp = last->next; 
    last->next = last->prev; 
    last->prev = tmp; 
    last = tmp; 
} 

if(tmp != NULL) 
    *s = tmp; 

,但他不工作。我幾乎可以肯定我沒有錯。 列表的第一個 - > prev是NULL,列表的最後 - >下一個是NULL。

我沒有得到任何錯誤或崩潰,但該函數的任務是通過反轉所有元素並更改列表頭來反轉蛇的方向。 你能說這裏有什麼問題嗎?

編輯:問題是在另一個程序模塊不是由我做的。

無論如何,最好的解決方案是kmkaplan。謝謝大家

+0

當你描述一個問題時,你不能說「它不工作」;如果你更精確一些,這會更好:這是我所做的,期望的輸出是X,但我有Y(或者:有錯誤信息Z的崩潰)。也許實際的錯誤在於你測試你的功能的方式。 – coredump

+0

另請參閱'last = last-> prev':是否有意義使用last = tmp? – coredump

+0

@coredump對不起,如果我不能更具體,但這個功能被用作程序中的模塊,我無法控制程序的其餘部分。 無論如何,我沒有任何錯誤或崩潰,但功能的任務是顛倒所有元素並改變列表的頭部來顛倒蛇的方向。 last-> prev有last-> next的地址導致我們切換它們。 tmp has last-> prev。所以他們是不同的 – RUsl

回答

1

你必須設置*s到列表中的新掌門人。這是列表中的舊尾,是您處理的最後一個元素。

void snake_reverse(struct snake **s) { 
    struct snake *last, *tmp = NULL; 
    last = *s; 
    while (last != NULL) { 
     *s = last 
     tmp = last->prev; 
     last->prev = last->next; 
     last->next = tmp; 
     last = last->prev; 
    } 
} 
+0

謝謝,這真的扭轉元件(我檢查的元件的地址和它們被顛倒),但蛇在當它調用這個函數時,遊戲仍然卡住。所以我認爲這不是我的錯,而且問題出在另一個功能上 – RUsl

+0

問題出在程序的另一個模塊上,而不是我自己製作的。 無論如何,這似乎是最好的解決方案和工作 – RUsl

0

我不知道,但我認爲你的while循環中的最後一行代碼是錯誤的。據我瞭解,最後一個變量是蛇的尾巴。這意味着last-> next = null。在第二行代碼中,當你創建最後一個null的前一行時,最後一行代碼的最後一行變爲0.我認爲在while循環中更改最後一行代碼會改變這一點。

last = last->next 
+0

我試過了,但他不工作。 單調地在while循環的最後一行last-> prev有last-> next的地址,所以使用last-> prev移動到列表的下一個元素 – RUsl

0

你永遠不會設置列表的新頭,因爲tmp在while循環後總是NULL。嘗試這個;

void snake_reverse(struct snake **s) { 
    struct snake *last, *newHead, *tmp = NULL; 

    last = *s; 

    while (last != NULL) 
    { 
    tmp = last->prev; 
    if (tmp!=NULL) 
     newHead = tmp; 
    last->prev = last->next; 
    last->next = tmp; 
    last = last->prev; 
    } 

    *s = newHead; 
} 
+0

謝謝你的回答,但沒有任何事情可做,當我調用這個函數時,蛇仍然陷入遊戲中。然後我覺得有什麼不對。 對於一個小調試這些元素的地址: 環路之前 * S = 16595408 * S->下一= 16595360 * S->先前= 0 後* S = newHead * S = 16595408 * S->下一= 0 * S->先前= 1659536個 – RUsl