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

来源:互联网 发布:淘宝举证是什么意思 编辑:程序博客网 时间:2024/06/07 06:18

circlelinklist.h 文件

#ifndef _CIRCLE_LINK_LIST_H_#define _CIRCLE_LINK_LIST_H_#include <stdio.h>#include <stdlib.h>#include <string.h>//循环链表//链表操作精髓在于操作关系节点,引入辅助指针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 <stdio.h>#include <stdlib.h>#include <string.h>#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 !

原创粉丝点击