题目要求:

对长度为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;
}

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