C语言循环链表实现

现在把这两天完成的循环链表的程序发上来,供大家参阅。

循环单链表相对与单链表仅仅只是tail指向了header。这样便形成了一个环。循环链表的应用比较多,特别是在内存容量很小的单片机上,显得由为重要。

只怪自己当初没有好好把数据结构好好敲一遍,现在还要从头到尾来敲这些代码。。。


这是 circle_link_list.c的源码

/*
 *	Copyright  : 2015-2020 湖南农业大学 理学院
 *  File name  : circle_link_list.c
 *	Description:
 *
 *	Author	   : Jack Huang
 *	Version	   : 
 *	Date	   : Apr 7, 2016
 *
 *	History	   : 
 */

#include <assert.h>
#include <stdlib.h>
#include "circle_link_list.h"


#undef NDEBUG

/**
 * @breif 循环链表的操作函数
 * @param
 * @retval
 */
bool circle_link_list_operation(void)
{
	circle_link_list *list_A = NULL;
	Elemtype data[20];
	Elemtype elem_data = 0;
	int i = 0;
	int list_length = 0;

	for(i = 0; i < 20; i++)
	{
		data[i] = i;
	}

	// 创建循环链表
	printf("1 --- create circle link list...\n\n");
	list_A = create_circle_link_list_tail(list_A, data, 20);
	printf("\t\treply...\n");
	print_circle_link_list(list_A);

	// 获取循环链表长度
	printf("2 --- get the length of circle list...\n\n");
	list_length = get_circle_link_list_length(list_A);
	printf("\t\treply...\n");
	printf("list_A length = %d\n\n", list_length);

	// 获取循环链表元素
	printf("3 --- get the element data of circle list\n\n");
	get_circle_link_list_element(list_A, 10, &elem_data);
	printf("\t\treply...\n");
	printf("elem_data  = %d\n\n", elem_data);

	// 查看循环链表是否为空
	printf("4 --- Is the circle link list empty?\n\n");
	printf("\t\treply...\n");
	if( is_circle_link_list_empty(list_A) == true )
	{
		printf("list_A is a empty circle link list...\n\n");
	}
	else
	{
		printf("list_A is not a empty circle link list...\n\n");
	}

	// 修改循环链表的元素值
	printf("5 --- modify the value of circle link list element data...\n\n");
	printf("\t\t reply...\n");
	if( modify_circle_link_list(list_A, 10, 100) == true)
	{
		printf("modfiy success...\n");
		get_circle_link_list_element(list_A, 10, &elem_data);
		printf("the new element data value = %d\n\n", elem_data);
	}
	else
	{
		printf("modify failed...\n\n");
	}
	print_circle_link_list(list_A);


	// 向循环链表插入元素
	printf("6 --- insert a element to circle link list...\n\n");
	printf("\t\treply...\n");
	if( insert_circle_link_list_element(list_A, 10, 1000) == true )
	{
		printf("insert success...\n");
		print_circle_link_list(list_A);
	}
	else
	{
		printf("insert failed...\n\n");
	}

	// 删除循环链表中的一个元素
	printf("7 --- delete a element of circle link list...\n\n");
	printf("\t\treply...\n");
	if( delete_circle_link_list_element(list_A, 10) == true )
	{
		printf("delete success...\n");
		print_circle_link_list(list_A);
	}
	else
	{
		printf("delete failed...\n\n");
	}




	list_A = destory_circle_link_list(list_A);
	return true;
}



/**
 * @breif  循环链表头表法建表
 * @param
 * @retval
 */
circle_link_list *create_circle_link_list_front(circle_link_list *list,
												Elemtype *data,
												int length)
{
	circle_link_list *node = NULL;
	int i = 0;

	assert(list == NULL);
	assert(data != NULL);
	assert(length > 0);

	// 给头节点分配内存
	list = (circle_link_list *)malloc(sizeof(circle_link_list));
	// 一开始链表置空
	list->next = list;
	assert(list != NULL);
	// 插入各元素
	for(i = 0; i < length; i++)
	{
		node = (circle_link_list *)malloc(sizeof(circle_link_list));
		assert(node != NULL);
		node->data = *(data + i);
		node->next = list->next;
		list->next = node;
	}
	return list;
}


/**
 * @breif  循环链表尾表法建表
 * @param
 * @retval
 */
circle_link_list *create_circle_link_list_tail(circle_link_list *list,
											   Elemtype *data,
											   int length)
{
	circle_link_list *node = NULL;
	circle_link_list *tail = NULL;
	int i = 0;

	assert(list == NULL);
	assert(data != NULL);
	assert(length > 0);

	// 为头节点分配内存
	list = (circle_link_list *)malloc(sizeof(circle_link_list));
	assert(list != NULL);
	list->next = list;
	tail = list;
	// 插入各元素
	for(i = 0; i < length; i++)
	{
		// 为新节点分配内存
		node = (circle_link_list *)malloc(sizeof(circle_link_list));
		assert(node != NULL);
		node->data = *(data + i);
		tail->next = node;
		tail = node;
	}
	// 最后一个节点指向头节点
	tail->next = list;
	return list;
}



/**
 * @brief  释放循环单链表
 * @param
 * @retval
 */
circle_link_list *destory_circle_link_list(circle_link_list *list)
{
	circle_link_list *p_node = NULL;
	circle_link_list *temp_node = NULL;

	assert(list != NULL);
	p_node = list;
	while(p_node->next != list)
	{
		temp_node = p_node->next;
		free(p_node);
		p_node = temp_node;
	}
	return NULL;
}



/**
 * @breif  返回循环单链表的长度
 * @param
 * @retval
 */
