- 论坛徽章:
- 0
|
如何实现一个单链表的反转?
前面的代码有错误,宏定义有问题,不能递归,不好意思,晕了.
我用递归函数实现不知是否符合要求.
附带相关源码:
#include <stdio.h>;
#include <stdlib.h>;
typedef struct list_node {
struct list_node *next;
int number;
}list_node, *p_list_node;
void reverse_list (p_list_node *pp_head, p_list_node p_pre, p_list_node p_this)
{
if (NULL == p_this)
*pp_head = NULL;
else if(NULL == p_this->;next)
{
p_this->;next = p_pre;
*pp_head = p_this;
}
else
{
reverse_list(pp_head, p_this, p_this->;next);
p_this->;next = p_pre;
}
}
p_list_node mk_list()
{
int i = 0;
p_list_node tmp_node = NULL;
p_list_node this_node = NULL;
for(;i < 10;i++)
{
tmp_node = calloc (sizeof(list_node), 1);
tmp_node->;number = i;
tmp_node->;next = this_node;
this_node = tmp_node;
}
return this_node;
}
void print_list (p_list_node p_head)
{
p_list_node p_this = NULL;
if (NULL == p_head)
printf("The list is NULL!"
else
for (p_this = p_head; NULL != p_this; p_this = p_this->;next)
printf("The node addr is [%lu],\tThe node data is [%d].\n", p_this, p_this->;number);
}
void free_list (p_list_node p_head)
{
p_list_node p_this = p_head;
p_list_node p_tmp = NULL;
for (; NULL != p_this; p_this = p_tmp)
{
p_tmp = p_this->;next;
free (p_this);
}
}
int main (int argc, char *argv[])
{
p_list_node p_head = mk_list();
printf("\nNow printf the info before reverse!\n"
print_list (p_head);
/* reverse_list */
reverse_list((&p_head), NULL, p_head);
printf("\nNow printf the info after reverse!\n"
print_list (p_head);
free_list (p_head);
p_head = NULL;
}
linux下gcc编译运行结果:
Now printf the info before reverse!
The node addr is [134519176], The node data is [9].
The node addr is [134519160], The node data is [8].
The node addr is [134519144], The node data is [7].
The node addr is [134519128], The node data is [6].
The node addr is [134519112], The node data is [5].
The node addr is [134519096], The node data is [4].
The node addr is [134519080], The node data is [3].
The node addr is [134519064], The node data is [2].
The node addr is [134519048], The node data is [1].
The node addr is [134519032], The node data is [0].
Now printf the info after reverse!
The node addr is [134519032], The node data is [0].
The node addr is [134519048], The node data is [1].
The node addr is [134519064], The node data is [2].
The node addr is [134519080], The node data is [3].
The node addr is [134519096], The node data is [4].
The node addr is [134519112], The node data is [5].
The node addr is [134519128], The node data is [6].
The node addr is [134519144], The node data is [7].
The node addr is [134519160], The node data is [8].
The node addr is [134519176], The node data is [9]. |
|