现在把这两天完成的循环链表的程序发上来,供大家参阅。
循环单链表相对与单链表仅仅只是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");
}
/*
* 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();便可运行循环链表的测试程序。