2017-02-15 140 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