非递减顺序表删除重复元素(三种方法)

方法一:暴力出奇迹

方法二:批量删除,一次将所有重复元素删除完

方法三:把顺序表当作两个表处理,首先将第一个元素当作一个表1,剩下的为一个表2,然后将表2的依次取出和表1元素对比,相同舍弃,不同直接加入表1

话不多说直接上代码吧(本人较懒没写注释大家自己脑补吧)

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

#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1
#define OVERFLOW   -2

typedef int    Status;
typedef int  ElemType;

#define LIST_INIT_SIZE  100
#define LISTINCREMENT    10

typedef struct {
	ElemType* elem;   
	int length;       
	int listsize;     
}SqList;

SqList La,Lb,Lc;
int num[10];
int sum;

void Randomize(int *array, int n, int min, int max)
{
	int i = 0;
	srand(time(NULL));
	for (i = 0; i < n; ++i) {
		array[i] = rand() % (max - min + 1) + min;  
	}
}

Status InitList_Sq(SqList &L)
{
	L.elem = (ElemType *)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
	if (!L.elem)
		exit(OVERFLOW);
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return OK;
}

void PrintList_Sq(SqList L)
{
	if (L.length == 0) {
		printf("SqList is empty!");
		exit(ERROR);
	}
	printf("此表数据为:\n");
	for (int i = 0; i < L.length; i++)
		printf("%4d", L.elem[i]);
	printf("\n");
}

Status ListInsert_Sq(SqList &L,int i,ElemType e)
{
	if (i<1 || i>L.length + 1) 
		return ERROR;
	if(L.length>=L.listsize)
	{
		ElemType *newbase;
		newbase = (ElemType *)malloc(sizeof(ElemType)*(LIST_INIT_SIZE + LISTINCREMENT));
		if (!newbase)
			exit(OVERFLOW);
		L.elem = newbase;
		L.listsize = LIST_INIT_SIZE + LISTINCREMENT;
	}
	ElemType *p, *q;
	p = &L.elem[i - 1];
	for(ElemType *q=&L.elem[L.length-1];q>=p;q--)
	{
		*(q + 1) = *q;
	}
	*p = e;
	L.length++;
	return OK;
}

Status ListCreate_Sq()
{
	/*int n;
	scanf("%d", &n);
	if (n > L.listsize)
		return (OVERFLOW);
	for(int i=0;i<n;i++)
	{
		scanf("%d", &L.elem[i]);
		L.length++;
	}*/
	Randomize(&num[0], 10, 1, 10);
	for (int i = 1; i <= 10; i++) {
		ListInsert_Sq(La, i, num[i - 1]);
		ListInsert_Sq(Lb, i, num[i - 1]);
		ListInsert_Sq(Lc, i, num[i - 1]);
	}
	std::sort(La.elem, La.elem + La.length);
	std::sort(Lb.elem, Lb.elem + Lb.length);
	std::sort(Lc.elem, Lc.elem + Lc.length);
	return OK;
}

Status ListDelete_Sq(SqList& L, int i, ElemType &e)
{
	if (i<1 || i>L.length + 1)
		return ERROR;
	ElemType *p,*q;
	p = &L.elem[i - 1];
	e = *p;
	q = L.elem + L.length - 1;
	for(++p;p<=q;p++)
	{
		sum++;
		*(p - 1) = *p;
	}
	L.length--;
}
Status ListRepeatDelete1_Sq(SqList &L) 
{
	sum = 0;
	for (int i = 0; i < L.length; i++)
	{
		for (int j = i + 1; j < L.length;)
		{
			sum++;
			if (L.elem[i] == L.elem[j])
			{
				ListDelete_Sq(L, j + 1, L.elem[j]);
			}
			else
			{
				j++; 
				sum++;
			}
		}
	}
	printf("\n方法一执行了%d次\n", sum);
	return OK;
}

Status ListRepeatDelete2_Sq(SqList &L)
{
	sum = 0;
	int SumRepeat=0;
	for(int i=0;i<L.length;i++)
	{
		
		for(int j=i+1;j<L.length;j++)
		{
			if (L.elem[j] == L.elem[i] && j == L.length - 1)
			{
				sum++;
				SumRepeat++;
				L.length -= SumRepeat;
			}
			else if(L.elem[j]==L.elem[i])
			{
				SumRepeat++;
			}
			else
			{
				for(int k=j;k<L.length;k++)
				{
					L.elem[k - SumRepeat] = L.elem[k];
				}
				sum++;
				L.length -= SumRepeat;
				SumRepeat = 0;
			}
		}
	}
	printf("\n方法二执行了%d次\n", sum);
	return OK;
}


Status ListRepeatDelete3_Sq(SqList &L)
{
	sum=0;
	int list1_length=0;
	ElemType *p, *q;
	p = L.elem;
	q = L.elem + 1;
	for(int *i=q;i<=L.elem+L.length;i++)
	{
		int flag = 1;
		for(int *k=L.elem;k<=p;k++)
		{
			sum++;
			if (*i == *k)
			{
				q++;
				flag = 0;
				break;
			}	
		}
		if(flag)
		{
			p++;
			*p = *q;
			q++;
			list1_length++;
		}
	}
	L.length = list1_length;
	printf("\n方法三执行了%d次\n", sum);
	return OK;
}



int main()
{
	InitList_Sq(La);
	InitList_Sq(Lb);
	InitList_Sq(Lc);
	ListCreate_Sq();
	PrintList_Sq(La);
	ListRepeatDelete1_Sq(La);
	printf("删除重复元素后");
	PrintList_Sq(La);
	ListRepeatDelete2_Sq(Lb);
	printf("删除重复元素后");
	PrintList_Sq(Lb);
	ListRepeatDelete3_Sq(Lc);
	printf("删除重复元素后");
	PrintList_Sq(Lc);
}

附上运行截图:

 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值