C语言删除线性表给定区间的值(含测试源码)

本博文源于数据结构学习中的一次小练习,标题是:删除线性表给定区间的值,旨在进行细致化的讲解,含测试源码。

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理解了它,并且会用,就会发现简单点。

おすすめ

転載: blog.csdn.net/m0_37149062/article/details/120743341