循环链表

              循环链表

CircleList.h

#define _CRT_SECURE_NO_DEPRECATE
#pragma  once
#ifndef _CIRCLELIST_H_
#define _CIRCLELIST_H_
#include<string.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);
CircleListNode* CircleList_Get(CircleList* list, int pos);
int CircleList_Insert(CircleList* list, CircleListNode* node, int pos);
CircleListNode* CircleList_Delete(CircleList* list, int pos);

//add

CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);
CircleListNode* CircleList_Reset(CircleList* list);
CircleListNode* CircleList_Current(CircleList* list);
CircleListNode* CircleList_Next(CircleList* list);

#endif

CircleList.c

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "CircleList.h"

typedef struct _tag_CircleList
{
    CircleListNode pHead;
    CircleListNode* Slider;//游标
    int length;
}TCircleList;


CircleList* CircleList_Create()
{
    TCircleList *pTem = NULL;
    pTem = (TCircleList*)malloc(sizeof(TCircleList));//分配内存

    //初始化
    pTem->pHead.next = NULL;
    pTem->length = 0;
    pTem->Slider = NULL;
    return pTem;
}
void CircleList_Destroy(CircleList* list)
{
    TCircleList *pTem = (TCircleList*)list;
    if (pTem!=NULL)
    {
        free(pTem);
        pTem = NULL;
    }
    list = pTem;
    return ;
}
void CircleList_Clear(CircleList* list)
{
    TCircleList *pTem = (TCircleList*)list;
    if (list==NULL)
    {
        printf("CircleList_Clear() err \n");
        return;
    }
    pTem->length = 0;
    pTem->pHead.next = NULL;
    pTem->Slider = NULL;
    return ;
}
int CircleList_Length(CircleList* list)
{
    TCircleList *pTem = (TCircleList*)list;
    if (list == NULL)
    {
        printf("CircleList_Length() err \n");
        return -1;
    }
    return pTem->length;
}
CircleListNode* CircleList_Get(CircleList* list, int pos)
{
    TCircleList *pTem = (TCircleList*)list;
    CircleListNode *Current = (CircleListNode*)list;
    CircleListNode *pRem = NULL;

    if (list == NULL|| pos < 0)
    {
        printf("CircleList_Get() err \n");
        return NULL;
    }
    for (int i = 0; i < pos; i++)
    {
        Current = Current->next;
    }
    pRem = Current->next;
    return pRem;
}
int CircleList_Insert(CircleList* list, CircleListNode* node, int pos)
{
    TCircleList *pTem = (TCircleList*)list;
    CircleListNode *Current = (CircleListNode*)list;
    CircleListNode *pRem = NULL;
    CircleListNode *pLast = (CircleListNode*)list;

    if (list == NULL || pos < 0|| node == NULL)
    {
        printf("CircleList_Get() err \n");
        return 0;
    }
    for (int i = 0; i < pos; i++)
    {
        Current = Current->next;
    }
    pRem = Current->next;
    //普通插入和线性链表一样
    node->next = Current->next;
    Current->next = node;

    //如果链表为空
    if (pTem->length==0)
    {
        //pTem->pHead.next = node;
        node->next = node;
        pTem->Slider = node;
    }
    pTem->length++;

    //如果是你在头部插入  长度大于0  且插入位置是0
    if (pTem->length>0)
    {
        if (pos==0)
        {
            pLast = CircleList_Get(pTem, pTem->length - 1);//获取最后一个元素
            pLast->next = node;
        }
    }
    return 0;
}


