2021-09-23

加粗样式## 删除顺序表中所有值为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;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值