C语言写出在有序的顺序表中删除相同的多余结点的算法
时间: 2024-09-06 11:04:53 浏览: 44
用C语言举例讲解数据结构中的算法复杂度结与顺序表
在C语言中,要实现在有序顺序表中删除重复元素的算法,可以采用双指针方法,一个指针用于遍历顺序表,另一个指针用于记录非重复元素的位置。以下是该算法的基本思想和步骤:
1. 定义一个有序顺序表,并初始化数据。
2. 使用两个指针,其中`i`指针用于遍历顺序表,`j`指针初始时指向第一个非重复元素的位置。
3. 遍历顺序表,比较`i`和`j`指针所指向的元素值。
- 如果`i`和`j`指向的元素值相同,则移动`i`指针,跳过重复元素。
- 如果`i`和`j`指向的元素值不同,则将`i`指针指向的元素复制到`j+1`的位置,并将`j`指针向前移动一位。
4. 继续步骤3的操作直到顺序表的末尾。
5. 最后,删除`j+1`到原顺序表末尾的所有元素,完成删除重复元素的操作。
下面是一个具体的代码示例:
```c
#include <stdio.h>
// 函数声明
void removeDuplicates(int arr[], int n);
int main() {
int arr[] = {1, 1, 2, 3, 3, 3, 4, 5, 5, 6}; // 示例顺序表
int n = sizeof(arr) / sizeof(arr[0]); // 顺序表的元素个数
removeDuplicates(arr, n); // 调用函数删除重复元素
// 打印去重后的顺序表
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
// 函数定义:删除有序顺序表中的重复元素
void removeDuplicates(int arr[], int n) {
if (n == 0 || n == 1) {
return; // 如果顺序表为空或只有一个元素,无需操作
}
int j = 0; // j指向新数组的最后一个元素
// 遍历顺序表
for (int i = 1; i < n; i++) {
if (arr[j] != arr[i]) { // 当遇到不重复的元素时
arr[++j] = arr[i]; // 将该元素放到新数组的下一个位置
}
}
// 删除j+1到原数组末尾的所有元素
int newSize = j + 1;
for (int i = newSize; i < n; i++) {
arr[i] = 0; // 可以将这些位置填充为0或其他标记值
}
}
```
阅读全文