问题描述:长度为n的线性表,删除表中所有值为x的元素,要求时间复杂度为O(n),空间复杂度为O(1)。
算法设计思想:用k记录顺序表中不等于x的元素个数,即需要保存的元素个数,边扫描L边统计k,并将不等于x的元素放在L.data[k]中,最后修改L的长度。
代码及结果:
#include<stdio.h>#include "线性表的顺序表示和实现.cpp"void Del_x(SqList &L,ElemType x){//删除顺序表中值为x的数据元素int k = 0; //记录值不等于x的元素个数 for(int i = 0;i < L.length;i++){if(L.data[i] != x){L.data[k] = L.data[i];k++;}}L.length = k; //线性表的长度等于k,因为已经k++了,所以不用再+1 }int main(){//TestSqList L; //定义一个顺序表 int e;bool flag = InitList_Sq(L);if(flag)printf("构造空的顺序表成功!\n");elseprintf("构造顺序表失败!\n");printf("依次输入要往线性表中输入的元素:");for(int i = 0;i < 10;i++){scanf("%d",&e);ListInsert_Sq(L,i+1,e);}printf("顺序表中现有的数据为:");PrintList(L);Del_x(L,4);printf("删除指定值后现有的数据为:");PrintList(L);return 0; }