用c语言实现从有序顺序表中删除所有值重复的值
时间: 2024-09-17 19:02:04 浏览: 112
pta题库答案c语言之线性结构1两个有序链表序列的合并.zip
在C语言中,我们可以使用数组来表示有序顺序表,并通过遍历数组的方式来删除所有重复的值。这里提供一种简单的线性时间复杂度O(n)的解决方案:
```c
#include <stdio.h>
// 定义结构体来存储元素及其索引
typedef struct {
int value;
int index;
} Element;
// 比较两个元素是否相等
int compare(const void *a, const void *b) {
return (*(Element *)a).value - (*(Element *)b).value;
}
// 删除数组中的重复元素
void removeDuplicates(int arr[], int n) {
// 使用qsort函数对数组进行排序
qsort(arr, n, sizeof(Element), compare);
// 创建一个哈希表(这里用数组作为简单实现)
int hash[101] = {0}; // 假设最大值不超过100
for (int i = 0; i < n; ++i) {
if (hash[arr[i].value] == 0) { // 如果元素未出现过
hash[arr[i].value] = 1; // 标记为已出现
arr[i].index = i; // 保留当前索引
}
}
// 更新实际数组长度,跳过重复元素
n = 0;
for (int i = 0; i < n; ++i) {
if (hash[arr[i].value]) {
arr[n++] = arr[i]; // 将非重复元素复制到新位置
}
}
arr[n] = '\0'; // 结束数组,确保其有效
}
int main() {
int arr[] = {1, 2, 2, 3, 4, 4, 5};
int len = sizeof(arr) / sizeof(arr[0]);
printf("Before removing duplicates:\n");
for (int i = 0; i < len; ++i) {
printf("%d ", arr[i]);
}
removeDuplicates(arr, len);
printf("\nAfter removing duplicates:\n");
for (int i = 0; arr[i]; ++i) {
printf("%d ", arr[i]);
}
return 0;
}
```
当你运行这个程序时,它会先打印出原数组,然后删除重复的元素并输出更新后的数组。
阅读全文