題目要求:
對長度爲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;
}