这里的seqlistD L是顺序表
int theMaxNum(seqlistD L){
int max=0;
int i;
if (L->length==0)
{
printf("NULL!!!!!!!!!!\n");
return 0;
/* code */
}
for(i=0;i<L->length;i++){
if(L->data[i]>max){
max=L->data[i];
}
}
return max;
}
// 删除有序序列中的重复元素
// 这个算法相当于是两个指针,A指针不动,B指针向后移动,当B指针指到的数据与A中不一样时A指针才会向后移动,并给填充B指针指到的数据
void delete_sortedList_repeat(seqlistD L){
if (L->length==0)
{
printf("顺序表为空!\n");
return;
}
int i,j;
for(i=0,j=1;j<L->length;j++){
if (L->data[i]!=L->data[j])
{
i++;
L->data[i]=L->data[j]; //这个算法前提是有序序列,若是无序序列则不可以
}
}
L->length=i+1;//因为i是从0开始算的,L的长度是从1开始算的,所以L.length=i+1;
}
// 无序的顺序表,用散列表来实现删除重复值并排序算法,此时的时间复杂度为n
void delete_unsortedList_repeat(seqlistD L){
if (L->length==0)
{
/* code */
printf("NULL!!!!!!!!!\n");
return;
}
int max=theMaxNum(L);
// int cnt[max+1]={0}; []中不能是变量
int *cnt=(int *)malloc(sizeof(int)*(max+1));
for (int i = 0; i < max; i++)
{
cnt[i]=0; //弄个全是0,长度为顺序表最大值的散列表,作为每个元素个数的记录
}
for (int i = 0; i < L->length; i++)
{
cnt[L->data[i]]++; //相同编号的的萝卜跳相同编号的坑,但是坑的编号不会有相同的。
}
// 遍历cnt取其中元素非零的编号
for (int i = 0,j=0; i < max; i++)
{
/* code */
if (cnt[i]!=0)
{
L->data[j]=i;
j++;
/* code */
}
L->length=j;
}
}