• 1.1线性表的顺序表示


    数据结构(C语言版),严蔚敏,吴伟明著。

    线性表的顺序表示,C语言实现:

    文件目录结构:

    Define.h源码:

    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    #define INFEASIBLE -1
    #define OVERFLOW -2
    #define Status int
    #define LIST_INIT_SIZE 12
    #define LISTINCREMENT 10

    SqList.h源码:

    #include "Define.h"
    #define ElemType int
    typedef struct{
        ElemType* elem;
        int length;
        int listsize;
    }SqList;
    
    void SqListt_Menu();
    Status InitList_SqList(SqList * L); //初始化线性表
    Status ListInsert_Sq(SqList * L, int i, ElemType e);//将e插入L中,插入位置为i
    Status compare(ElemType p, ElemType e);//比较函数
    int LocateElem_Sq(SqList *L, ElemType *e, Status(*compare)(ElemType,ElemType));//获取指定元素下标
    Status ListDelete_Sq(SqList* L, int i, ElemType *e);//删除L中位置为i的元素
    void MergeList_Sq(SqList La, SqList Lb, SqList *Lc);//合并La,Lb放入Lc中
    Status DestroyList(SqList *L);//销毁线性表

    SqList.c源码:

    #include "SqList.h"
    #include "stdio.h"
    #include "stdlib.h"
    
    
    /*初始化顺序表
     * 初始长度为12
     */
    Status InitList_SqList(SqList * L){ //初始化线性表
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); //分配空间,初始化空间为12
        if(!L->elem) //判断是否分配成功
            exit(OVERFLOW);
        L->length = 0;  //空表长度为0
        L->listsize = LIST_INIT_SIZE; //初始化存储容量
        return OK;
    }
    
    /*在线性表第i个位置插入元素e
     *
     */
    Status ListInsert_Sq(SqList * L, int i, ElemType e){
        int p = i - 1; //p为元素移动起始位
        int q = (L->length) - 1;//q为元素移动终止位
        if(i < 1 || i > L->length + 1){//判断插入位是否合法。
            printf("插入位不合法
    ");
            return ERROR;
        }
        if(L->length >= L->listsize){//当前存储空间已满,增加分配
            ElemType * newbase;
            newbase = (ElemType *)realloc(L->elem,
                (L->listsize + LISTINCREMENT) * sizeof(ElemType));//分配增量为10(LISTINCREMENT)
            if(!newbase){
                printf("分配失败
    ");
                exit(OVERFLOW);
            }
            L->elem = newbase;//增加分配后的新地址
            L->listsize += LISTINCREMENT;//更新存储容量
        }
        for(; q >= p; --q)//将插入位置及以后的元素右移
            L->elem[q + 1] = L->elem[q];
        L->elem[p] = e;//插入e
        ++L->length;//表长加1
        return OK;
    }
    
    /*比较函数
     *
     */
    Status compare(ElemType p, ElemType e){
        if(p == e)
            return TRUE;
        else
            return FALSE;
    }
    
    /*在线性表L中查找第一个满足computer()的元素的位置
     *如果找到,则返回对应位置,反之返回0。
     */
    int LocateElem_Sq(SqList *L, ElemType *e, Status(*compare)(ElemType,ElemType)){
        int i = 1;
        while(i <= L->length && !(*compare)(L->elem[i - 1], *e)) ++i;//遍历L中的元素,并判断是否符合条件
        if(i <= L->length) //判断是否超出范围
            return i;
        else
            return 0;
    }
    
    /*在线性表L中删除第i个元素,并用e返回其值。
     *
     */
    
    Status ListDelete_Sq(SqList* L, int i, ElemType *e){
        int p = i - 1, q = L->length - 1;//i为插入位置从1开始,p为顺序表实际插入位置0开始
        if(i < 1 || i > L->length)       //q为顺序表中最后一个元素的下标。
            return ERROR;
        *e = L->elem[i-1];//将需要删除的元素用e返回
        for(; p < q; p++)//将第i个元素之后的元素右移一位。
            L->elem[p] = L->elem[p + 1];
        --L->length;//表长减1
        return OK;
    }
    
    
    /*已知La,Lb按递增排列
     *合并La,Lb放入Lc中,Lc也按递增排列。
     */
    
    void MergeList_Sq(SqList La, SqList Lb, SqList *Lc){
        ElemType *pa = La.elem, *pb = Lb.elem, *pc;//pa,pb存放顺序表起始地址,用于遍历元素
        ElemType *pa_last, *pb_last;//用于存放顺序表最后一个元素地址
        pa = La.elem;
        pb = Lb.elem;
        Lc->listsize = Lc->length = La.length + Lb.length;//将Lc的存储容量设置为La和Lb当前长度之和
        pc = Lc->elem = (ElemType *)malloc(Lc->length * sizeof(ElemType));//为Lc->elem分配空间
        if(!Lc->elem)//存储分配失败则退出
            exit(OVERFLOW);
        pa_last = La.elem + La.length - 1;//pa_last为顺序表中最后一个元素的地址
        pb_last = Lb.elem + Lb.length - 1;
        while(pa <= pa_last && pb <= pb_last){
            if(*pa <= * pb)       //将La,Lb中的元素按递增排列插入Lc中
                *pc++ = *pa++;
            else
                *pc++ = *pb++;
        }
        while(pa <= pa_last)//将剩余未插入的元素插入Lc中
            *pc++ = *pa++;
        while(pb <= pb_last)
            *pc++ = *pb++;
    }
    
    Status DestroyList(SqList *L){
        if(L){
            free(L->elem);
            return OK;
        }else
            return ERROR;
    }

    Main.c源码

    #include "stdio.h"
    #include "stdlib.h"
    #include "SqList.h"
    
    #define MenuFun 6
    
    void SqList_Menu();
    
    int main(){
        SqList_Menu();
        return 0;
    }
    
    
    void SqList_Menu(){
        int temp = -1;//第二组数据赋值使用
        SqList L, La, Lb, Lc;
        int input;
        int i;
        ElemType e;
        printf("--------------数据结构--------------
    ");
        printf("1.初始化线性表,初始长度为12.
    ");
        printf("2.在线性表第i个位置插入元素e
    ");
        printf("3.删除第i个元素
    ");
        printf("4.查找第一个满足computer()的元素的位置
    ");
        printf("5.合并La、Lb,放入Lc中
    ");
        printf("6.销毁顺序表");
        printf("------------------------------------
    
    ");
        printf("请输入序号选择功能
    ");
        scanf("%d", &input);
        for(;!CheckInput(input,CheckInit(input));){
            scanf("%d", &input);
        }
        for(;;){
            switch(input){
                case 1:if(InitList_SqList(&L) && InitList_SqList(&La) && InitList_SqList(&Lb)){
                            /*/第一组初值
                            for(i = 1; i <= 12; i++){
                                ListInsert_Sq(&L,i,i);
                                ListInsert_Sq(&La,i,i);
                                ListInsert_Sq(&Lb,i,i);
                            }
                            //*/
                            
                            //第二组初值
                            for(i = 1; i <= 12; i++)
                                ListInsert_Sq(&L, i, (i*i+1)/2);
                            for(i = 1; i <= 12; i++)
                                ListInsert_Sq(&La,i,temp+=2);
                            temp = 0;
                            for(i = 1; i <= 12; i++)
                                ListInsert_Sq(&Lb,i,temp+=2);
                             //*/
                            printf("初始化成功
    
    ");
                            printf("分配初始值...
    ");
                            printf("L :");
                            for(i = 0; i < L.length; i++)
                                printf("%d ", L.elem[i]);
                            putchar('
    ');
                            printf("La:");
                            for(i = 0; i < La.length; i++)
                                printf("%d ", La.elem[i]);
                            putchar('
    ');
                            printf("Lb:");
                            for(i = 0; i < Lb.length; i++)
                                printf("%d ", Lb.elem[i]);
                            putchar('
    ');
                            putchar('
    ');
                       }else
                           printf("初始化失败
    ");
                       break;
                case 2:printf("插入前的线性表:");
                    for(i = 0; i < L.length; i++)
                        printf("%d ",L.elem[i]);
                    putchar('
    ');
                    printf("请输入插入位置(i)及插入元素(e)");
                    scanf("%d %d", &i, &e);
                    if(ListInsert_Sq(&L, i, e) == OK)
                        printf("插入成功
    ",e);
                    else{
                        printf("插入失败
    ");
                        break;
                    }
                    printf("插入后的线性表:");
                    for(i = 0; i < L.length; i++)
                        printf("%d ",L.elem[i]);
                    putchar('
    ');
                    putchar('
    ');
                    break;
                case 3:printf("删除前的线性表:");
                    for(i = 0; i < L.length; i++)
                        printf("%d ",L.elem[i]);
                    putchar('
    ');
                    printf("请输入需要删除元素的位置(i)");
                    scanf("%d", &i);
                    if(ListDelete_Sq(&L, i, &e) == OK)
                        printf("删除成功
    ",e);
                    else{
                        printf("删除失败
    ");
                        break;
                    }
                    printf("删除元素:%d",e);
                    putchar('
    ');
                    printf("删除后的线性表:");
                    for(i = 0; i < L.length; i++)
                        printf("%d ",L.elem[i]);
                    putchar('
    ');
                    putchar('
    ');
                    break;
                case 4:printf("当前线性表:");
                    for(i = 0; i < L.length; i++)
                        printf("%d ",L.elem[i]);
                    putchar('
    ');
                    printf("请输入需要查找的元素(e)");
                    scanf("%d", &e);
                    if(LocateElem_Sq(&L, &e, &compare) != 0)
                        printf("查找成功
    ",e);
                    else{
                        printf("查找失败
    ");
                        break;
                    }
                    printf("查找元素的位置:%d
    ",LocateElem_Sq(&L, &e, &compare));
                    putchar('
    ');
                    break;
                case 5:printf("La:");
                    for(i = 0; i < La.length; i++)
                        printf("%d ",La.elem[i]);
                    putchar('
    ');
                    printf("Lb:");
                    for(i = 0; i < Lb.length; i++)
                        printf("%d ",Lb.elem[i]);
                    putchar('
    ');
                    MergeList_Sq(La, Lb, &Lc);
                    printf("Lc:");
                    for(i = 0; i < Lc.length; i++)
                        printf("%d ",Lc.elem[i]);
                    putchar('
    ');
                    break;
                case 6:printf("销毁顺序表...
    ");
                    if(DestroyList(&L) == OK && DestroyList(&La) == OK && DestroyList(&Lb) == OK){
                        printf("销毁成功
    ");
                        break;
                    }
                    else{
                        printf("销毁失败
    ");
                        break;
                    }
                default:printf("输入不合法请重新输入");
            }
            printf("请输入序号选择功能,退出请输入0
    ");
            fflush(stdin);//清空键盘缓冲区
            scanf("%d",&input);
            if(input == 0)
                break;
        }
    }
    
    Status CheckInit(int input){
        if(input == 1)
            return TRUE;
        else
            return FALSE;
    }
    
    Status CheckInput(int input,int flag){
        if(input <1 || input > MenuFun){
            printf("输入不合法,请重新输入
    ");
            return ERROR;
        }
        if(!flag){
            printf("未初始化
    ");
            return FALSE;
        }
        return TRUE;
    }

    测试过程:

  • 相关阅读:
    Ubuntu18.04, WPS表格生成中文大写数字的script
    Java实现的简单神经网络(基于Sigmoid激活函数)
    Naive Bayes Classifier 朴素贝叶斯分类器
    动态规划处理diff算法 Myers Diff (正向)
    动态规划处理01背包问题
    文本diff算法Patience Diff
    API返回错误信息的最佳实践
    CAP理论中, P(partition tolerance, 分区容错性)的合理解释
    mysql: SELECT ... FOR UPDATE 对SELECT语句的阻塞实验
    Probability&Statistics 概率论与数理统计(1)
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/9902451.html
Copyright © 2020-2023  润新知