算法思想:从头遍历线性表中的每个元素,用一个变量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;
}
如有问题欢迎随时与我沟通。