对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法 该算法删除线性表中所有值为x的数据元素
题目要求:对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法该算法删除线性表中所有值为x的数据元素/*对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法该算法删除线性表中所有值为x的数据元素*/#include <iostream>#include <cstring>#include<math...
·
题目要求:
对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法
该算法删除线性表中所有值为x的数据元素
/*对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法
该算法删除线性表中所有值为x的数据元素*/
#include <iostream>
#include <cstring>
#include<math.h>
#define MAXSIZE 20
#define ElemType int//不加分号
using namespace std;
typedef struct {
ElemType data[MAXSIZE];
int length;
}SqList;
bool InitList(SqList &L) {
memset(L.data, 0, sizeof(L));
if (!L.data)
exit(0);
L.length = 0;
return true;
}
void CreateList(SqList &L, int n) {
for (int i = 0;i<n;i++) {
cin >> L.data[i];
L.length++;
}
}
bool DeleteX(SqList &L,ElemType e) {//推荐做法,更容易想
//注释部分的做法没有达到空间复杂度为o(1),也不会满足时间复杂度要求
/*int x[MAXSIZE];
int j=-1;
memset(x, 0, sizeof(x));*/
int k=0;//用k来记录所有值不是x的元素的下标,边扫描边统计k,并将不等于x的元素向前移动k个位置,最后修改L的长度
for (int i = 0;i <L.length;i++) {
if (L.data[i] != e) {
/*j++;
x[j] = i;*/
L.data[k] = L.data[i];
k++;
}
}
L.length = k;
return true;
}
void DeleteX2(SqList &L, ElemType e) {
int k = 0, i = 0;//用k来记录等于x的元素的个数,边扫描L边统计k,并将不等于x的元素前移k个位置,最后修改L的长度
while (i<L.length)
{
if (L.data[i] == e)
k++;//用k来记录等于x的元素的个数,边扫描L边统计k
else
L.data[i - k] = L.data[i];//将不等于x的元素前移k个位置
i++;
}
L.length -= k;//修改L的长度
}
void PrintList(SqList L) {
cout << "表中元素分别为";
for (int i = 0;i<L.length;i++)
cout << L.data[i] << " ";
cout << endl;
}
int main() {
SqList L;
InitList(L);
int n = 0;
cout << "请输入要创建的表的长度:" << endl;
cin >> n;
cout << "请依次输入各个元素:(用空格隔开)" << endl;
CreateList(L, n);
cout << "请输入想要删除元素的值(即x的值):" << endl;
ElemType e;
cin >> e;
DeleteX2(L,e);
PrintList(L);
return 0;
}
更多推荐
已为社区贡献4条内容
所有评论(0)