顺序表习题之清楚重复元素

Title Description

In the table with length N, n < 1000, there are some duplicate elements. We need to clear these duplicate elements

input

Enter the length of the table in the first row n:

The second line successively outputs the stored N element values

output

The first row outputs the number of elements in the sequence table after deleting duplicate elements

The second line outputs the elements of the sequence table after the deletion

Sample input

eight

5 3 5 5 6 3 7 8

Sample output

five

5 3 6 7 8

我们用两种方法来解决问题:

第一种:

 

 下面直接上代码:

#include <stdio.h>
#include <stdlib.h>
#define ARR_MAX_SIZE 1001

//查找元素,返回0或者1
int find(int list[],int len,int data,int pos) 
{
	int i;
	for(i = pos + 1;i < len;i++) {
		if(data == list[i]) {
			return 1;
		}
	}
	return 0;
}


//删除操作
int delete(int list[],int len,int pos) 
{
	int i;
	for(i = pos + 1;i < len;i++) {
		list[i-1] = list[i];
	}
	return --len;//返回删除之后表的长度
}

int  main() {
	int list[ARR_MAX_SIZE];
	int n;
	//可持续性操作
	while(scanf("%d",&n) != EOF) {
		//开始循环赋值
		int i = 0;
		for(;i < n;i++) {
			scanf("%d ",&list[i]);
		}
		//下面具体业务逻辑操作
		int j;
		for(j = 0;j < n;j++) {
			int flag = find(list,n,list[j],j);
			if(flag) {
				printf("进来了\n");
				n = delete(list,n,j);
				j--;//角标删除之后还是指向当前位置
			}
		}
		printf("%d\n",n);
		int k;
		for(k = 0;k < n;k++) {
			printf("%d ",list[k]);
		}
	}
	return 0;
}

上面的代码我之前遇到过一个小问题,就是不管插入什么程序,只要一执行,就把数据全部删除了。下面是代码分析:

 上面角标就会不断移动到0这个索引位置

下面看第二种解决问题代码:

#include <stdio.h>
#include <stdlib.h>



//查找数据元素
int find(int list[],int len,int data)
{
	//这个插入是数据的回插,查找
	int i;
	for(i = 0;i < len;i++) {
		if(list[i] == data) {
			return 1;
		} 
	}
	return 0;
}

int delete(int list[],int len,int pos)
{
	int i;
	for(i = pos + 1;i < len;i++) {
		list[i-1] = list[i];
	}
	return len--;
}

int main() {
	int n;
	int list[1001];//数组最大容量限定1000个数据
	while(scanf("%d",&n) != EOF) {
		int i;
		for(i = 0;i < n;i++) {
			scanf("%d ",&list[i]);
		}
		int j = 0;//代表长度
		int k = 0;//这个角标用来控制索引
		for(k = 0;k < n;k++) {
			int flag = find(list,j,list[k]);
			if(flag) {
				n = delete(list,n,k--);
			} else {
				j++;
			}	
		}
		printf("%d\n",n);
		int p = 0;
		for(;p < n;p++) {
			printf("%d ",list[p]);
		}
	}
	return 0;
}

代码分析:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值