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

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

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

第一种:

顺序表习题之清楚重复元素_第1张图片

 顺序表习题之清楚重复元素_第2张图片

 下面直接上代码:

#include 
#include 
#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;
}

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

顺序表习题之清楚重复元素_第3张图片

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

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

#include 
#include 



//查找数据元素
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;
}

代码分析:

顺序表习题之清楚重复元素_第4张图片

 

你可能感兴趣的:(C数据结构与算法,职场和发展,c语言,算法)