删除重复数据(将先出现的数据与后面的数据对比,如果有重复的将后面的数据删除)
提示:可以直接使用按位置删除的函数。两层循环
顺序表中原有:1 2 2 1 1 3 4 3 2 4 5 3 4 5 4 1
1 2 2 1 3 4 3 2 4 5 3 4 5 4 1
…
顺序表中存储:1 2 3 4 5
提示:先找到重复数据的位置,按位置删除。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 40
//定义结构体
typedef struct
{
int arr[MAX];
int pos;
}Node;
//创建顺序表
Node* creat_list(void)
{
Node* p = (Node*)malloc(sizeof(Node));
p->pos = 0;
return p;
}
//顺序表追加
void list_apend(Node* ptr, int num)
{
if(ptr->pos>MAX+1)
{
printf("线性表已满,无法追加\n");
return;
}
ptr->arr[ptr->pos] = num;
ptr->pos++;
}
//根据索引删除顺序表中的元素
void del_index(Node* ptr, int index)
{
if(index<0 || index>=ptr->pos)
{
printf("下标数据输入不合法\n");
return;
}
else
{
for (int i=index; i<ptr->pos-1; i++)
{
ptr->arr[i] = ptr->arr[i+1];
}
ptr->pos--;
return;
}
}
//顺序表去重
void Remove(Node* ptr)
{
for(int i=0; i<ptr->pos; i++)
for(int j=i+1; j<ptr->pos; j++)
if(ptr->arr[i]==ptr->arr[j])
{
del_index(ptr, j);
j--;
}
return;
}
//打印顺序表
void show_list(Node* ptr)
{
for(int i=0; i<ptr->pos; i++)
printf("%d ",ptr->arr[i]);
putchar(10);
return;
}
int main(int argv, char* argvs[])
{
int arr[] = {1,2,2,1,1,3,4,3,2,4,5,3,4,5,4,1,1,2,2,1,3,4,3,2,4,5,3,4,5,4,1};
Node* seq = creat_list();
//向顺序表添加元素
for(int i=0; i<sizeof(arr)/sizeof(int); i++)
list_apend(seq,arr[i]);
Remove(seq);
show_list(seq);
return 0;
}