循环链表

参考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;
}

 

posted @ 2018-03-16 09:29  Alexadar  阅读(127)  评论(0)    收藏  举报