這幾天找工做,遇到一個挺好玩的筆試題,作完以後想了一個比較簡單的實現方法。node
題目是:實現一個單鏈表的逆序操做,如原來是A->B->C,操做完以後是C->B->Aide
/****************************************** * 文件名稱: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函數