zoukankan      html  css  js  c++  java
  • 数据结构——线性表的顺序表示(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;
    }

    测试结果:

      

  • 相关阅读:
    golang删除数组某个元素
    golang用通道实现信号量,控制并发个数
    什么是ScaleIO中的forwards rebuild和backwards rebuild?
    SQL Server中的database checkpoint
    如何将thick provision lazy zeroed的VMDK文件转换为thick provision eager zeroed?
    LoadTestAgentResultsLateException in VS2010
    SQL Server Instance无法启动了, 因为TempDB所在的分区没有了, 怎么办?
    VMware vCenter中, 如何辩认虚机上Raw Device Mapping过了的一块物理磁盘?
    SQL Server AlwaysOn Setup Step-By-Step Guide
    TPC-E在populate测试Database时需要注意的一些事项
  • 原文地址:https://www.cnblogs.com/abyss1114/p/7284228.html
Copyright © 2011-2022 走看看