循环链表

来源:互联网 发布:重庆行知小小学校招聘 编辑:程序博客网 时间:2024/06/03 15:56

循环链表 和之前的链表原理一样

头文件:

#ifndef __CIRCLELIST_H__#define __CIRCLELIST_H__#include "stdio.h"#include "stdlib.h"typedef void CircleList;typedef struct _tag_CircleListNode{struct _tag_CircleListNode * next;}CircleListNode;CircleList* CircleList_Create();//创建链表void CircleList_Destroy(CircleList* list);//析构链表void CircleList_Clear(CircleList* list);//清空链表int CircleList_Length(CircleList* list);//求链表长度int CircleList_Insert(CircleList* list, CircleListNode* node, int pos);//插入CircleListNode* CircleList_Get(CircleList* list, int pos);//获取链表中元素CircleListNode* CircleList_Delete(CircleList* list, int pos);//删除节点//addCircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);CircleListNode* CircleList_Reset(CircleList* list);CircleListNode* CircleList_Current(CircleList* list);CircleListNode* CircleList_Next(CircleList* list);#endif

函数实现:

#include "circlelist.h"typedef struct TCircleList{CircleListNode header;CircleListNode  *slider;int length;}TCircleList;CircleList* CircleList_Create(){TCircleList *list = NULL;list = (TCircleList *)malloc(sizeof(TCircleList));if (list == NULL){return NULL;}list->length = 0;list->header.next = NULL;list->slider = NULL;return (CircleList*)list;}void CircleList_Destroy(CircleList* list){TCircleList *tlist = NULL;tlist = (TCircleList *)list;if (tlist == NULL){return ;}free(tlist);return;}void CircleList_Clear(CircleList* list){TCircleList *tlist = NULL;tlist = (TCircleList *)list;if (tlist == NULL){return;}tlist->header.next = NULL;tlist->slider = NULL;tlist->length = 0;return;}int CircleList_Length(CircleList* list){TCircleList *tlist = NULL;tlist = (TCircleList *)list;if (tlist == NULL){return 0;}return tlist->length;}int CircleList_Insert(CircleList* list, CircleListNode* node, int pos){if (list == NULL || node == NULL || pos < 0){return -1;}TCircleList *tlist = NULL;tlist = (TCircleList *)list;if (tlist == NULL){return -2;}if (pos > CircleList_Length(list)){return -3;}CircleListNode *current = NULL;CircleListNode *last = NULL;current = (CircleListNode *)list;if (current == NULL){return -4;}for (int i = 0; i < pos; i++){current = current->next;}if (tlist->length == 0)//当第一次插入节点的时候{current->next = node;node->next = node;tlist->length++;return 0;}if (current == (CircleListNode *)list)//插入头部时{last = CircleList_Get(list, CircleList_Length(list) - 1); //缓存最后一个元素的地址}node->next = current->next;current->next = node;if (last != NULL )//当插入头部时{last->next = node;//让最后一个节点指向头结点tlist->slider = current->next;}tlist->length++;return 0;}CircleListNode* CircleList_Get(CircleList* list, int pos){if (list == NULL ||  pos < 0){return NULL;}TCircleList *tlist = NULL;tlist = (TCircleList *)list;if (tlist == NULL){return NULL;}/*if (pos >= CircleList_Length(list)){return NULL;}*/CircleListNode *current = NULL;current = (CircleListNode *)list;if (current == NULL){return NULL;}for (int i = 0; i < pos; i++){current = current->next;}return (CircleListNode*)current->next;}CircleListNode* CircleList_Delete(CircleList* list, int pos){if (list == NULL || pos < 0){return NULL;}TCircleList *tlist = NULL;tlist = (TCircleList *)list;if (tlist == NULL){return NULL;}if (pos >= CircleList_Length(list)){return NULL;}CircleListNode *current = NULL;current = (CircleListNode *)list;if (current == NULL){return NULL;}for (int i = 0; i < pos; i++){current = current->next;}CircleListNode *last = NULL;CircleListNode *last_node = NULL;if (current == (CircleListNode *)list)//删除头部时{last_node = CircleList_Get(list, CircleList_Length(list) - 1); //缓存最后一个元素的地址}last = current->next;//缓存删除的元素current->next = last->next;if (last_node != NULL)//删除头部时{last_node->next = last->next;}tlist->length--;if (tlist->slider == last)//如果保存的第一个元素与删除的元素相同时,保存删除的元素的下一个元素{tlist->slider = last->next;}if (tlist->length == 0)//如果删除了最后一个元素{tlist->header.next = NULL;tlist->slider = NULL;}return (CircleListNode*) last;}//addCircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node){return NULL;}CircleListNode* CircleList_Reset(CircleList* list){return NULL;}CircleListNode* CircleList_Current(CircleList* list){return NULL;}CircleListNode* CircleList_Next(CircleList* list){return NULL;}

测试程序:

#include "circlelist.h"typedef struct Teacher{CircleListNode node;int age;}Teacher;void main(){int ret = 0;Teacher t1, t2, t3, t4;t1.age = 1;t2.age = 2;t3.age = 3;t4.age = 4;CircleList *list = NULL;list = CircleList_Create();if (list == NULL){printf("ERROR!! func  CircleList_Create()");goto END;}int length = CircleList_Length(list);printf("未插入数据时长度:%d\n", length);ret = CircleList_Insert(list, (CircleListNode *)(&t1), 0);if (ret != 0){printf("ERROR!! FUNC CircleList_Insert()%d\n", ret);goto END;}ret = CircleList_Insert(list, (CircleListNode *)(&t2), 1);if (ret != 0){printf("ERROR!! FUNC CircleList_Insert()%d\n", ret);goto END;}ret = CircleList_Insert(list, (CircleListNode *)(&t3), 2);if (ret != 0){printf("ERROR!! FUNC CircleList_Insert()%d\n", ret);goto END;}ret = CircleList_Insert(list, (CircleListNode *)(&t4), 3);if (ret != 0){printf("ERROR!! FUNC CircleList_Insert()%d\n", ret);goto END;}Teacher *tmp = NULL;length = CircleList_Length(list);printf("插入数据后长度:%d\n", length);printf("***********************\n");for (int i = 0; i < 2 * length; i++)//证明是循环链表{tmp = (Teacher *)CircleList_Get(list, i);printf("%d    ", tmp->age);}printf("\n***********************\n");tmp = (Teacher *)CircleList_Delete(list, 0);if (tmp == NULL){printf("ERROR!! FUNC CircleList_Delete()\n");goto END;}printf("删除的老师的年龄:%d\n", tmp->age);length = CircleList_Length(list);printf("删除数据后长度:%d\n", length);tmp = (Teacher *)CircleList_Get(list, 0);if (tmp == NULL){printf("ERROR!! FUNC CircleList_Delete()\n");goto END;}printf("获取第一个老师的年龄:%d\n", tmp->age);while (CircleList_Length(list) > 0){tmp = (Teacher *) CircleList_Delete(list, 0);if (tmp == NULL){printf("ERROR!! FUNC CircleList_Delete()\n");goto END;}printf("删除的老师的年龄:%d\n", tmp->age);}CircleList_Clear(list);CircleList_Destroy(list);END:system("pause");}


0 0
原创粉丝点击