循环链表
参考C语言代码(与普通链表不同处用红色标明)
main_circlelist.c文件(上层应用):
#include <stdio.h> #include <stdlib.h> #include "circlelist.h" typedef struct { CircleListNode* node; int age; char name[64]; }Student; void main() { int i = 0; Student s1, s2, s3, s4, s5, s6; s1.age = 18; s2.age = 19; s3.age = 20; s4.age = 21; s5.age = 22; s6.age = 23; CircleList* list = CircleList_Create(); CircleList_Insert(list, (CircleListNode*)&s1, 0); CircleList_Insert(list, (CircleListNode*)&s2, 0); CircleList_Insert(list, (CircleListNode*)&s3, 0); CircleList_Insert(list, (CircleListNode*)&s4, 0); CircleList_Insert(list, (CircleListNode*)&s5, 0); CircleList_Insert(list, (CircleListNode*)&s6, 0); //遍历 for (i = 0; i < 2 * CircleList_Length(list); i++) { Student* tmp = (Student*)CircleList_Get(list, i); printf("age:%d ", tmp->age); } printf("\n"); /*while (CircleList_Length(list)>0) { Student* tmp = (Student* )CircleList_Delete(list, 0); printf("age:%d ", tmp->age); }*/ CircleList_Delete(list, 2); for (i = 0; i < 2 * CircleList_Length(list); i++) { Student* tmp = (Student*)CircleList_Get(list, i); printf("age:%d ", tmp->age); } CircleList_Reset(list); List_Destroy(list); system("pause"); return; }
circlelist.h文件(头文件):
#ifndef _CIRCLELIST_H_ #define _CIRCLELIST_H_ typedef void CircleList; typedef struct _tag_CircleListNode { struct _tag_CircleListNode * next; }CircleListNode; CircleList* CircleList_Create(); void List_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); //add CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);//找到与node相同的节点删除 CircleListNode* CircleList_Reset(CircleList* list); CircleListNode* CircleList_Current(CircleList* list);//获取游标位置的值 CircleListNode* CircleList_Next(CircleList* list);//返回游标当前位置的值,并且游标下移 #endif
circlelist.c文件(底层实现):
#include <stdio.h> #include <stdlib.h> #include "circlelist.h" typedef struct _tag_CircleList { CircleListNode header; CircleListNode* slider;//内部数据类型多了个游标 int length; } S_CircleList; CircleList* CircleList_Create() { S_CircleList* ret = (S_CircleList*)malloc(sizeof(S_CircleList)); if (ret == NULL) { return NULL; } ret->length = 0; ret->header.next = NULL; ret->slider = NULL; return ret; } void List_Destroy(CircleList* list) { if (list == NULL) { return; } free(list); } void CircleList_Clear(CircleList* list) { S_CircleList* s_list = (S_CircleList*)list; if (s_list == NULL) { return; } s_list->length = 0; s_list->header.next = NULL; s_list->slider = NULL; } int CircleList_Length(CircleList* list) { S_CircleList* s_list = (S_CircleList*)list; if (s_list == NULL) { return 0; } return s_list->length; } int CircleList_Insert(CircleList* list, CircleListNode* node, int pos) { int i; S_CircleList* s_list = (S_CircleList*)list; if (s_list == NULL) { return 0; } CircleListNode* current = (CircleListNode*)list;/*current指向头部 因为list首地址和header首地址重叠*/ //CircleListNode* current=&(s_list->header);一样的 for (i = 0; (i < pos) && (current->next != NULL); i++) { current = current->next; } node->next = current->next; current->next = node; //若第一次插入节点 if (s_list->length == 0) { s_list->slider = node; } s_list->length++; //若头插法 current仍然指向头部 //(原因是:跳0步,没有跳走) if (current == (CircleListNode*)s_list) { //获取最后一个元素 CircleListNode* last = CircleList_Get(s_list, s_list->length - 1); last->next = current->next; //把最后一个元素连回来 } return 1; //第一次插入既是头插法,也是尾插法。 } CircleListNode* CircleList_Get(CircleList* list, int pos) { int i; S_CircleList* s_list = (S_CircleList*)list; if (s_list == NULL) { return 0; } CircleListNode* current = (CircleListNode*)list; for (i = 0; (i < pos) && (current->next != NULL); i++) { current = current->next; } return current->next; } CircleListNode* CircleList_Delete(CircleList* list, int pos) { int i; S_CircleList* s_list = (S_CircleList*)list; CircleListNode* ret = NULL; if (s_list == NULL) { return 0; } if ((s_list != NULL) && (pos >= 0) && (s_list->length > 0)) { CircleListNode* current = (CircleListNode*)list; CircleListNode* last = NULL; for (i = 0; (i < pos) && (current->next != NULL); i++) { current = current->next; } //若删除第一个元素(头结点) if (current == (CircleListNode*)s_list) { last = (CircleListNode*)CircleList_Get(s_list, s_list->length - 1); } //求要删除的元素 ret = current->next; current->next = ret->next; s_list->length--; if (last != NULL) { s_list->header.next = ret->next; last->next = ret->next; } //若删除的元素为游标所指的元素 if (s_list->slider == ret) { s_list->slider = ret->next; } //若删除元素后,链表长度为0 if (s_list->length == 0) { s_list->header.next = NULL; s_list->slider = NULL; } } return ret; } //add CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node) //找到与node相同的节点删除 { int i; S_CircleList* s_list = (S_CircleList*)list; CircleListNode* ret = NULL; if (s_list != NULL) { CircleListNode* current = (CircleListNode*)s_list; //查找node在循环链表中的位置i for (i = 0; i<s_list->length; i++) { if (current->next == node) { ret = current->next; break; } current = current->next; } //如果ret找到,根据i去删除 if (ret != NULL) { CircleList_Delete(s_list, i); } } return ret; } CircleListNode* CircleList_Reset(CircleList* list) { S_CircleList* s_list = (S_CircleList*)list; CircleListNode* ret = NULL; if (s_list != NULL) { s_list->slider = s_list->header.next; ret = s_list->slider; } return ret; } CircleListNode* CircleList_Current(CircleList* list) { S_CircleList* s_list = (S_CircleList*)list; CircleListNode* ret = NULL; if (s_list != NULL) { ret = s_list->slider; } return ret; } CircleListNode* CircleList_Next(CircleList* list) { S_CircleList* s_list = (S_CircleList*)list; CircleListNode* ret = NULL; if (s_list != NULL) { ret = s_list->slider; s_list->slider = ret->next; } return ret; }

浙公网安备 33010602011771号