频道栏目
首页 > 资讯 > C语言 > 正文

循环链表c语言实现 circlelinklist.h 和 circlelinklist.c

17-07-11        来源:[db:作者]  
收藏   我要投稿

circlelinklist.h 文件

#ifndef _CIRCLE_LINK_LIST_H_
#define _CIRCLE_LINK_LIST_H_
#include 
#include 
#include 
//循环链表
//链表操作精髓在于操作关系节点,引入辅助指针pcurrent,pnext.从表头开始遍历各关系节点。
//链表就是一个一个的表通过关系节点连接的


//利用小节点定义一个链表头,其他的业务节点有业务自己定义后连接到表头上

//实现上层调用和底层分离,不让调用用户知道数据结构
typedef void List;
typedef void ListNode;

#ifndef bool
#define bool int
#define true 1
#define false 0
#endif

//定义小节点是有联系的 ,小节点的链表
typedef struct _tag_CircleLinkListConnectedNode
{
    struct _tag_CircleLinkListConnectedNode* next;
}CircleLinkListConnectedNode;

//定义链表
typedef struct _tag_CircleLinkList{
    CircleLinkListConnectedNode head;  //小节点
    CircleLinkListConnectedNode* slider; //游标 
    int length; //小节点的个数就相当于业务节点的个数
}CircleLinkList;


List* CircleLinkList_Create();
bool CircleLinkList_Destory(List* list);
bool CircleLinkList_Clear(List* list);
int CircleLinkList_GetLength(List* list);
bool CircleLinkList_InsertOneNode(List* list , ListNode* listnode, int pos);
ListNode* CircleLinkList_GetOneNode(List* list, int pos);
ListNode* CircleLinkList_DeleteOneNode(List* list,int pos);
bool CircleLinkList_DeleteAllNode(List* list);
ListNode* CircleLinkList_DeleteOneNodeByNodePointer(List* list,ListNode* listnode);
ListNode* CircleLinkList_ResetSlider(List* list);
ListNode* CircleLinkList_GetCurrentSlider(List* list);
ListNode* CircleLinkList_SliderMoveToNext(List* list);
#endif

circlelinklist.c 文件

#include 
#include 
#include 
#include "circlelinklist.h"
//链表操作精髓在于操作关系节点,引入辅助指针pcurrent,pnext.从表头开始遍历各关系节点。
//链表就是一个一个的表通过关系节点连接的
List* CircleLinkList_Create()
{
   List* ret = NULL;
   CircleLinkList* temp_circlelist = NULL;
   temp_circlelist = (CircleLinkList*)malloc(sizeof(CircleLinkList));
   if (temp_circlelist == NULL)
   {
       return NULL;
   }
   temp_circlelist->head.next =NULL;
   temp_circlelist->length = 0;
   temp_circlelist->slider = NULL;
   ret = (CircleLinkList*)temp_circlelist;
   return ret;
}

bool CircleLinkList_Destory(List* list)
{
    CircleLinkList* temp_circlelist = NULL;
    if (list == NULL)
    {
        return false;
    }
    temp_circlelist = (CircleLinkList*)list;
    free(temp_circlelist);
    temp_circlelist = NULL;
    return true;
}

bool CircleLinkList_Clear(List* list)
{
    CircleLinkList* temp_circlelist = NULL;
    if (list == NULL)
    {
        return false;
    }
    temp_circlelist = (CircleLinkList*)list;
    //长度清零,头部指向空,游标指向空
    temp_circlelist->length = 0;
    temp_circlelist->head.next = NULL;
    temp_circlelist->slider = NULL;
    return true;
}

int CircleLinkList_GetLength(List* list)
{
    int ret = 0;
    CircleLinkList* temp_circlelist = NULL;
    if (list == NULL)
    {
        return -1;
    }
    temp_circlelist = (CircleLinkList*)list;
    ret = temp_circlelist->length;
    return ret;
}

bool CircleLinkList_InsertOneNode(List* list , ListNode* listnode, int pos)
{
    CircleLinkList* temp_circlelist = NULL;
    CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL;
    CircleLinkListConnectedNode* pcurrent = NULL;
    int i = 0;
    CircleLinkListConnectedNode* lastnode = NULL;
    if (list == NULL || listnode == NULL || pos < 0)
    {
        return false;
    }
    temp_circlelist = (CircleLinkList*)list;
    temp_circlelistconnected_node = (CircleLinkListConnectedNode*)listnode;
    //链表的首地址与小节点的地址相同
    pcurrent = (CircleLinkListConnectedNode*)temp_circlelist;
    //pcurrent =(CircleListNode*) &(temp_circlelist->head);
    //辅助指针从头部跳到(pos-1) 处;头部、0、1、2、。。
    for (i = 0; (i < pos && pcurrent->next != NULL); i ++)
    {
        pcurrent = pcurrent->next;
    }
    //插入节点
    temp_circlelistconnected_node->next = pcurrent->next;
    pcurrent->next = temp_circlelistconnected_node;
    //第一次插入节点,游标指向插入的第一个节点 即 0 位置
    if (temp_circlelist->length == 0)
    {
        temp_circlelist->slider = temp_circlelistconnected_node;
    }
    //长度加1
    temp_circlelist->length++;
    //辅助指针没有调,头插法,插到0位置
    if (pcurrent == (CircleLinkListConnectedNode*)temp_circlelist)
    {
        //得到最后一个节点
        lastnode = (CircleLinkListConnectedNode*)CircleLinkList_GetOneNode((List*)temp_circlelist,temp_circlelist->length - 1);
        //最后一个节点的next域指向当前插入
        lastnode->next = pcurrent->next;
        //lastnode->next = temp_circlelist_node;
    }
    return true;
}

