这几天找工作,遇到一个挺好玩的笔试题,做完之后想了一个比较简单的实现方法。
题目是:实现一个单链表的逆序操作,如原来是A->B->C,操作完之后是C->B->A
/****************************************** * 文件名称:reverse.c * 文件描述:单链表逆序 请注意:没有添加链表释放的函数, 这个文件会造成内存泄露,请自己完善 * 文件作者:by wangluojisuan, in 2013.11.27 * 文件版本:1.2 * 修改记录: *******************************************/ #include <stdio.h> #include <stdlib.h> //定义链表节点,包含数据域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