CircleListNode* CircleList_Delete(CircleList* list, int pos)
{
    TCircleList *pTem = (TCircleList*)list;
    CircleListNode *Current = &pTem->pHead;
    CircleListNode *pRem = NULL;
    CircleListNode *pLast = (CircleListNode*)list;
    if (list == NULL || pos < 0)
    {
        printf("CircleList_Get() err \n");
        return 0;
    }
    for (int i = 0; i < pos; i++)
    {
        Current = Current->next;//待删节点的前一节点
    }
    //如果的删除的元素在首部
    if (Current == &pTem->pHead)//pos==0
    {
        if (pTem->length == 1)//只有一个元素
        {
            pRem = Current->next;
            pTem->pHead.next = NULL;
            pTem->length = 0;
            pTem->Slider = NULL;
            return pRem;
        }
        else if (pTem->length > 1)//长度大于1
        {
            pRem = Current->next;
            pLast = CircleList_Get(pTem, pTem->length - 1);//最后一个元素的地址在前一元素的next域
            Current->next = Current->next->next;//删除节点
            pLast->next = Current->next;
            pTem->length--;
            if (pTem->Slider = pRem)//若为游标所指元素
            {
                pTem->Slider = pRem->next;
            }
            return pRem;
        }
    }
    //如果删除的元素位置不是pos=0
    pRem = Current->next;
    Current->next = pRem->next;
    pTem->length--;
    if (pTem->Slider = pRem)//若为游标所指元素
    {
        pTem->Slider = pRem->next;
    }
    return pRem;
}

//Add
CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node) // O(n)
{
    TCircleList* sList = (TCircleList*)list;
    CircleListNode* ret = NULL;
    int i = 0;

    if (sList != NULL)
    {
        CircleListNode* current = (CircleListNode*)sList;

        //查找node在循环链表中的位置i
        for (i = 0; i < sList->length; i++)
        {
            if (current->next == node)
            {
                ret = current->next;
                break;
            }
            current = current->next;
        }
        //如果ret找到,根据i去删除    
        if (ret != NULL)
        {
            CircleList_Delete(sList, i);
        }
    }
    return ret;
}

CircleListNode* CircleList_Reset(CircleList* list) // O(1)
{
    TCircleList* sList = (TCircleList*)list;
    CircleListNode* ret = NULL;

    if (sList != NULL)
    {
        sList->Slider = sList->pHead.next;
        ret = sList->Slider;
    }

    return ret;
}

CircleListNode* CircleList_Current(CircleList* list) // O(1)
{
    TCircleList* sList = (TCircleList*)list;
    CircleListNode* ret = NULL;

    if (sList != NULL)
    {
        ret = sList->Slider;
    }

    return ret;
}

CircleListNode* CircleList_Next(CircleList* list) // O(1)
{
    TCircleList* sList = (TCircleList*)list;
    CircleListNode* ret = NULL;

    if ((sList != NULL) && (sList->Slider != NULL))
    {
        ret = sList->Slider;
        sList->Slider = ret->next;
    }

    return ret;
}

mainTest.c

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "CircleList.h"

typedef struct Student
{
    CircleListNode pHead;
    int age;
}Student;


void print(CircleList* list)
{
    Student *p = NULL;
    CircleListNode *q = NULL;
    for (int i = 0; i <CircleList_Length(list); i++)
    {
        q=CircleList_Get(list,i);
        p = (Student *)q;
        printf("%d \t", p->age);
    }
}

int main()
{
    Student s1, s2, s3, s4, s5;
    s1.age = 25;
    s2.age = 20;
    s3.age = 21;
    s4.age = 22;
    s5.age = 24;

    CircleList*circlelist;
    circlelist=CircleList_Create();

   CircleList_Insert(circlelist, (CircleListNode*)(&s1), 0);
   CircleList_Insert(circlelist, (CircleListNode*)(&s2), 0);
   CircleList_Insert(circlelist, (CircleListNode*)(&s3), 0);
   CircleList_Insert(circlelist, (CircleListNode*)(&s4), 0);
   CircleList_Insert(circlelist, (CircleListNode*)(&s5), 0);

   print(circlelist);
   printf("\n");
   CircleList_Delete(circlelist, 2);
   CircleList_Delete(circlelist, 1);
   CircleList_Delete(circlelist, 0);

   print(circlelist);
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值