数据结构——线性表的顺序表示(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;
}

测试结果:

  

原文地址:https://www.cnblogs.com/abyss1114/p/7284228.html