ListNode* CircleLinkList_GetOneNode(List* list, int pos)
{

    CircleLinkList* temp_circlelist = NULL;
    CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL;
    CircleLinkListConnectedNode* pcurrent = NULL;
    int i = 0;
    ListNode* ret = NULL;
    if (list == NULL || pos < 0)
    {
        return NULL;
    }
    temp_circlelist = (CircleLinkList*)list;
    //不要判断长度了,循环的嘛
    if (temp_circlelist->length <= 0 )
    {
        return NULL;
    }
    //链表的首地址与小节点的地址相同
    pcurrent = (CircleLinkListConnectedNode*)temp_circlelist;
    //pcurrent =(CircleListNode*) &(temp_circlelist->head);
    //辅助指针从头部跳到(pos-1) 处;头部、0、1、2、。。
    for (i = 0; (i < pos && pcurrent->next != NULL); i ++)
    {
        pcurrent = pcurrent->next;
    }
    temp_circlelistconnected_node = (CircleLinkListConnectedNode*)(pcurrent->next);
    ret = (ListNode*)temp_circlelistconnected_node;
    return ret;
}

ListNode* CircleLinkList_DeleteOneNode(List* list,int pos)
{
    CircleLinkList* temp_circlelist = NULL;
    CircleLinkListConnectedNode* temp_circlelistconnected_node_delete = NULL;
    CircleLinkListConnectedNode* pcurrent = NULL;
    CircleLinkListConnectedNode* lastnode = NULL;
    int i = 0;
    ListNode* ret = NULL;
    if (list == NULL || pos < 0) 
    {
        return NULL;
    }
    temp_circlelist = (CircleLinkList*)list;
    //链表的首地址与小节点的地址相同
    pcurrent = (CircleLinkListConnectedNode*)temp_circlelist;
    //pcurrent =(CircleListNode*) &(temp_circlelist->head);
    if (temp_circlelist->length <= 0 || pos >= temp_circlelist->length)
    {
        return NULL;
    }
    //辅助指针从头部跳到(pos-1) 处;头部、0、1、2、。。
    for (i = 0; (i < pos && pcurrent->next != NULL); i ++)
    {
        pcurrent = pcurrent->next;
    }
    temp_circlelistconnected_node_delete = pcurrent->next;
    pcurrent->next = temp_circlelistconnected_node_delete->next;
    //pcurrent->next = pcurrent->next->next;
    //如果从0位置删除
    if (pcurrent == (CircleLinkListConnectedNode*)temp_circlelist)
    {
        //得到最后一个节点
        lastnode = (CircleLinkListConnectedNode*)CircleLinkList_GetOneNode((List*)temp_circlelist,temp_circlelist->length - 1);
        //最后一个节点的next域指向当前插入
        if (lastnode != NULL)
        {
            lastnode->next = pcurrent->next;
            //lastnode->next = temp_circlelist_node_delete->next;
            //lastnode->next = temp_circlelist->head.next;
        }

    }
    //长度减1
    temp_circlelist->length--;
    //如果删除的是游标指向的位置则游标下移
    if (temp_circlelist->slider == temp_circlelistconnected_node_delete)
    {
        temp_circlelist->slider = temp_circlelistconnected_node_delete->next;
    }
    //长度为0就清空
    if (temp_circlelist->length == 0)
    {
        temp_circlelist->head.next = NULL;
        temp_circlelist->slider = NULL;
    }

    ret = (ListNode*)temp_circlelistconnected_node_delete;
    return ret;
}

bool CircleLinkList_DeleteAllNode(List* list)
{
    CircleLinkList* temp_circlelist = NULL;
    if (list == NULL)
    {
        return false;
    }
    temp_circlelist = (CircleLinkList*)list;
    while (temp_circlelist->length > 0 )
    {
        CircleLinkList_DeleteOneNode((List*)temp_circlelist,0);
    }
    return true;
}