int get_circle_link_list_length(circle_link_list *list)
{
	circle_link_list *p_node = NULL;
	int length = 0;

	assert(list != NULL);
	p_node = list;

	while(p_node->next != list)
	{
		length ++;
		p_node = p_node->next;
	}
	return length;
}


/**
 * @breif  取得循环单链表的某个元素
 * @param
 * @retval
 */
bool get_circle_link_list_element(circle_link_list *list, int index, Elemtype *elem_data)
{
	circle_link_list *p_node = NULL;
	int i = 0;

	assert(list != NULL);
	assert(index >= 0);
	p_node = list;
	while( (p_node->next != list) && (i < index) )
	{
		p_node = p_node->next;
		i ++;
	}
	if(p_node == list)
	{
		return false;
	}
	*elem_data = p_node->data;
	return true;
}


/**
 * @breif 查看循环链表是否为空
 * @param
 * @retval
 */
bool is_circle_link_list_empty(circle_link_list *list)
{
	assert(list != NULL);
	if(list->next == list)
	{
		return true;
	}
	return false;
}


/**
 * @breif 按值查找循环链表的元素
 * @param
 * @retval
 */
Elemtype *find_circle_link_list_element(circle_link_list *list, Elemtype elem_data)
{
	circle_link_list *p_node = NULL;

	assert(list != NULL);
	p_node = list->next;

	while( (p_node != list) && (p_node->data != elem_data) )
	{
		p_node = p_node->next;
	}

	if(p_node == list)
	{
		return NULL;
	}
	return &(p_node->data);
}


/**
 * @breif 修改循环链表某个元素的数据域
 * @param
 * @retval
 */
bool modify_circle_link_list(circle_link_list *list, int index, Elemtype new_data)
{
	circle_link_list *p_node = NULL;
	int i = 0;

	assert(list != NULL);
	assert(index >= 0);
	p_node= list;
	while( (p_node->next != list ) && (i < index) )
	{
		p_node = p_node->next;
		i ++;
	}

	if(p_node == list)
	{
		return false;
	}
	p_node->data = new_data;
	return true;
}

/**
 * @breif 向循环链表插入元素
 * @param
 * @retval
 */
bool insert_circle_link_list_element(circle_link_list *list, int index, Elemtype elem_data)
{
	circle_link_list *p_node = NULL;
	circle_link_list *new_node = NULL;
	int i = 0;

	assert(list != NULL);
	assert(index >= 0);
	p_node = list;

	while( (p_node->next != list) && (i < (index - 1)) )
	{
		p_node = p_node->next;
		i ++;
	}
	if(p_node == list)
	{
		// 插入失败
		return false;
	}
	new_node = (circle_link_list *)malloc(sizeof(circle_link_list));
	assert(new_node != NULL);
	new_node->data = elem_data;
	new_node->next = p_node->next;
	p_node->next = new_node;
	return true;
}

/**
 * @breif 删除循环链表的某个元素
 * @param
 * @retval
 */
bool delete_circle_link_list_element(circle_link_list *list, int index)
{
	circle_link_list *p_node = NULL;
	circle_link_list *temp_node = NULL;
	int i = 0;

	assert(list != NULL);
	assert(index >= 0);
	p_node = list;

	while( (p_node->next != list) && (i < (index - 1)) )
	{
		p_node = p_node->next;
		i ++;
	}
	temp_node = p_node->next;
	p_node->next = p_node->next->next;
	free(temp_node);
	temp_node = NULL;
	return true;
}




/**
 * @breif  打印循环链表
 * @param
 * @retval
 */
void print_circle_link_list(circle_link_list *list)
{
	circle_link_list *p_node = NULL;
	int i = 0;

	assert(list != NULL);
	p_node = list->next;

	printf("the circle link list start address = %08x\n", list);
	while(p_node != list)
	{
		printf("%d\t", p_node->data);
		if( (i + 1) % 8 == 0 )
		{
			printf("\n");
		}
		i ++;
		p_node = p_node->next;
	}
	printf("\n\n");
}










这是 circle_link_list.h的源码

/*
 *	Copyright  : 2015-2020 湖南农业大学 理学院
 *  <span style="white-space:pre">	</span>File name  : circle_link_list.h
 *	Description:
 *
 *	Author	   : Jack Huang
 *	Version	   : 
 *	Date	   : Apr 7, 2016
 *
 *	History	   : 
 */

#ifndef CIRCLE_LINK_LIST_H_
#define CIRCLE_LINK_LIST_H_

#include <stdio.h>

#define true 		(int)1
#define false 		(int)0
#define MAXSIZE		(int)100



typedef int Elemtype;
typedef int bool;

// 循环链表结构体
typedef struct circle_link_node
{
	Elemtype data;
	struct circle_link_node *next;
}circle_link_list;


// 所有的index均以0为第一位
bool circle_link_list_operation(void);
circle_link_list *create_circle_link_list_front(circle_link_list *list, Elemtype *data, int length);
circle_link_list *create_circle_link_list_tail(circle_link_list *list, Elemtype *data, int length);
circle_link_list *destory_circle_link_list(circle_link_list *list);
int get_circle_link_list_length(circle_link_list *list);
bool get_circle_link_list_element(circle_link_list *list, int index, Elemtype *elem_data);
bool is_circle_link_list_empty(circle_link_list *list);
Elemtype *find_circle_link_list_element(circle_link_list *list, Elemtype elem_data);
bool modify_circle_link_list(circle_link_list *list, int index, Elemtype new_data);
bool insert_circle_link_list_element(circle_link_list *list, int index, Elemtype elem_data);
bool delete_circle_link_list_element(circle_link_list *list, int index);
void print_circle_link_list(circle_link_list *list);

#endif /* CIRCLE_LINK_LIST_H_ */


只要在main函数里面添上circle_link_list_operation();便可运行循环链表的测试程序。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值