删除无序顺序表重复 4种方法

除了这两种 一种是暴力,一种是建新表,遍历数组,每次遍历到值假设为i,那么新建表B[i]=1,代表已经有 后续如果查看这里是1,便代表有重复 直接删除即可

#include<stdio.h>

#define MAXSIZE 1000

typedef struct a{

int data[MAXSIZE];

int length;

}List;

List A;

int quicksort(int low,int high){

int flag=A.data[low];//出错 flag=第一个元素 是Low

while(low<high){

while(A.data[high]>=flag&&low<high)

high--;

A.data[low]=A.data[high];

while(A.data[low]<=flag&&low<high)

low++;

A.data[high]=A.data[low];

}

A.data[low]=flag;

return low;//返回基准

}

void partition(int low,int high){

if(low<high){

int q=quicksort(low,high);

partition(low,q-1);

partition(q+1,high);

}

}

void Delete(){

int i=0,j=1,n=A.length;

for(i,j;j<n;j++)

if(A.data[i]!=A.data[j])

A.data[++i]=A.data[j];

A.length=i+1;

}

void output(){

printf("%d\n",A.length);

for(int i=0;i<A.length;i++)

printf("%d ",A.data[i]);

}

void create(int n){

int x=0,j=0;

for(int i=0;i<n;i++){

j=0;//注意每次输出都要重置j的值确保从头开始输出

scanf("%d",&x);

for(j;j<A.length;j++)

if(A.data[j]==x)

break;//如果数组中找到任意一个与插入的相等,则不插入

if(A.length==0||j==A.length){//判断是否是无重复遍历到了最后一个

A.length++;

A.data[j]=x;

}

}

}

int main(){

int n=0;A.length=0;

scanf("%d",&n);

//法1,在建表时就对表做修改 25min

create(n);

output();

// 法2,用时30MIN,但不合题意 先排序会与要求输出不一致

/* partition(0,n-1);

Delete();

output();

*/

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值