本博文源于数据结构学习中的一次小练习,标题是:删除线性表给定区间的值,旨在进行细致化的讲解,含测试源码。
文章目录
0. 题目再现
设计一个解决方案,删除顺序表L中其值在给定值s与t之间(要求s小于或等于t)的所有元素,如果s或t不合理或顺序表为空则显示出错信息并退出运行
1. 题目测试效果
2. 题解思路
设置一个下标,遇见有该区间的值之后直接跳过,不同的话就开始进行收录
3.时间空间复杂度
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)
4.核心源码
bool deleteNo_s_to_t(SeqList& L, DataType s,DataType t) {
if(L.n == 0){
printf("table is empty don't delete");
return false;
}
if(s>t){
printf("varity is not curate\n");
return false;
}
int i,k=-1;
for(i=0;i<L.n;i++){
if((L.data[i] < s || L.data[i] > t) && ++k != i)
L.data[k] = L.data[i];
}
L.n = k+1;
return true;
}
5.完整源码
```c
#include<stdio.h>
#include<stdlib.h>
#define initSize 100
typedef int DataType;
typedef struct{
DataType *data;
int maxSize,n;
}SeqList;
void initList(SeqList& L) {
//调用方式initList(L),输入:未初始化的顺序表L;输出;已初始化的顺序表L
L.data = (DataType *) malloc(initSize*sizeof(DataType));
if(!L.data) {
printf("分配有误....\n");
exit(1);
}
L.maxSize = initSize;
L.n = 0;
}
void createList(SeqList &L,DataType A[],int n) {
initList(L);
for (int i = 0; i < n; i++)
L.data[i] = A[i];
L.n = n;
}
void printList(SeqList& L) {
for(int i =0;i<L.n;i++)
printf("%d ",L.data[i]);
printf("\n");
}
bool deleteNo_s_to_t(SeqList& L, DataType s,DataType t) {
if(L.n == 0){
printf("table is empty don't delete");
return false;
}
if(s>t){
printf("varity is not curate\n");
return false;
}
int i,k=-1;
for(i=0;i<L.n;i++){
if((L.data[i] < s || L.data[i] > t) && ++k != i)
L.data[k] = L.data[i];
}
L.n = k+1;
return true;
}
int main()
{
SeqList L;
int arr[5]={
1,2,5,8,10};
createList(L,arr,sizeof(arr)/sizeof(int));
printList(L);
int start = 2;
int end = 8;
printf("\ndeleted[%d,%d]:\n",start,end);
deleteNo_s_to_t(L,start,end);
printList(L);
return 0;
}
6.人脑试跑
假如输入[1,2,5,8,10],删除[2,8]范围内,那么还剩下[1,10]
6.1 i = 0
i=0时,L.data[0] =1< 2 并且 0 == 0 所以一不满足,继续循环
6.2 i = 1
i = 1,L.data[1] = 2 < 2 不满足 L.data[1] = 2 >8 不满足 后面短路不执行不满足,直接循环
6.3 i = 2
i = 2 L.data[2] = 5 < 2 不满足 L.data[2] = 5 > 8 不满足 后面不执行,直接循环
6.4 i = 3
i = 3 ,L.data[3] = 8 < 2 不满足 L.data[3] = 8 > 8 不满足,后面不执行 直接循环
目前k=0,因为根据短路后面都没执行
6.5 i = 4
i = 4,L.data[4]= 10 < 2 不满足 L.data[4] = 10 > 8 满足 ,++k = 1 != 4 赋值语句
L.data[1] = L.data[4] 完成循环
7.总结
难点在于 ++k!=i理解了它,并且会用,就会发现简单点。