顺序表去重操作 数据结构

顺序表去重操作 数据结构

问题描述

问题描述:设计一个算法从顺序表中删除重复的元素,并使剩余元素间的相对次序保持不变。例如:原顺序表为{4 2 8 4 2 1 2 1 3 5 2},执行该算法后,顺序表为:{4 2 8 1 3 5}。另外,顺序表的初始值通过调用算法initRandomize(int *arr, int n, int min, int max)产生。

/*
	产生n个[min, max]的随机数。可能会有重复值。
*/
void initRandomize(int *arr, int n, int min, int max)
{
    int i = 0;
    srand(time(0));  			/*设置种子,并生成伪随机序列*/
    for (i = 0; i < n; ++i) {
        arr[i] = rand() % (max - min + 1) + min;  /*得到从[min, max]之间的随机数*/
        printf("%d ", arr[i]);
    }
    printf("\n\n");
}

代码实现

//主要函数代码,去重的
bool unique_link(sqlink &L)
{
	if(L.len==0)
		return false;
	int i, j=1, sum=1;
	while(j<L.len)
	{
		for(i=0; i<sum; i++)
		{
			if(L.elem[i]==L.elem[j])
				break;
		}
		if(i==sum)
			L.elem[sum++]=L.elem[j++];
		else 
			j++;
	}
	L.len=sum;
	return true;
}
//完整代码实现
#include<bits/stdc++.h>
using namespace std;
const int init_size=20;
const int increment=5;
struct sqlink
{
	int *elem;
	int len;
	int listsize;
};
bool init(sqlink &L)
{
	L.elem=(int *)malloc(init_size*sizeof(int));
	if(L.elem==NULL)
		return false;
	L.len=0;
	L.listsize=init_size;
	return true;
}
bool listinsert(sqlink &L, int i, int e)
{
	int *newbase, *p;
	if(i<1 || i>L.len+1)
		return false;
	if(L.len >= L.listsize)
	{
		newbase=(int *)realloc(L.elem, (L.listsize+increment)*sizeof(int));
		if(newbase==NULL)
			return false;
		//printf("链表扩容一次\n");
		L.elem=newbase;
		L.listsize+=increment;
	} 
	for(p=&(L.elem[L.len-1]); p>=&(L.elem[i-1]); p--) 
		*(p+1)=*p;
	L.elem[i-1]=e;
	L.len++;
	return true;
}
bool display(sqlink &L)
{
	int i;
	for(i=0; i<L.len; i++)
	{
		printf("%d ", L.elem[i]);
	}
	printf("\n\n");
	return true;
}
bool clear(sqlink &L)
{
	if(L.elem==NULL)
		return false;
	free(L.elem);
	L.elem=NULL;
	L.len=0;
	L.listsize=0;
	return true;
}
/*
	产生n个[min, max]的随机数。可能会有重复值。
*/
void initRandomize(int *arr, int n, int min, int max)
{
    int i = 0;
    srand(time(0));  			/*设置种子,并生成伪随机序列*/
    for (i = 0; i < n; ++i) {
        arr[i] = rand() % (max - min + 1) + min;  /*得到从[min, max]之间的随机数*/
        printf("%d ", arr[i]);
    }
    printf("\n\n");
}
bool unique_link(sqlink &L)
{
	if(L.len==0)
		return false;
	int i, j=1, sum=1;
	while(j<L.len)
	{
		for(i=0; i<sum; i++)
		{
			if(L.elem[i]==L.elem[j])
				break;
		}
		if(i==sum)
			L.elem[sum++]=L.elem[j++];
		else 
			j++;
	}
	L.len=sum;
	return true;
}
int main()
{
	int a[10], maxx=20, minn=1, i, e, tmp;
	sqlink L;
	if(!init(L))
	{
		printf("链表初始化出现错误,程序退出\n");
		return 0;
	}
	initRandomize(a, 10, 0, 5);
	for(i=0; i<10; i++)
	{
		if(!listinsert(L, i+1, a[i]))
		{
			printf("链表插入出现错误, 链表结束插入操作\n");
			break;
		}
	}
	unique_link(L);
	display(L);
	if(clear(L))
		printf("free成功\n");
	else
		printf("free失败\n");
	return 0;
}
posted @ 2019-11-05 09:28  ALKING1001  阅读(990)  评论(0编辑  收藏  举报