数据结构与算法学习笔记:从线性表中删除所有值为x的元素,算法时间复杂度为O(n),空间复杂度为O(1)

算法思想:从头遍历线性表中的每个元素,用一个变量k来记录x的个数(看似是x的个数,实际上是在这一个x之后的的元素需要向前移动k个位置进行覆盖删除)

当遇到x==(*L).data[i]时,k++,i++;

当x!=(*L).data[i]时,用i位置元素覆盖i-k位置元素//将i位置前移k个位置,i++

算法代码如下:

#include <stdio.h>
#include <stdlib.h>
#define Maxsize 50

typedef struct
{
    int data[Maxsize];
    int length;
}SqList;



void dele_x(SqList *L,int x)
{
    int k=0,i=0;
    while(i<L->length)
    {
        if(L->data[i]==x)k++;
        else L->data[i-k]=L->data[i];//核心,将第i个元素前移k个位置的算法
        i++;
    }
    L->length=L->length-k;//L的长度要递减
}

另外请不用担心累加覆盖错误的问题,没有错误,想清楚,该算法过程如下:

main:

//seq_list_insert(&L,1,0);为向L中1的位置插入值为0的元素。

 

 结果:

算法二更好理解,不再赘述:

//算法二:
void dele2_x(SqList *L,int x)
{
    int k=0;
    for(int i=0;i<L->length;i++)
    {
        if(L->data[i]!=x)
        {
            L->data[k]=L->data[i];
            k++;
        }
    }
    L->length=k;
}

如有问题欢迎随时与我沟通。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值