1.删除顺序表中所有值为x的元素:
对于顺序表,若想要删除表中所有值为x的元素,简单地嵌套for循环会导致时间复杂度过大(O())。
因此我们可以一边查找值顺序表中值不为x的元素,一边将该元素记录到顺序表中,并用k值记录当前顺序表的实际表长,此时时间复杂度为O(n)。
具体代码如下:
#include<stdio.h>
#define maxsize 100
typedef struct{
int data[maxsize];
int length;
}SqList;
bool Delete_Allx(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++;
}
}
if(k==L->length)
return false;
L->length=k;
return true;
}
int main(){
int x;
int temp;
int i=0;
scanf("%d",&temp);
SqList L;
L.length=0;
while(temp!=999){
L.data[i++]=temp;
L.length++;
scanf("%d",&temp);
}
scanf("%d",&x);
if(Delete_Allx(&L,x)){
for(int i=0;i<L.length;i++)
printf("%d ",L.data[i]);
}
else
printf("删除失败!");
return 0;
}
运行结果:
2.删除顺序表中重复元素:
在重复元素未知的情况下,简单的暴力算法删除表中重复元素无疑需要经过多次遍历。
因此,可以考虑嵌套两层循环,在原有顺序表上进行更改。
void Delete(SqList *L){
int k=0;
for(int i=0;i<L->length;i++){
int j;
for(j=0;j<k&&(L->data[i]!=L->data[j]);j++);
if(k==j){
if(k!=i) L->data[k]=L->data[i];
k++;
}
}
L->length=k;
}
在上述代码中,j不断遍历0到i之间的数组元素,当j=k或j所指的元素与i所指向的元素相等时,代表当前i指向的元素与前面的元素重复,则跳过这个i值。
完整代码如下:
#include<stdio.h>
#define maxsize 100
typedef struct{
int data[maxsize];
int length;
}SqList;
void Delete(SqList *L){
int k=0;
for(int i=0;i<L->length;i++){
int j;
for(j=0;j<k&&(L->data[i]!=L->data[j]);j++);
if(k==j){
if(k!=i) L->data[k]=L->data[i];
k++;
}
}
L->length=k;
}
int main(){
int temp;
int i=0;
scanf("%d",&temp);
SqList L;
L.length=0;
while(temp!=999){
L.data[i++]=temp;
L.length++;
scanf("%d",&temp);
}
Delete(&L);
for(int i=0;i<L.length;i++)
printf("%d ",L.data[i]);
return 0;
}
运行结果:
是给自己做的整合,从各处学习到的方法,如果涉及版权问题可随时联系我