(2021)2.3对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。
1.定义、初始化顺序表
为方便测试,在初始化顺序表时直接固定元素值。使用了比较笨的方法,如有简便方法欢迎指导。
typedef struct{
int data[MaxSize];
int length;
}SqList;
void InitList(SqList *L){
/*
for (int i=0,j=1; i<10; i++,j++){
L->data[i] = j;
L->length++;
}
*/
L->data[0] = 2;
L->data[1] = 5;
L->data[2] = 6;
L->data[3] = 5;
L->data[4] = 2;
L->data[5] = 2;
L->data[6] = 2;
L->data[7] = 5;
L->data[8] = 9;
L->data[9] = 2;
L->length = 10;
}
2.在main函数中传入参数
int main(){
SqList L;
L.length = 0;
InitList(&L);
for(int i=0; i<L.length; i++){
printf("data[%d]=%d\n",i,L.data[i]);
}
printf("length = %d\n",L.length);
DelX(&L,2);
for(int i=0; i<L.length; i++){
printf("data[%d]=%d\n",i,L.data[i]);
}
printf("length = %d\n",L.length);
return 0;
}
3.删除所有值为x的元素
在时间复杂度的要求下,只能对线性表进行一次遍历。标准的删除操作需要:
a.先删除元素; b.把后续元素逐一提前; c.修改表长。
转换思想,i 元素直接被 i+1元素替代这一步操作直接解决了标准删除中的前两步操作(即d=a+b)。表长部分可以同步计算来解决。
void DelX(SqList *L,int x){
int k;
for (int i=0; i<L->length; i++){
if (L->data[i]!=x){
L->data[k] = L->data[i];
k++;
}
}
L->length = k;
}
4.完整代码及运行结果
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct{
int data[MaxSize];
int length;
}SqList;
void InitList(SqList *L){
/*
for (int i=0,j=1; i<10; i++,j++){
L->data[i] = j;
L->length++;
}
*/
L->data[0] = 2;
L->data[1] = 5;
L->data[2] = 6;
L->data[3] = 5;
L->data[4] = 2;
L->data[5] = 2;
L->data[6] = 2;
L->data[7] = 5;
L->data[8] = 9;
L->data[9] = 2;
L->length = 10;
}
void DelX(SqList *L,int x){
int k;
for (int i=0; i<L->length; i++){
if (L->data[i]!=x){
L->data[k] = L->data[i];
k++;
}
}
L->length = k;
}
int main(){
SqList L;
L.length = 0;
InitList(&L);
for(int i=0; i<L.length; i++){
printf("data[%d]=%d\n",i,L.data[i]);
}
printf("length = %d\n",L.length);
DelX(&L,2);
for(int i=0; i<L.length; i++){
printf("data[%d]=%d\n",i,L.data[i]);
}
printf("length = %d\n",L.length);
return 0;
}
以上文章如有错误欢迎各位指正、交流代码。