ListNode* CircleLinkList_DeleteOneNodeByNodePointer(List* list,ListNode* listnode)
{
    CircleLinkList* temp_circlelist = NULL;
    CircleLinkListConnectedNode* temp_circlelistconnected_node_delete = NULL;
    CircleLinkListConnectedNode* pcurrent = NULL;
    CircleLinkListConnectedNode* retnode = NULL;
    int i = 0;
    ListNode* ret = NULL;
    if (list == NULL || listnode == NULL)
    {
        return NULL;
    }
    temp_circlelist = (CircleLinkList*)list;
    temp_circlelistconnected_node_delete = (CircleLinkListConnectedNode*)listnode;
    pcurrent = (CircleLinkListConnectedNode*)temp_circlelist;
    for (i = 0; i < temp_circlelist->length; i ++)
    {
        pcurrent = pcurrent->next;
        if (pcurrent == temp_circlelistconnected_node_delete)
        { 
            retnode = pcurrent;
            break;
        }
    }
    if (retnode == NULL)
    {
        return NULL;
    }
    CircleLinkList_DeleteOneNode((List*)temp_circlelist,i);
    ret =(ListNode*)retnode;
    return ret;
}

//重置游标
ListNode* CircleLinkList_ResetSlider(List* list)
{
    CircleLinkList* temp_circlelist = NULL;
    CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL;
    ListNode* ret = NULL;
    if (list == NULL)
    {
        return NULL;
    }
    temp_circlelist = (CircleLinkList*)list;
    temp_circlelist->slider = temp_circlelist->head.next;

    temp_circlelistconnected_node = temp_circlelist->slider;
    ret = (ListNode* )temp_circlelistconnected_node;
    return ret;
}
//返回当前游标,
ListNode* CircleLinkList_GetCurrentSlider(List* list)
{
    CircleLinkList* temp_circlelist = NULL;
    CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL;
    ListNode* ret = NULL;
    if (list == NULL)
    {
        return NULL;
    }
    temp_circlelist = (CircleLinkList*)list;

    temp_circlelistconnected_node = temp_circlelist->slider;
    ret = (ListNode* )temp_circlelistconnected_node;
    return ret;
}
//游标下移,并返回游标下移之前的节点
ListNode* CircleLinkList_SliderMoveToNext(List* list)
{
    CircleLinkList* temp_circlelist = NULL;
    CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL;
    ListNode* ret = NULL;
    if (list == NULL)
    {
        return NULL;
    }
    temp_circlelist = (CircleLinkList*)list;
    if (temp_circlelist->slider == NULL)
    {
        return NULL;
    }
    //得到当前游标指向的节点
    temp_circlelistconnected_node = temp_circlelist->slider;
    //游标下移,指向下一个节点
    temp_circlelist->slider = temp_circlelistconnected_node->next;
    //返回当初得到的节点
    ret = (ListNode*)temp_circlelistconnected_node;
    return ret;

}


/***********************以下为测试代码************************/

/*
typedef struct _tag_Teacher
{

    CircleLinkListConnectedNode node;
    int age ;
    char name[];
}Teacher;

void main()
{
    List* list = NULL;
    Teacher t1,t2,t3,t4,t5;
    int kk = 0;
    Teacher* teacher = NULL;
    t1.age = 21;t2.age = 22;t3.age = 23;t4.age = 24;t5.age = 25;
    list = CircleLinkList_Create();
    if (list == NULL)
    {
        printf("创建list失败");
    }
    //尾插法
    CircleLinkList_InsertOneNode(list,(ListNode*)&t1,CircleLinkList_GetLength(list));
    CircleLinkList_InsertOneNode(list,(ListNode*)&t2,CircleLinkList_GetLength(list));
    CircleLinkList_InsertOneNode(list,(ListNode*)&t3,CircleLinkList_GetLength(list));
    CircleLinkList_InsertOneNode(list,(ListNode*)&t4,CircleLinkList_GetLength(list));
    CircleLinkList_InsertOneNode(list,(ListNode*)&t5,CircleLinkList_GetLength(list));

    //打印2边,能输出2遍,没有越界,证明是循环链表
    for (kk = 0; kk < 2*CircleLinkList_GetLength(list); kk ++)
    {
         teacher = (Teacher* )CircleLinkList_GetOneNode(list,kk);
         printf("老师%d的年龄是%d",kk,teacher->age);
         printf("\n");
    }
    CircleLinkList_DeleteOneNodeByNodePointer(list,(ListNode*)&t5);

    printf("链表长度%d \n",CircleLinkList_GetLength(list));
    for (kk = 0; kk < 2*CircleLinkList_GetLength(list); kk ++)
    {
        teacher = (Teacher* )CircleLinkList_GetOneNode(list,kk);
        printf("老师%d的年龄是%d",kk,teacher->age);
        printf("\n");
    }
    printf("链表长度%d \n",CircleLinkList_GetLength(list));
    CircleLinkList_DeleteAllNode(list);
    printf("链表长度%d \n",CircleLinkList_GetLength(list));
    CircleLinkList_Destory(list);
    system("pause");
}
*/

可能会调用其它头文件或源文件,如果调用,请翻看我的其它博客,对其头文件或源文件的实现。
good luck !

相关TAG标签
上一篇:(考试)2017年大一下学期C++期末考试题目一
下一篇:JAVA文本模拟器
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站