题目:对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为1的算法,该算法删除线性表中所有值为x的数据元素。
思路:解法一:可以采用双指针的思想,fast指针快速读取顺序表中的数值,并做判断。符合要求的就存到slow中。
解法二:用k记录顺序表L中等于e的元素个数,边扫描L边统计k,并将不等于e的元素前移k个位置。扫描结束后修改L的长度。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define InitSize 10
typedef struct {
int* data;
int length;
int MaxSize;
}SeqList;
bool InitList(SeqList* L) {
L->data = (int*)malloc(sizeof(int) * InitSize);
if (L->data == NULL)
return false;
L->length = 0;
L->MaxSize = InitSize;
return true;
}
//解法一:
//bool DelElem(SeqList* L, int e) {
// if (L->length == 0) {
// return false;
// }
// int slow = 0, fast = 0;
// for (fast = 0; fast < L->length; fast++) {
// if (L->data[fast] != e)
// L->data[slow++] = L->data[fast];
// }
// L->length = slow;
// return true;
//}
//解法二:用k记录顺序表L中等于e的元素个数,边扫描L边统计k,并将不等于e的元素前移k个位置。扫描结束后修改L的长度。
bool DelElem(SeqList* L, int e) {
if (L->length == 0)
return false;
int k = 0, i = 0; //k记录值等于e的元素的个数
for (i = 0; i < L->length; i++) {
if (L->data[i] == e)
k++;
else
{
L->data[i - k] = L->data[i];
}
}
L->length -= k;
return true;
}
int main()
{
SeqList L;
InitList(&L);
for (int i = 0; i < L.MaxSize; i++) {
scanf("%d", &L.data[i]);
L.length++;
}
int e;
printf("请输入要删除的数字:\n");
scanf("%d", &e);
if (DelElem(&L, e)) {
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
}
return 0;
}