• 数据结构——线性表的顺序表示(5)


    题目来源于王道2018数据结构考研复习指导线性表的综合练习

    编译环境:VS2015

    题目:从顺序表中删除其值在给定s与t之间(包含s和t,要求s<t)的所有元素,如果s或t不合理或者顺序表为空,则显示出错信息并退出运行。

    注意:这道题目与上一道有所不同。上一道题目所要求的表是有序表,而这道题则没要求,因此要考虑乱序的情况。

    思路:举个例子,随意给一个顺序表的元素为{1,5,4,2,3,6},需要删除的数字区间是闭区间[2,5],计数变量j=0,记录在闭区间的数的个数

    具体流程:

    i=0,  L.data[i]=1,  不属于闭区间[2,5],          L.data[i-j]=L.data[0]=1;i++

    i=1,  L.data[i]=5,     属于闭区间[2,5],删除,i++,j=1

    i=2,  L.data[i]=4,     属于闭区间[2,5],删除,i++,j=2

    i=3,  L.data[i]=2,     属于闭区间[2,5],删除,i++,j=3

    i=4,  L.data[i]=6, 不属于闭区间[2,5],           L.data[1]=L.data[i]=6

    由此不难得出,当第k个元素不属于闭区间[s,t]时,需要将它保留,它在线性表中的位置取决于它前面的部分含有几个在闭区间的元素,将它在原线性表中下表减去它前面需要被删除的元素的个数,就得到它在新的线性表中的下标。

    具体实现:

    #include<stdio.h>
    #include<stdlib.h>
    #define initSize 50
    
    typedef int ElementType;
    typedef struct {
        ElementType *data;
        int length;
        int maxSize;
    }SeqList;
    
    //初始化线性表
    void InitList(SeqList &L) {
        L.data = (ElementType*)malloc(sizeof(ElementType)*initSize);
        L.length = 0;//置为空表
        L.maxSize = initSize;
    }
    
    //创建顺序表
    void CreateList(SeqList &L, int n) {
        L.length = n;
        for (int i = 0;i < n;i++) {
            scanf_s("%d", &(L.data[i]));
        }
    }
    
    bool DeleteST(SeqList &L, int s, int t) {
        int i, j= 0;//j为计数变量,用来记录在区间[s,t]的个数
        if ((s >= t) || (L.length == 0))
            return false;
        for (i = 0;i < L.length;i++) {
            if (L.data[i] >= s && L.data[i] <= t)
                j++;
            else
                L.data[i-j] = L.data[i];
        }
        L.length -= j;
        return true;
    }
    
    //显示
    void ShowList(SeqList L) {
        for (int i = 0;i < L.length;i++) {
            printf_s("%3d", L.data[i]);
        }
    }
    
    int main() {
        SeqList L;
        int length, s, t;
        InitList(L);
        printf_s("输入表的长度:");
        scanf_s("%d", &length);
        printf_s("
    输入初始值:");
        CreateList(L, length);
        printf_s("输入要删除的数字范围区间:");
        scanf_s("%d %d", &s, &t);
        DeleteST(L, s, t);
        printf_s("
    删除后的顺序表的元素如下:");
        ShowList(L);
        printf_s("
    ");
        system("pause");
        return 0;
    }

    测试结果:

      

  • 相关阅读:
    【luogu P1040 加分二叉树】 题解
    【luogu P4711 「化学」相对分子质量】 题解
    【luogu P2319 [HNOI2006]超级英雄】 题解
    【luogu P1640 [SCOI2010]连续攻击游戏】 题解
    【luogu P3369 普通平衡树(Treap/SBT)】 模板 Splay
    【luogu P2234 [HNOI2002]营业额统计】 题解
    【luogu P1494 [国家集训队]小Z的袜子】 题解
    【luogu P3901 数列找不同】 题解
    【luogu P3807 卢卡斯定理】 模板
    JAVA IO 体系
  • 原文地址:https://www.cnblogs.com/abyss1114/p/7284228.html
Copyright © 2020-2023  润新知