C语言循环链表实现

来源:互联网 发布:java平台是什么 编辑:程序博客网 时间:2024/04/29 23:56
现在把这两天完成的循环链表的程序发上来,供大家参阅。

循环单链表相对与单链表仅仅只是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)100typedef 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();便可运行循环链表的测试程序。



0 0