這幾天找工做,遇到一個挺好玩的筆試題,作完以後想了一個比較簡單的實現方法。node
題目是:實現一個單鏈表的逆序操做,如原來是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\n"); 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("\n"); 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 }
感受本身寫的比較容易懂了,有問題能夠留言,或者QQ1262033368spa