對長度爲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.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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章