通用简单版循环链表

来源:互联网 发布:国际交流软件有哪些 编辑:程序博客网 时间: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
原创粉丝点击