單鏈表逆序、反轉

這幾天找工做,遇到一個挺好玩的筆試題,作完以後想了一個比較簡單的實現方法。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

相關文章
相關標籤/搜索