问题描述:长度为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(){ //Test SqList L; //定义一个顺序表 int e; bool flag = InitList_Sq(L); if(flag) printf("构造空的顺序表成功!\n"); else printf("构造顺序表失败!\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; }