会数据结构进

来源:百度知道 编辑:UC知道 时间:2024/05/18 15:53:34
已知一个顺序表A,其元素值非递减有序排列,编写一个算法,删除顺序表中多余的值相同的元素。

#include <stdio.h>

// 除重,返回新的超尾指针
int* unique(int* beg, int* end)
{
int* p1;
int* p2;

if(end - beg < 2) // 如果元素个数小于2,直接返回
return end;

while(*(end - 1) == *(end - 2)) // 尾部有重复的话直接把尾指针往前移就可以了
--end;

while(beg != end) // 遍历数组
{
if(*beg == *(beg + 1)) // 如果有重复
{
p1 = p2 = beg; // 记录重复元素的起始位置

while(*++p1 == *beg); // 保留一个重复的元素,然后从下一个重复元素的位置开始向后移,直到没有重复为止

while(p1 != end)
*++p2 = *p1++; // 除被保留的那个元素外,把从p1开始到结束位置的元素往前移

end -= p1 - p2 - 1; // 更新结尾,p1 - p2为重复元素的总个数,保留一个元素,所以再减1
}
beg++; // 下一趟,beg此时已指向第一个不同于上次重复元素的元素
}

return beg;
}

int main()
{
int a[] = {1,1,3,4,4,5,6,7,7,8,8,8,9};
int* end = a + sizeof(a)/sizeof(a[0]); // 超尾指针

end = unique(a, end); // 保存新结尾

for(int* beg = a; beg != end; ++beg)
printf("%d ", *beg); // 输出

return 0;
}