这几天找工作,遇到一个挺好玩的笔试题,做完之后想了一个比较简单的实现方法。
题目是:实现一个单链表的逆序操作,如原来是A->B->C,操作完之后是C->B->A.废话少说,上干货.
1 /****************************************** 2 * 文件名称:reverse.c 3 * 文件描述:单链表逆序 4 请注意:没有添加链表释放的函数, 5 这个文件会造成内存泄露,请自己完善 6 * 文件作者:by wangluojisuan, in 2013.11.27 7 * 文件版本:1.2 8 * 修改记录: 9 *******************************************/ 10 #include <stdio.h> 11 #include <stdlib.h> 12 13 //定义链表节点,包含数据域data与指针域next 14 typedef struct _link_node_ { 15 int data; //数据域 16 struct _link_node_ *next; //指针域 17 }linknode_t; 18 19 //定义链表,包含链表头及链表最大长度,当前长度 20 //链表头head不存储内容,head->next为第一个节点 21 //建议采用这种链表定义方式,可以包含更多的链表信息 22 typedef struct _link_list_ { 23 int m_len; //链表最大长度 24 int c_len; //链表当前长度 25 linknode_t *head; //链表头 26 }linklist_t; 27 28 linklist_t * init_linklist(int len); //初始化链表 29 linknode_t * _create_linknode(int value); //创建节点 30 int insert_linklist(linklist_t *list, int value); //链表中插入节点 31 void show_linklist(linklist_t *list); //显示链表内容 32 void reverse_linklist(linklist_t *list); //反转链表顺序 33 34 int main(void) 35 { 36 //初始化链表 37 //输出内容 38 //反转链表 39 //输出反转结果 40 int i = 0; 41 linklist_t *list = NULL; 42 43 list = init_linklist(10); 44 if (NULL == list) 45 exit(-1); 46 47 for (i = 0; i < 10; i++) { 48 if (0 != insert_linklist(list, i)) 49 printf("error "); 50 } 51 52 show_linklist(list); 53 54 reverse_linklist(list); 55 show_linklist(list); 56 57 return 0; 58 } 59 60 /*===================================================== 61 * 函数名称:_create_linknode 62 * 函数功能:创建链表节点,节点next指向NULL 63 * 函数参数:int value 节点数据域的内容 64 * 返 回 值:linknode * 创建好的链表节点,如果出错返回NULL 65 * 创 建 人:by wangluojisuan,in 2013.11.27 66 * 修改记录: 67 ======================================================*/ 68 linknode_t * _create_linknode(int value) 69 { 70 linknode_t *node = NULL; 71 72 node = (linknode_t *)malloc(sizeof(linknode_t)); 73 if (NULL == node) 74 return NULL; 75 76 node->data = value; 77 node->next = NULL; 78 79 return node; 80 } 81 82 /*======================================================= 83 * 函数名称:init_linklist 84 * 函数功能:初始化一个链表,并设置最大链表长度 85 * 函数参数:int len 链表的最大长度 86 * 返 回 值:linklist * 87 成功 初始化好的链表 88 失败 NULL 89 * 创 建 人:by wangluojisuan,in 2013.11.27 90 * 修改记录: 91 ========================================================*/ 92 linklist_t * init_linklist(int len) 93 { 94 linklist_t *list = NULL; 95 96 list = (linklist_t *)malloc(sizeof(linklist_t)); 97 if (NULL == list) 98 return NULL; 99 100 list->m_len = len; //设置最大长度 101 list->c_len = 0; //设置当前长度 102 list->head = _create_linknode(0); //头结点赋值 103 104 return list; 105 } 106 107 /*======================================================= 108 * 函数名称:insert_linklist 109 * 函数功能:向链表中插入数据,使用头插法,每次新插入的节点都 110 放在head的后面 111 * 函数参数:linklist_t *list 链表 112 int value 插入节点数据域值 113 * 返 回 值:int 114 成功 0 115 失败 -1 116 * 创 建 人:by wangluojisuan,in 2013.11.27 117 * 修改记录: 118 ========================================================*/ 119 int insert_linklist(linklist_t *list, int value) 120 { 121 linknode_t *node = NULL; 122 123 if (list->c_len >= list->m_len) 124 return -1; 125 126 node = _create_linknode(value); 127 node->next = list->head->next; 128 list->head->next = node; 129 (list->c_len)++; 130 131 return 0; 132 } 133 134 /*======================================================= 135 * 函数名称:show_linklist 136 * 函数功能:显示链表的内容 137 * 函数参数:linklist_t *list 链表 138 * 返 回 值:void 139 * 创 建 人:by wangluojisuan,in 2013.11.27 140 * 修改记录: 141 ========================================================*/ 142 void show_linklist(linklist_t *list) 143 { 144 linknode_t *node = NULL; 145 146 node = list->head->next; 147 148 while (NULL != node) { 149 printf("%d ", node->data); 150 node = node->next; 151 } 152 153 printf(" "); 154 } 155 156 /*======================================================= 157 * 函数名称:reverse_linklist 158 * 函数功能:反转链表节点 159 * 函数参数:linklist_t *list 链表 160 * 返 回 值:void 161 * 创 建 人:by wangluojisuan,in 2013.11.27 162 * 修改记录: 163 ========================================================*/ 164 void reverse_linklist(linklist_t *list) 165 { 166 linknode_t *current = NULL, 167 *pnext = NULL; 168 169 current = list->head->next; 170 while(NULL != current->next) { 171 pnext = current->next; 172 current->next = pnext->next; 173 pnext->next = list->head->next; 174 list->head->next = pnext; 175 } 176 }
感觉自己写的比较容易懂了,有问题可以留言,或者QQ1262033368