zoukankan      html  css  js  c++  java
  • 数据-第13课-链表回顾

    第13课-链表回顾

    1. CircleList2.0

    (1)CircleList.h

    #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

    (2)CircleList.c

    #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;

            }

           

            sList->length++;

           

            if( current == (CircleListNode*)sList )

            {

                CircleListNode* last = CircleList_Get(sList, sList->length - 1);

               

                last->next = current->next;

            }

        }

       

        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) && (sList->length > 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) && (sList->length > 0) )

        {

            CircleListNode* current = (CircleListNode*)sList;

            CircleListNode* last = NULL;

           

            for(i=0; i<pos; i++)

            {

                current = current->next;

            }

           

            if( current == (CircleListNode*)sList )

            {

                last = (CircleListNode*)CircleList_Get(sList, sList->length - 1);

            }

           

            ret = current->next;

            current->next = ret->next;

           

            sList->length--;

           

            if( last != NULL )

            {

                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;

    }

    (3)mian.c

    #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[])

    {

        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;

       

        int i = 0;

       

        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, 0);

        CircleList_Insert(list, (CircleListNode*)&v2, 0);

        CircleList_Insert(list, (CircleListNode*)&v3, 0);

        CircleList_Insert(list, (CircleListNode*)&v4, 0);

       

        for(i=0; i<2*CircleList_Length(list); i++)

        {

            struct Value* pv = (struct Value*)CircleList_Get(list, i);

           

            printf("%d ", pv->v);

        }

       

        while( CircleList_Length(list) > 0 )

        {

            CircleList_Delete(list, 0);

        }

       

        printf(" ");

       

        CircleList_Destroy(list);

       

             return 0;

    }

    2. DLinkList2.0

    (1)DLinkList.h

    #ifndef _DLINKLIST_H_

    #define _DLINKLIST_H_

    typedef void DLinkList;

    typedef struct _tag_DLinkListNode DLinkListNode;

    struct _tag_DLinkListNode

    {

        DLinkListNode* next;

        DLinkListNode* pre;

    };

    DLinkList* DLinkList_Create();

    void DLinkList_Destroy(DLinkList* list);

    void DLinkList_Clear(DLinkList* list);

    int DLinkList_Length(DLinkList* list);

    int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos);

    DLinkListNode* DLinkList_Get(DLinkList* list, int pos);

    DLinkListNode* DLinkList_Delete(DLinkList* list, int pos);

    DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node);

    DLinkListNode* DLinkList_Reset(DLinkList* list);

    DLinkListNode* DLinkList_Current(DLinkList* list);

    DLinkListNode* DLinkList_Next(DLinkList* list);

    DLinkListNode* DLinkList_Pre(DLinkList* list);

    #endif

    (2)DLinkList.c

    #include <stdio.h>

    #include <malloc.h>

    #include "DLinkList.h"

    typedef struct _tag_DLinkList

    {

        DLinkListNode header;

        DLinkListNode* slider;

        int length;

    } TDLinkList;

    DLinkList* DLinkList_Create() // O(1)

    {

        TDLinkList* ret = (TDLinkList*)malloc(sizeof(TDLinkList));

       

        if( ret != NULL )

        {

            ret->length = 0;

            ret->header.next = NULL;

            ret->header.pre = NULL;

            ret->slider = NULL;

        }

       

        return ret;

    }

    void DLinkList_Destroy(DLinkList* list) // O(1)

    {

        free(list);

    }

    void DLinkList_Clear(DLinkList* list) // O(1)

    {

        TDLinkList* sList = (TDLinkList*)list;

       

        if( sList != NULL )

        {

            sList->length = 0;

            sList->header.next = NULL;

            sList->header.pre = NULL;

            sList->slider = NULL;

        }

    }

    int DLinkList_Length(DLinkList* list) // O(1)

    {

        TDLinkList* sList = (TDLinkList*)list;

        int ret = -1;

       

        if( sList != NULL )

        {

            ret = sList->length;

        }

       

        return ret;

    }

    int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos) // O(n)

    {

        TDLinkList* sList = (TDLinkList*)list;

        int ret = (sList != NULL) && (pos >= 0) && (node != NULL);

        int i = 0;

       

        if( ret )

        {

            DLinkListNode* current = (DLinkListNode*)sList;

            DLinkListNode* next = NULL;

           

            for(i=0; (i<pos) && (current->next != NULL); i++)

            {

                current = current->next;

            }

           

            next = current->next;

           

            current->next = node;

            node->next = next;

           

            if( next != NULL )

            {

                next->pre = node;

            }

           

            node->pre = current;

           

            if( sList->length == 0 )

            {

                sList->slider = node;

            }

           

            if( current == (DLinkListNode*)sList )

            {

                node->pre = NULL;

            }

           

            sList->length++;

        }

       

        return ret;

    }

    DLinkListNode* DLinkList_Get(DLinkList* list, int pos) // O(n)

    {

        TDLinkList* sList = (TDLinkList*)list;

        DLinkListNode* ret = NULL;

        int i = 0;

       

        if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )

        {

            DLinkListNode* current = (DLinkListNode*)sList;

           

            for(i=0; i<pos; i++)

            {

                current = current->next;

            }

           

            ret = current->next;

        }

       

        return ret;

    }

    DLinkListNode* DLinkList_Delete(DLinkList* list, int pos) // O(n)

    {

        TDLinkList* sList = (TDLinkList*)list;

        DLinkListNode* ret = NULL;

        int i = 0;

       

        if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )

        {

            DLinkListNode* current = (DLinkListNode*)sList;

            DLinkListNode* next = NULL;

           

            for(i=0; i<pos; i++)

            {

                current = current->next;

            }

           

            ret = current->next;

            next = ret->next;

           

            current->next = next;

           

            if( next != NULL )

            {

                next->pre = current;

               

                if( current == (DLinkListNode*)sList )

                {

                    next->pre = NULL;

                }

            }

           

            if( sList->slider == ret )

            {

                sList->slider = next;

            }

           

            sList->length--;

        }

       

        return ret;

    }

    DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node)

    {

        TDLinkList* sList = (TDLinkList*)list;

        DLinkListNode* ret = NULL;

        int i = 0;

       

        if( sList != NULL )

        {

            DLinkListNode* current = (DLinkListNode*)sList;

           

            for(i=0; i<sList->length; i++)

            {

                if( current->next == node )

                {

                    ret = current->next;

                    break;

                }

               

                current = current->next;

            }

           

            if( ret != NULL )

            {

                DLinkList_Delete(sList, i);

            }

        }

       

        return ret;

    }

    DLinkListNode* DLinkList_Reset(DLinkList* list)

    {

        TDLinkList* sList = (TDLinkList*)list;

        DLinkListNode* ret = NULL;

       

        if( sList != NULL )

        {

            sList->slider = sList->header.next;

            ret = sList->slider;

        }

       

        return ret;

    }

    DLinkListNode* DLinkList_Current(DLinkList* list)

    {

        TDLinkList* sList = (TDLinkList*)list;

        DLinkListNode* ret = NULL;

       

        if( sList != NULL )

        {

            ret = sList->slider;

        }

       

        return ret;

    }

    DLinkListNode* DLinkList_Next(DLinkList* list)

    {

        TDLinkList* sList = (TDLinkList*)list;

        DLinkListNode* ret = NULL;

       

        if( (sList != NULL) && (sList->slider != NULL) )

        {

            ret = sList->slider;

            sList->slider = ret->next;

        }

       

        return ret;

    }

    DLinkListNode* DLinkList_Pre(DLinkList* list)

    {

        TDLinkList* sList = (TDLinkList*)list;

        DLinkListNode* ret = NULL;

       

        if( (sList != NULL) && (sList->slider != NULL) )

        {

            ret = sList->slider;

            sList->slider = ret->pre;

        }

       

        return ret;

    }

    (3)main.c

    #include <stdio.h>

    #include <stdlib.h>

    #include "DLinkList.h"

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

    struct Value

    {

        DLinkListNode header;

        int v;

    };

    int main(int argc, char *argv[])

    {

        DLinkList* list = DLinkList_Create();

       

        struct Value v1;

        struct Value v2;

        struct Value v3;

        struct Value v4;

        struct Value v5;

       

        v1.v = 1;

        v2.v = 2;

        v3.v = 3;

        v4.v = 4;

        v5.v = 5;

       

        DLinkList_Insert(list, (DLinkListNode*)&v1, 0);

        DLinkList_Insert(list, (DLinkListNode*)&v2, 0);

        DLinkList_Insert(list, (DLinkListNode*)&v3, 0);

        DLinkList_Insert(list, (DLinkListNode*)&v4, 0);

        DLinkList_Insert(list, (DLinkListNode*)&v5, 0);

       

        DLinkList_Reset(list);

       

        //DLinkList_Pre(list);

       

        printf("%x ", DLinkList_Current(list));

       

        DLinkList_Destroy(list);

       

             return 0;

    }

    3. SeqList2.0

    (1)SeqList.h

    #ifndef _SEQLIST_H_

    #define _SEQLIST_H_

    typedef void SeqList;

    typedef void SeqListNode;

    SeqList* SeqList_Create(int capacity);

    void SeqList_Destroy(SeqList* list);

    void SeqList_Clear(SeqList* list);

    int SeqList_Length(SeqList* list);

    int SeqList_Capacity(SeqList* list);

    int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);

    SeqListNode* SeqList_Get(SeqList* list, int pos);

    SeqListNode* SeqList_Delete(SeqList* list, int pos);

    #endif

    (2)SeqList.c

    #include <stdio.h>

    #include <malloc.h>

    #include "SeqList.h"

    typedef unsigned int TSeqListNode;

    typedef struct _tag_SeqList

    {

        int capacity;

        int length;

        TSeqListNode* node;

    } TSeqList;

    SeqList* SeqList_Create(int capacity) // O(1)

    {

        TSeqList* ret = NULL;

       

        if( capacity >= 0 )

        {

            ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity);

        }

       

        if( ret != NULL )

        {

            ret->capacity = capacity;

            ret->length = 0;

            ret->node = (TSeqListNode*)(ret + 1);

        }

       

        return ret;

    }

    void SeqList_Destroy(SeqList* list) // O(1)

    {

        free(list);

    }

    void SeqList_Clear(SeqList* list) // O(1)

    {

        TSeqList* sList = (TSeqList*)list;

       

        if( sList != NULL )

        {

            sList->length = 0;

        }

    }

    int SeqList_Length(SeqList* list) // O(1)

    {

        TSeqList* sList = (TSeqList*)list;

        int ret = -1;

       

        if( sList != NULL )

        {

            ret = sList->length;

        }

       

        return ret;

    }

    int SeqList_Capacity(SeqList* list) // O(1)

    {

        TSeqList* sList = (TSeqList*)list;

        int ret = -1;

       

        if( sList != NULL )

        {

            ret = sList->capacity;

        }

       

        return ret;

    }

    int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) // O(n)

    {

        TSeqList* sList = (TSeqList*)list;

        int ret = (sList != NULL);

        int i = 0;

       

        ret = ret && (sList->length + 1 <= sList->capacity);

        ret = ret && (0 <= pos);

       

        if( ret )

        {

            if( pos >= sList->length )

            {

                pos = sList->length;

            }

           

            for(i=sList->length; i>pos; i--)

            {

                sList->node[i] = sList->node[i-1];

            }

           

            sList->node[i] = (TSeqListNode)node;

           

            sList->length++;

        }

       

        return ret;

    }

    SeqListNode* SeqList_Get(SeqList* list, int pos) // O(1)

    {

        TSeqList* sList = (TSeqList*)list;

        SeqListNode* ret = NULL;

       

        if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )

        {

            ret = (SeqListNode*)(sList->node[pos]);

        }

       

        return ret;

    }

    SeqListNode* SeqList_Delete(SeqList* list, int pos) // O(n)

    {

        TSeqList* sList = (TSeqList*)list;

        SeqListNode* ret = SeqList_Get(list, pos);

        int i = 0;

       

        if( ret != NULL )

        {

            for(i=pos+1; i<sList->length; i++)

            {

                sList->node[i-1] = sList->node[i];

            }

           

            sList->length--;

        }

       

        return ret;

    }

    (3)main.c

    #include <stdio.h>

    #include <stdlib.h>

    #include "SeqList.h"

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

    int main(int argc, char *argv[])

    {

        SeqList* list = SeqList_Create(10);

       

        int i = 0;

        int j = 1;

        int k = 2;

        int x = 3;

        int y = 4;

        int z = 5;

       

        SeqList_Insert(list, &i, 0);

        SeqList_Insert(list, &j, 0);

        SeqList_Insert(list, &k, 0);

        SeqList_Insert(list, &x, 0);

        SeqList_Insert(list, &y, 0);

        SeqList_Insert(list, &z, 0);

       

        SeqList_Delete(list, 5);

       

        printf("%x ", SeqList_Get(list, 5));

       

        SeqList_Destroy(list);

       

        return 0;

    }

  • 相关阅读:
    PAT 1017 Queueing at Bank
    一句有意思的代码
    PAT 1031 Hello World for U
    PAT 1024 Palindromic Number
    PAT 1032 Sharing
    各显神通
    ZJU PAT 1023
    静夜,乱思
    PAT 1024 Palindromic Number
    虚函数表
  • 原文地址:https://www.cnblogs.com/free-1122/p/11322759.html
Copyright © 2011-2022 走看看