通用简单版循环链表
来源:互联网 发布:国际交流软件有哪些 编辑:程序博客网 时间:2024/05/01 15:32
circle.h
#pragma once//给用户的头文件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);//插入CircleListNode *CircleList_Insert(CircleList *list, CircleListNode *node, int pos);//获取CircleListNode *CircleList_Get(CircleList *list, int pos);//删除CircleListNode *CircleList_Delete(CircleList *list, int pos);//删除某个节点CircleListNode *CircleList_DeleteNode(CircleList *list, CircleListNode *node);//重置游标CircleListNode *CircleList_Reset(CircleList *list);//返回当前游标值CircleListNode *CircleList_Current(CircleList *list);//返回当前值,且游标下移CircleListNode *CircleList_Next(CircleList *list);
circle.c
#include <stdlib.h>#include <string.h>#include <stdio.h>#include "circle.h"//内部实现typedef struct _tag_Circle{ CircleListNode header; CircleListNode *slider; int length;}TCircleList;//创建CircleList *CircleList_Create(){ TCircleList *ret = (TCircleList *)malloc(sizeof(TCircleList)); if (ret == NULL) { return NULL; } ret->length = 0; ret->slider = NULL; ret->header.next = NULL; //初始化 return ret;}//销毁void CircleList_Destroy(CircleList *list){ TCircleList *ret = (TCircleList *)list; if (ret != NULL) free(ret);}//清空void CircleList_Clear(CircleList *list){ TCircleList *ret = (TCircleList *)list; if (ret != NULL) { ret->header.next = NULL; ret->slider = NULL; }}//长度int CircleList_Length(CircleList*list){ TCircleList *ret = (TCircleList *)list; if (ret != NULL) { return ret->length; } return 0;}//插入CircleListNode *CircleList_Insert(CircleList *list, CircleListNode *node, int pos){ TCircleList *ret = (TCircleList *)list; if (ret == NULL || node == NULL) { return NULL; } //结构体的首元素地址,就是结构体本身的地址/C语言 CircleListNode * current = (CircleListNode *)ret; for (int i = 0; i<pos&& current != NULL; i++) { current = current->next; } node->next = current->next; current->next = node; ret->length++; if (current == (CircleListNode *)ret) { //求出最后一个元素//用来指向第一个元素 CircleListNode *last = CircleList_Get(ret, ret->length - 1); if (last != NULL) { //把最后一个元素->指向开头 last->next = current->next; } } return current->next;}//获取CircleListNode *CircleList_Get(CircleList *list, int pos){ TCircleList *ret = (TCircleList *)list; if (ret == NULL || pos<0) { return NULL; } //结构体的首元素地址,就是结构体本身的地址/C语言 CircleListNode * current = (CircleListNode *)ret; for (int i = 0; i<pos&& current != NULL; i++) { current = current->next; } return current->next;}//删除CircleListNode *CircleList_Delete(CircleList *list, int pos){ TCircleList *ret = (TCircleList *)list; if (ret == NULL || ret->length == 0 || pos<0) { return NULL; } //结构体的首元素地址,就是结构体本身的地址/C语言 CircleListNode * current = (CircleListNode *)ret; //要删除的元素 CircleListNode *deleteNode = NULL; CircleListNode *last = NULL; for (int i = 0; i<pos&& current != NULL; i++) { current = current->next; } //删除的第一个 if (current == (CircleListNode *)ret) { //如果删除的第一个,那么最后一个元素,就要重新指向新的节点。 last = (CircleListNode *)CircleList_Get(ret, ret->length - 1); } deleteNode = current->next; current->next = deleteNode->next; ret->length--; //判断是不是删除的第一个 if (last != NULL) { //重置头节点 ret->header.next = deleteNode->next; last->next = deleteNode->next; } //游标指向删除节点处理 if (ret->slider == deleteNode) { ret->slider = deleteNode->next; } if (ret->length == 0) { CircleList_Clear(ret); } return deleteNode;}//删除某个节点CircleListNode *CircleList_DeleteNode(CircleList *list, CircleListNode *node){ TCircleList *ret = (TCircleList *)list; if (ret == NULL || ret->length == 0 || node == NULL) { return NULL; } //结构体的首元素地址,就是结构体本身的地址/C语言 CircleListNode * current = (CircleListNode *)ret; //要删除的元素 CircleListNode *deleteNode = NULL; int i = 0; for (i = 0; i<ret->length && current != NULL; i++) { if (current->next == node) { deleteNode = current->next; } current = current->next; } if (deleteNode != NULL) { return CircleList_Delete(ret, i); } return NULL;}//重置游标CircleListNode *CircleList_Reset(CircleList *list){ TCircleList *ret = (TCircleList *)list; if (ret == NULL) { return NULL; } ret->slider = ret->header.next; return ret->slider;}//返回当前游标值CircleListNode *CircleList_Current(CircleList *list){ TCircleList *ret = (TCircleList *)list; if (ret == NULL) { return NULL; } return ret->slider;}//返回当前值,且游标下移CircleListNode *CircleList_Next(CircleList *list){ TCircleList *ret = (TCircleList *)list; if (ret == NULL) { return NULL; } CircleListNode *current = ret->slider; ret->slider = ret->slider->next; return current;}
测试文件 main.c
#include "circle.h"#include "stdlib.h"#include "stdio.h"typedef struct _Teacher{ CircleListNode *head; int age;}Teacher;void main(){ CircleList *circle = CircleList_Create(); if (circle == NULL) return 0; Teacher t1, t2, t3; t1.age = 10; t2.age = 20; t3.age = 30; CircleList_Insert(circle, (CircleListNode*)&t1,0); CircleList_Insert(circle, (CircleListNode*)&t2, 0); CircleList_Insert(circle, (CircleListNode*)&t3, 0); for (int i = 0; i < 6; i++) { Teacher *temp = (Teacher *)CircleList_Get(circle, i); if (temp != NULL) { printf("Teacher age:%d \n",temp->age); } } system("pause");}
有意见,或者有问题,欢迎提出.
1 0
- 通用简单版循环链表
- 数据结构通用双向循环链表实现
- 通用简单版-顺序表
- 通用链表(内核双向循环链表list_head)
- 双向循环链表 C语言通用编程的思考
- C语言通用双向循环链表操作函数集
- 一个通用链表的简单实现
- 简单的通用链表实现
- 一个通用链表的简单实现
- 简单通用的双向链表
- 通用简单版 单链表
- 简单的循环链表
- 通用循环缓冲区类(c++版)
- 简单实现双向循环链表
- 约瑟夫问题简单实现-循环链表
- 循环链表的简单应用
- 单向循环链表的简单实现
- 双向循环链表的简单实现
- 【Android】RxJava 入门详解
- 第十六周oj题目职工信息结构体
- 期末复习之TCP----IP网络中的名称解析
- 《Effective Objective-C 2.0》读书笔记---第二章
- java操作excel
- 通用简单版循环链表
- maven构建时的注意事项01
- ElasticSearch学习24_elasticsearch2.3 以root用户启动
- jQuery层级选择器
- Codeforces 400D. Dima and Bacteria【并查集+最短路】
- LinuxShell宝典 --- 判断与比较
- 升讯威ADO.NET增强组件(源码):送给喜欢原生ADO.NET的你
- ElasticSearch详解三之——查询
- MVC和MVP