这几天找工作,遇到一个挺好玩的笔试题,做完之后想了一个比较简单的实现方法。
题目是:实现一个单链表的逆序操作,如原来是A->B->C,操作完之后是C->B->A.废话少说,上干货.
/******************************************
* 文件名称:reverse.c
* 文件描述:单链表逆序
请注意:没有添加链表释放的函数,
这个文件会造成内存泄露,请自己完善
* 文件作者:by wangluojisuan, in 2013.11.27
* 文件版本:1.2
* 修改记录:
*******************************************/
#include
#include
//定义链表节点,包含数据域data与指针域next
typedef struct _link_node_ {
int data;//数据域
struct _link_node_ *next;//指针域
}linknode_t;
//定义链表,包含链表头及链表最大长度,当前长度
//链表头head不存储内容,head->next为第一个节点
//建议采用这种链表定义方式,可以包含更多的链表信息
typedef struct _link_list_ {
int m_len;//链表最大长度
int c_len;//链表当前长度
linknode_t *head;//链表头
}linklist_t;
linklist_t * init_linklist(int len);//初始化链表
linknode_t * _create_linknode(int value);//创建节点
int insert_linklist(linklist_t *list, int value);//链表中插入节点
void show_linklist(linklist_t *list);//显示链表内容
void reverse_linklist(linklist_t *list);//反转链表顺序
int main(void)
{
//初始化链表
//输出内容
//反转链表
//输出反转结果
int i = 0;
linklist_t *list = NULL;
list = init_linklist(10);
if (NULL == list)
exit(-1);
for (i = 0; i < 10; i++) {
if (0 != insert_linklist(list, i))
printf("error\n");
}
show_linklist(list);
reverse_linklist(list);
show_linklist(list);
return 0;
}
/*=====================================================
* 函数名称:_create_linknode
* 函数功能:创建链表节点,节点next指向NULL
* 函数参数:int value节点数据域的内容
* 返 回 值:linknode *创建好的链表节点,如果出错返回NULL
* 创 建 人:by wangluojisuan,in 2013.11.27
* 修改记录:
======================================================*/
linknode_t * _create_linknode(int value)
{
linknode_t *node = NULL;
node = (linknode_t *)malloc(sizeof(linknode_t));
if (NULL == node)
return NULL;
node->data = value;
node->next = NULL;
return node;
}
/*=======================================================
* 函数名称:init_linklist
* 函数功能:初始化一个链表,并设置最大链表长度
* 函数参数:int len 链表的最大长度
* 返 回 值:linklist *
成功 初始化好的链表
失败 NULL
* 创 建 人:by wangluojisuan,in 2013.11.27
* 修改记录:
========================================================*/
linklist_t * init_linklist(int len)
{
linklist_t *list = NULL;
list = (linklist_t *)malloc(sizeof(linklist_t));
if (NULL == list)
return NULL;
list->m_len = len;//设置最大长度
list->c_len = 0;//设置当前长度
list->head = _create_linknode(0);//头结点赋值
return list;
}
/*=======================================================
* 函数名称:insert_linklist
* 函数功能:向链表中插入数据,使用头插法,每次新插入的节点都
放在head的后面
* 函数参数:linklist_t *list 链表
int value插入节点数据域值
* 返 回 值:int
成功 0
失败 -1
* 创 建 人:by wangluojisuan,in 2013.11.27
* 修改记录:
========================================================*/
int insert_linklist(linklist_t *list, int value)
{
linknode_t *node = NULL;
if (list->c_len >= list->m_len)
return -1;
node = _create_linknode(value);
node->next = list->head->next;
list->head->next = node;
(list->c_len)++;
return 0;
}
/*=======================================================
* 函数名称:show_linklist
* 函数功能:显示链表的内容
* 函数参数:linklist_t *list 链表
* 返 回 值:void
* 创 建 人:by wangluojisuan,in 2013.11.27
* 修改记录:
========================================================*/
void show_linklist(linklist_t *list)
{
linknode_t *node = NULL;
node = list->head->next;
while (NULL != node) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
/*=======================================================
* 函数名称:reverse_linklist
* 函数功能:反转链表节点
* 函数参数:linklist_t *list 链表
* 返 回 值:void
* 创 建 人:by wangluojisuan,in 2013.11.27
* 修改记录:
========================================================*/
void reverse_linklist(linklist_t *list)
{
linknode_t *current = NULL,
*pnext = NULL;
current = list->head->next;
while(NULL != current->next) {
pnext = current->next;
current->next = pnext->next;
pnext->next = list->head->next;
list->head->next = pnext;
}
}
感觉自己写的比较容易懂了,有问题可以留言,或者QQ1262033368