03 顺序表的删除(严 2.29)

这篇博客介绍如何删除非递减有序顺序表中的重复元素,具体操作是删除同时存在于两个其他有序表中的元素。算法分为两步:首先找到两个表中相同的元素并存储在一个新数组中,然后遍历原表并移除与新数组中相同的元素。

题目

description:
已知 A,B 和 C 为三个非递减有序的线性表,现要求对 A 表作如下操作:删去那些既在 B 表中出现又在 C 表中出现的元素。试对顺序表编写实现上述操作的算法。
input:
第一行输入 3 个正整数 m,n,p(m,n,p<=100),用空格分开,分别表示三个线性表中的元素个数,其后 3 行依次输入 A,B,C 表中的元素。
output:
输出实现上述操作后的 A 表。
sample_input:
8 5 6
1 2 3 4 5 6 6 7
2 3 5 9 12
2 4 5 6 12 13
sample_output:
1 3 4 6 6 7

思路

核心代码分为两步

  • 第一步:找
    新建数组d,存储数组b、c中的相同元素,数组d的长度取数组b、c中长度较小的那个;
    接下来同时遍历数组b、c,将相同元素存入数组d中
  • 第二步:删
    同时遍历数组a、d,每找到一个相同元素,就在数组a中将该元素删除;
    注意在数组a中删除元素,即依次将后面的元素往前移动一个位置

代码

#include <stdio.h>
#include <iostream>
using namespace std;

void deleteSame(int a[], int b[], int c[], int m, int n, int p);

int main() {
	int m, n, p;
	cin >> m >> n >> p;
	int A[m], B[n], C[p];
	int i;
	for (i = 0; i < m; i++)
		cin >> A[i];
	for (i = 0; i < n; i++)
		cin >> B[i];
	for (i = 0; i < p; i++)
		cin >> C[i];
	deleteSame(A, B, C, m, n, p);
}

void deleteSame(int a[], int b[], int c[], int m, int n, int p) {
	int r = n < p ? n : p;
	int d[r]; //存储B、C中都存在的元素
	int i, j, k, t, v;
	i = j = k = t = v = 0;
	while (i <= r && j <= r) {//i、j分别遍历数组B、C
		if (b[i] == c[j]) {
			d[k++] = b[i];//将数组B、C中相等的元素存入数组d
			i++;
			j++;
		} else if (b[i] < c[j]) {
			i++;
		} else {
			j++;
		}
	}
	i = j = 0;
	while (j <= k) {
		if (a[i] == d[j]) {
			v++; //统计A中含有的B、C重复元素个数
			for (t = i; t < m; t++)
				a[t] = a[t + 1]; //删除元素
			i++;
		} else if (a[i] < d[j]) {
			i++;
		} else
			j++;
	}
	/*输出*/
	for (i = 0; i < m - v; i++)
		cout << a[i] << " ";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值