單鏈表逆序、反轉

這幾天找工做,遇到一個挺好玩的筆試題,作完以後想了一個比較簡單的實現方法。 node

題目是:實現一個單鏈表的逆序操做,如原來是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
相關文章
相關標籤/搜索