zoukankan      html  css  js  c++  java
  • 顺序表去重操作 数据结构

    顺序表去重操作 数据结构

    问题描述

    问题描述:设计一个算法从顺序表中删除重复的元素,并使剩余元素间的相对次序保持不变。例如:原顺序表为{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("
    
    ");
    }
    

    代码实现

    //主要函数代码,去重的
    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("链表扩容一次
    ");
    		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("
    
    ");
    	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("
    
    ");
    }
    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("链表初始化出现错误,程序退出
    ");
    		return 0;
    	}
    	initRandomize(a, 10, 0, 5);
    	for(i=0; i<10; i++)
    	{
    		if(!listinsert(L, i+1, a[i]))
    		{
    			printf("链表插入出现错误, 链表结束插入操作
    ");
    			break;
    		}
    	}
    	unique_link(L);
    	display(L);
    	if(clear(L))
    		printf("free成功
    ");
    	else
    		printf("free失败
    ");
    	return 0;
    }
    
    欢迎评论交流!
  • 相关阅读:
    java泛型
    跨域传递
    laravel的一些语法
    去重
    laravel的一些查询语句
    mysql把之前表单进行拆分
    Laravel5.1接收json数据
    thinkphp5 composer安装验证码
    关于地图经纬度的问题
    tp5分组查询
  • 原文地址:https://www.cnblogs.com/alking1001/p/11796454.html
Copyright © 2011-2022 走看看