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

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

编译环境:VS2015

题目:从有序顺序表中删除其值在给定值s和t之间(要求s<t)的所有元素,如果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 < L.length;i++) {
            scanf_s("%d", &(L.data[i]));
    }
}

//删除定值s和t之间(要求s<t)的所有元素
bool DeleteS_T(SeqList &L, int s, int t) {
    int m=0, n=0;//m记录小于s的元素的个数,n记录大于t的元素的个数。
    //判断合理性
    if ((s >= t) || (L.length == 0))
        return -1;
    //如果最后得到的顺序表需要包括边界值s、t,if条件注意加等号
    for (int i = 0;i < L.length;i++) {
        if (L.data[i] < s) {
            L.data[m] = L.data[i];
            m++;
        }
    }
    n = m;//题目要求的顺序表是有序的,所以找大于t的数直接从下标为m的开始找即可
    for (int j = m;j < L.length;j++) {
        if (L.data[j] >t) {
            L.data[n] = L.data[j];
            n++;
        }
    }
    L.length = n;
    return true;
}

//显示
void ShowList(SeqList L) {
    for (int i = 0; i < L.length; i++){
        printf_s("%d  ",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);
    DeleteS_T(L, s,t);
    printf_s("
删除后的顺序表的元素如下:");
    ShowList(L);
    printf_s("
");
    system("pause");
    return 0;
}

测试结果:

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