题目来源于王道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("\n输入初始值:"); CreateList(L, length); printf_s("输入要删除的数字范围区间:"); scanf_s("%d %d", &s, &t); DeleteST(L, s, t); printf_s("\n删除后的顺序表的元素如下:"); ShowList(L); printf_s("\n"); system("pause"); return 0; }
测试结果:
时间: 2024-11-02 06:22:41