zoukankan      html  css  js  c++  java
  • 严蔚敏数据结构线性表操作

    代码来源自网络:https://www.cnblogs.com/kangjianwei101/p/5223723.html,归原作者所有。此处做一个记录。

    test.c

    #include "SequenceList.h"
    //https://www.cnblogs.com/kangjianwei101/p/5223723.html
    
    
    Status compare(LPElemType elem, LPElemType other);    //元素比较函数,other > elem 返回 TRUE 否则FALSE
    void PrintElem(LPElemType elem);
    
    void main(void)
    {
        SequenceList list;
        int i,ERR_CODE;
        LPElemType elem;
    
        printf("函数初始化测试 InitList...\n");
        {
            printf("初始化线性表...\n");
            ERR_CODE = InitList(&list);
            if (ERR_CODE != OK) {
                printf("初始化失败\n");
            }
            else
            {
                printf("线性表容量:%d,现有元素个数:%d\n", list.capacity, list.count);
            }
            printf("\n\n");
        }
        PressEnter();
    
        printf("函数ListEmpty判空测试...\n");
        {
            if (ListEmpty(list))
            {
                printf("线性表为空!!!\n");
            }
            else
            {
                printf("非空线性表!\n");
            }
            printf("\n\n");
        }
        PressEnter();
        
        printf("函数ListInsert测试...\n");
        {
            for (i = 1; i < 6; i++)
            {
                printf("在线性表位序 %d 插入\"%d\"...\n", i, 2 * i);
                ListInsert(&list, i, 2 * i);
            }
            printf("\n\n");
        }
        PressEnter();
    
        printf("函数ListTraverse测试...\n");
        {
            printf("list中的元素为: list = ");
            ListTraverse(list,PrintElem);
            printf("\n\n");
        }
        PressEnter();
    
        printf("函数ListLength测试...\n");
        {
    
            i = ListLength(list);
            printf("list的长度为 %d\n", i);
            printf("\n\n");
        }
        PressEnter();
    
        printf("函数ListDelete测试...\n");
        {
    
            ListDelete(&list,6,&elem);
            printf("删除 list 中第 6 个元素 \"%d\"\n", elem);
            printf("list 中的元素为:list = ");
            ListTraverse(list, PrintElem);
            printf("\n\n");
        }
        PressEnter();
    
        printf("函数GetElem测试...\n");
        {
            GetElem(list,4 ,&elem);
            printf("list 中第 4个位置的元素为 \"%d\" \n", elem);
            printf("\n\n");
        }
        PressEnter();
    
        printf("函数LocateElem测试...\n");
        {
            i =  LocateElem(list, 7 , compare);
            printf("list 中第一个元素值大于\"7\"的元素的位置为 %d\n", i);
            printf("\n\n");
        }
        PressEnter();
    
        printf("函数PriorElem测试...\n");
        {
            PriorElem(list , 6 , &elem);
            printf("元素 \"6\"的前驱为\"%d\"\n", elem);
            printf("\n\n");
        }
        PressEnter();
    
        printf("函数NextElem测试...\n");
        {
            NextElem(list, 6, &elem);
            printf("元素 \"6\" 的后继为 \"%d\"\n", elem);
            printf("\n\n");        
        }
        PressEnter();
    
        printf("函数ClearList测试...\n");
        {
            printf("清空list之前:");
            if(ListEmpty(list))
            {
                printf("list为空!\n");
            }else
            {
                printf("list不为空!\n");
            }
            ClearList(&list);
            printf("清空 list 后:");
            if(ListEmpty(list))
            {
                printf("list为空!\n");
            }else{
                printf("list不为空!\n");
            }
            printf("\n\n");
        }
        PressEnter();
    
        printf("函数DestroyList测试...\n");
        {
            printf("销毁list前:\n");
            if(list.elem)
            {
                printf("list存在!\n");
                DestroyList(&list);
                printf("销毁list后:");
                if(list.elem)
                {
                    printf("list存在\n");
                }else
                {
                    printf("list不存在\n");
                }
            }else
            {
                printf("list不存在!\n");
            }
        }
        PressEnter();
    }
    
    
    Status compare(LPElemType elem, LPElemType other)
    {
        return other > elem ? TRUE : FALSE;
    }
    
    void PrintElem(LPElemType elem)
    {
        printf("%d ", elem);
    }

     SequenceList.h

    //Capacity 容器容量
    //Count 当前实际个数
    #ifndef SEQUENCELIST_H
    #define SEQUENCELIST_H
    
    #include "stdio.h"
    #include "stdlib.h"            //提供malloc,realloc,free,exit原型 zmalloc
    #include "Status.h"
    
    /* 宏定义 */
    #define LIST_INIT_SIZE    4    //顺序表存储空间的初始分配量
    #define LIST_INCREMENT    2    //顺序表存储空间的分配增量
    
    
    /* 顺序表类型定义 */
    #ifndef LELEMTYPE_SQ
    #define LELEMTYPE_SQ
    typedef int LPElemType;
    #endif
    
    typedef struct
    {
        LPElemType *elem;        //存储空间基址(指针首地址)
        int count;                //当前顺序表长度 count 
        int    capacity;            //当前分配的存储容量 capacity
    } SequenceList,tag_List;
    
    //初始化空序列表
    Status InitList(SequenceList *list);
    
    //清空顺序表
    void ClearList(SequenceList *list);
    
    //销毁顺序表
    void DestroyList(SequenceList *list);
    
    //判断顺序表是否为空
    int ListEmpty(SequenceList list);
    
    //返回顺序表的元素个数
    int ListLength(SequenceList list);
    
    //返回顺序表中第i个元素
    Status GetElem(SequenceList list, int i, LPElemType *elem);
    
    //返回中首个与e满足Compare关系的元素位序
    int LocateElem(SequenceList list, LPElemType elem, Status(Compare)(LPElemType, LPElemType));
    
    //返回cur_elem的前驱
    Status PriorElem(SequenceList list, LPElemType cur_elem, LPElemType *pre_elem);
    
    //返回cur_elem的后继
    
    Status NextElem(SequenceList list, LPElemType cur_elem, LPElemType *next_elem);
    
    //在顺序表的第i个位置插入e
    Status ListInsert(SequenceList *list, int i, LPElemType elem);
    
    //删除顺序表上第i个位置的元素,并用e返回
    Status ListDelete(SequenceList *list, int i, LPElemType *elem);
    
    //用visit函数访问顺序表
    Status ListTraverse(SequenceList list, void(Visit)(LPElemType));
    
    //union
    
    //Merge
    
    
    #endif

    SequenceList.c

    #ifndef SEQUENCELIST_C
    #define SEQUENCELIST_C
    
    #include "SequenceList.h"
    
    Status InitList(SequenceList *list)
    {
        list->elem = (LPElemType*)malloc(LIST_INIT_SIZE * sizeof(LPElemType));
        if (!list->elem)
        {
            exit(OVERFLOW);                //分配内存失败
        }
    
        list->count = 0;                    //初始化顺序表长度为0
        list->capacity = LIST_INIT_SIZE;    //顺序表初始内存分配量
        return OK;                        //初始化成功
    }
    
    void ClearList(SequenceList *list)
    {
        list->count = 0;
    }
    
    void DestroyList(SequenceList *list)
    {
        free(list->elem);
        list->elem =        NULL;
        list->count =        0;    //释放内存后置空指针
        list->capacity =    0;
    }
    
    Status ListEmpty(SequenceList list)
    {
        return list.count == 0 ? TRUE : FALSE;
    }
    
    int ListLength(SequenceList list)
    {
        return list.count;
    }
    
    Status GetElem(SequenceList list, int i, LPElemType *elem)
    {
        
        if (i < 1 || i > list.count/*如果检索的索引超过实际元素的索引长度*/)
        {
            return ERROR;            //i值不合法
        }
        else
        {
            *elem = list.elem[i - 1];
        }
        return OK;
    }
    
    int LocateElem(SequenceList list, LPElemType elem, Status(Compare)(LPElemType, LPElemType))
    {
        int i = 1;                //i的初值为第一个元素的位序
    
        while ( i < list.count && !Compare(elem, list.elem[i -1]) )
        {
            ++i;
        }
    
        if (i <= list.count)
        {
            return i;
        }
        else
        {
            return 0;
        }
    }
    
    Status PriorElem(SequenceList list, LPElemType cur_elem, LPElemType *pre_elem)
    {
        int i = 1;
        
        if (list.elem[0] != cur_elem)            //第一个节点无前驱
        {
            while ( i < list.count && list.elem[i] != cur_elem)
            {
                ++i;
            }
    
            if (i < list.count)
            {
                *pre_elem = list.elem[i - 1];
                return OK;
            }
        }
        return ERROR;
    }
    
    Status NextElem(SequenceList list, LPElemType cur_elem, LPElemType *next_elem)
    {
        int i = 0;
    
        while (i < list.count && list.elem[i] != cur_elem)
        {
            ++i;
        }
    
        if (i < list.count - 1)
        {
            *next_elem = list.elem[i + 1];
            return OK;
        }
    
        return ERROR;
    }
    
    Status ListInsert(SequenceList *list, int i, LPElemType elem)
    {
        LPElemType *newbase;
        LPElemType *p, *q;
    
        if (i < 1 || i > list->count + 1)
        {
            return ERROR;
        }
    
        if (list->count > list->capacity)        //存储空间以满,需要扩容
        {
            newbase = (LPElemType*)realloc(list->elem, (list->capacity + LIST_INCREMENT) * sizeof(LPElemType));
    
            if (!newbase)
            {
                exit(OVERFLOW);
            }
    
            list->elem = newbase;
            list->capacity += LIST_INCREMENT;
        }
    
        q = &(list->elem[i - 1]);    //q为插入位置
    
        for (p = &(list->elem[list->count - 1]); p >= q; --p)
        {
            *(p + 1) = *p;                //插入位置及之后的元素右移
        }
    
        *q = elem;
        list->count++;
        
        return OK;
    }
    
    
    Status ListDelete(SequenceList *list, int i, LPElemType *elem)
    {
        LPElemType *p = NULL, *q = NULL;
    
        if (i < 1 || i > list->count)
        {
            return ERROR;
        }
    
        *p = list->elem[i - 1];        //p为被删除元素的位置
        *elem = *p;
        q = (*list).elem + (*list).count - 1;    //表示元素的位置
    
        for (++p; p <= q; ++p)
        {
            *(p - 1) = *p;            //被删除元之后的元素左移
        }
    
        list->count--;                //表长减去1
    
        return OK;
    }
    
    Status ListTraverse(SequenceList list, void(Visit)(LPElemType))
    {
        int i;
    
        for (i = 0; i < list.count; i++)
        {
            Visit(list.elem[i]);
        }
        return OK;
    }
    
    #endif

    Status.h

    #ifndef STATUS_H
    #define STATUS_H
    
    /*状态码*/
    #define TRUE        1        //
    #define FALSE        0        //
    #define YES            1        //
    #define NO            0        //
    #define OK            1        //通过
    #define ERROR        0        //错误
    #define SUCCESS        1        //成功
    #define UNSUCCESS    0        //失败
    #define INFEASIBLE    -1        //不可行
    
    #ifndef _MATH_H_            //系统中已有此状态码定义,要避免冲突
    #define OVERFLOW    -2        //堆栈上溢
    #define UNDERFLOW    -3        //堆栈下溢
    #endif
    
    #ifndef NULL
    #define NULL ((void*)0)
    #endif
    
    /* 状态码失败类型 */
    typedef int Status;
    
    /* 宏函数 */
    //函数暂停一段时间
    #define Wait(x)\
    {\
        double _Loop_Num_;\
        for(_Loop_Num_=0.01; _Loop_Num_<=100000.0*x; _Loop_Num_+=0.01)\
            ;\
    }//设立一个空循环
    
    #define PressEnter()\
    {\
        fflush(stdin);\
        printf("Press Enter...");\
        getchar();\
        fflush(stdin);\
    }
    
    #endif

    vc++6.0编译运行效果

    本博客文章绝大多数为原创,少量为转载,代码经过测试验证,如果有疑问直接留言或者私信我。
    创作文章不容易,转载文章必须注明文章出处;如果这篇文章对您有帮助,点击右侧打赏,支持一下吧。
  • 相关阅读:
    CodeForces 7B
    CodeForces 4D
    离散化
    线段树入门
    洛谷 P3951 小凯的疑惑(赛瓦维斯特定理)
    Codeforces 1295D Same GCDs (欧拉函数)
    Codeforces 1295C Obtain The String (二分)
    Codeforces 1295B Infinite Prefixes
    Codeforces 1295A Display The Number(思维)
    Codeforces 1294F Three Paths on a Tree(树的直径,思维)
  • 原文地址:https://www.cnblogs.com/passedbylove/p/15611795.html
Copyright © 2011-2022 走看看