• 循环链表


    1.#include <stdio.h>
    #include <malloc.h>
    #include "CircleList.h"

    typedef struct _tag_CircleList
    {
        CircleListNode header;
        CircleListNode* slider;
        int length;
    } TCircleList;

    CircleList* CircleList_Create() // O(1)
    {
        TCircleList* ret = (TCircleList*)malloc(sizeof(TCircleList));
        
        if( ret != NULL )
        {
            ret->length = 0;
            ret->header.next = NULL;
            ret->slider = NULL;
        }
        
        return ret;
    }

    void CircleList_Destroy(CircleList* list) // O(1)
    {
        free(list);
    }

    void CircleList_Clear(CircleList* list) // O(1)
    {
        TCircleList* sList = (TCircleList*)list;
        
        if( sList != NULL )
        {
            sList->length = 0;
            sList->header.next = NULL;
            sList->slider = NULL;
        }
    }

    int CircleList_Length(CircleList* list) // O(1)
    {
        TCircleList* sList = (TCircleList*)list;
        int ret = -1;
        
        if( sList != NULL )
        {
            ret = sList->length;
        }
        
        return ret;
    }

    int CircleList_Insert(CircleList* list, CircleListNode* node, int pos) // O(n)
    {
        TCircleList* sList = (TCircleList*)list;
        int ret = (sList != NULL) && (pos >= 0) && (node != NULL);
        int i = 0;
        
        if( ret )
        {
            CircleListNode* current = (CircleListNode*)sList;
            
            for(i=0; (i<pos) && (current->next != NULL); i++)
            {
                current = current->next;
            }
            
            node->next = current->next;
            current->next = node;
            
            if( sList->length == 0 )
            {
                sList->slider = node;
                node->next = node;
            }
            
            sList->length++;
        }
        
        return ret;
    }

    CircleListNode* CircleList_Get(CircleList* list, int pos) // O(n)
    {
        TCircleList* sList = (TCircleList*)list;
        CircleListNode* ret = NULL;
        int i = 0;
        
        if( (sList != NULL) && (pos >= 0) )
        {
            CircleListNode* current = (CircleListNode*)sList;
            
            for(i=0; i<pos; i++)
            {
                current = current->next;
            }
            
            ret = current->next;
        }
        
        return ret;
    }

    CircleListNode* CircleList_Delete(CircleList* list, int pos) // O(n)
    {
        TCircleList* sList = (TCircleList*)list;
        CircleListNode* ret = NULL;
        int i = 0;
        
        if( (sList != NULL) && (pos >= 0) )
        {
            CircleListNode* current = (CircleListNode*)sList;
            CircleListNode* first = sList->header.next;//获取第一个元素
            //获取最后一个元素
            CircleListNode* last = (CircleListNode*)CircleList_Get(sList, sList->length - 1);
            
            for(i=0; i<pos; i++)
            {
                current = current->next;
            }
            //删除code
            ret = current->next;
            current->next = ret->next;
            
            sList->length--;
            
            if( first == ret )
            {
                sList->header.next = ret->next;
                last->next = ret->next;
            }
            
            if( sList->slider == ret )
            {
                sList->slider = ret->next;
            }
            
            if( sList->length == 0 )
            {
                sList->header.next = NULL;
                sList->slider = NULL;
            }
        }
        
        return ret;
    }
    //以下是游标的操作
    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;
            
            for(i=0; i<sList->length; i++)
            {
            //查找游标的逻辑位置
                if( current->next == node )
                {
                    ret = current->next;
                    break;
                }
                
                current = current->next;
            }
            
            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->header.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;
    }


    2.#ifndef _CIRCLELIST_H_
    #define _CIRCLELIST_H_

    typedef void CircleList;
    typedef struct _tag_CircleListNode CircleListNode;
    struct _tag_CircleListNode
    {
        CircleListNode* next;
    };

    CircleList* CircleList_Create();

    void CircleList_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);

    CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);

    CircleListNode* CircleList_Reset(CircleList* list);

    CircleListNode* CircleList_Current(CircleList* list);

    CircleListNode* CircleList_Next(CircleList* list);

    #endif

    3.#include <stdio.h>
    #include <stdlib.h>
    #include "CircleList.h"

    /* run this program using the console pauser or add your own getch, system("pause") or input loop */

    struct Value
    {
        CircleListNode header;
        int v;
    };

    int main(int argc, char *argv[])
    {
        int i = 0;
        //create circular list
        CircleList* list = CircleList_Create();
        
        struct Value v1;
        struct Value v2;
        struct Value v3;
        struct Value v4;
        struct Value v5;
        struct Value v6;
        struct Value v7;
        struct Value v8;
        
        v1.v = 1;
        v2.v = 2;
        v3.v = 3;
        v4.v = 4;
        v5.v = 5;
        v6.v = 6;
        v7.v = 7;
        v8.v = 8;
        //测试数据
        CircleList_Insert(list, (CircleListNode*)&v1, CircleList_Length(list));
        CircleList_Insert(list, (CircleListNode*)&v2, CircleList_Length(list));
        CircleList_Insert(list, (CircleListNode*)&v3, CircleList_Length(list));
        CircleList_Insert(list, (CircleListNode*)&v4, CircleList_Length(list));
        
        CircleList_Insert(list, (CircleListNode*)&v5, 5);
        CircleList_Delete(list, 0);
        
        for(i=0; i<2*CircleList_Length(list); i++)
        {
            struct Value* pv = (struct Value*)CircleList_Get(list, i);
            
            printf("%d ", pv->v);
        }
        
        printf(" ");
        
        while( CircleList_Length(list) > 0 )
        {
            struct Value* pv = (struct Value*)CircleList_Delete(list, 0);
            
            printf("%d ", pv->v);
        }
        
        printf(" ");
        //实现循环问题--读数
        CircleList_Insert(list, (CircleListNode*)&v1, CircleList_Length(list));
        CircleList_Insert(list, (CircleListNode*)&v2, CircleList_Length(list));
        CircleList_Insert(list, (CircleListNode*)&v3, CircleList_Length(list));
        CircleList_Insert(list, (CircleListNode*)&v4, CircleList_Length(list));
        CircleList_Insert(list, (CircleListNode*)&v5, CircleList_Length(list));
        CircleList_Insert(list, (CircleListNode*)&v6, CircleList_Length(list));
        CircleList_Insert(list, (CircleListNode*)&v7, CircleList_Length(list));
        CircleList_Insert(list, (CircleListNode*)&v8, CircleList_Length(list));
        //直接移动--游标
        for(i=0; i<CircleList_Length(list); i++)
        {
            struct Value* pv = (struct Value*)CircleList_Next(list);
            
            printf("%d ", pv->v);
        }
        
        printf(" ");
        
        CircleList_Reset(list);
        
        while( CircleList_Length(list) > 0 )
        {
            struct Value* pv = NULL;
            
            for(i=1; i<3; i++)
            {
                CircleList_Next(list);
            }
            
            pv = (struct Value*)CircleList_Current(list);
            
            printf("%d ", pv->v);
            
            CircleList_DeleteNode(list, (CircleListNode*)pv);
        }
        
        CircleList_Destroy(list);
        
        return 0;
    }

  • 相关阅读:
    用wamp配置的环境,想用CMD连接mysql怎么连
    Mysql删除表
    MySQL创建表
    Leetcode 130. Surrounded Regions
    Leetcode 111. Minimum Depth of Binary Tree
    Leetcode 110. Balanced Binary Tree
    Leetcode 98. Validate Binary Search Tree
    Leetcode 99. Recover Binary Search Tree
    Leetcode 108. Convert Sorted Array to Binary Search Tree
    Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal
  • 原文地址:https://www.cnblogs.com/wxb20/p/6138902.html
Copyright © 2020-2023  润新知