加粗样式## 删除顺序表中所有值为x的元素
已知长度为n的线性表A采用顺序存储结构。设计一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。
介绍两种方法:重建法和前移法
重建法
前移法
一.重建法
设删除L中所有值等于x元素后的顺序表为L1,显然L1包含在L中,为此L1重用L的空间。
思路:扫描顺序表L,重建L只包含不等于x的元素。
//删除顺序表中所有值为x的元素(方法1) 重建法
//思路:扫描顺序表L,重建L只包含不等于x的元素。
//用i记录当前操作到的元素位置,
//用k记录该存放的位置
#include <stdio.h>
#include <malloc.h>
struct Ming {
int data[10000];
int last;
};
struct Ming* M;
struct Ming* kongbiao(int a[], int n);
struct Ming* shanchu(struct Ming* M, int x);
int main()
{
struct Ming* M;
int n, a[10000], x;
M = (struct Ming*)malloc(sizeof(struct Ming));
scanf_s("%d", &n);
M = kongbiao(a, n);
scanf_s("%d", &x);
M = shanchu(M, x);
for (int j = 0;j <M->last;j++)
{
printf("%d ", M->data[j]);
}
return 0;
}
struct Ming* kongbiao(int a[], int n)
{
struct Ming* M;
int i = 0;
M = (struct Ming*)malloc(sizeof(struct Ming));
for (i = 0;i < n;i++)
{
scanf_s("%d", &a[i]);
M->data[i] = a[i];
}
M->last = n;
return M;
}
struct Ming* shanchu(struct Ming* M, int x)
{
int k = 0;
for (int i = 0;i <= M->last;i++)
{
if (M->data[i] != x)
{
M->data[k] = M->data[i];
k++;
}
}
M->last = k - 1;
return M;
}
代码运行结果:
二.前移法
用k记录顺序表L中等于x的元素个数,一边扫描L一边统计k值。
思路:将不为x的元素前移k个位置,最后修改L的长度。
//删除顺序表中所有值为x的元素(方法2) 前移法
//将不为x的元素前移k个位置,最后修改L的长度。
//k 记录删除的元素个数, 也是前移的位置
//L->data[i-k]=L->data[i] 用i记录当前操作到的元素位置,
//用k记录该存放的位置
//
#include <stdio.h>
#include <malloc.h>
struct Ming {
int data[10000];
int last;
};
struct Ming* M;
struct Ming* kongbiao(int a[], int n);
struct Ming* shanchu(struct Ming* M, int x,int n);
int main()
{
struct Ming* M;
int n, a[10000], x;
M = (struct Ming*)malloc(sizeof(struct Ming));
scanf_s("%d", &n);
M = kongbiao(a, n);
scanf_s("%d", &x);
M = shanchu(M, x,n);
for (int j = 0;j <= M->last;j++)
{
printf("%d ", M->data[j]);
}
return 0;
}
struct Ming* kongbiao(int a[], int n)
{
struct Ming* M;
int i = 0;
M = (struct Ming*)malloc(sizeof(struct Ming));
for (i = 0;i < n;i++)
{
scanf_s("%d", &a[i]);
M->data[i] = a[i];
}
M->last = n;
return M;
}
struct Ming* shanchu(struct Ming* M, int x,int n)
{
int k = 0;
for (int i = 0;i <= M->last;i++)
{
if (M->data[i] == x)
k++;
else
M->data[i - k] = M->data[i];
}
M->last = n -1-k;
return M;
}
运行结果: