仅考虑算法思路,不考虑具体实现,仿照有序表的解决思路借助chatgpt写出,如有错误之处,敬请指正。
代码:
bool delete_same(seqlist &L) {
if (L.length == 0) {
return false;
}
// 定义一个散列表,假设值范围在 0 到 999 之间
bool hashTable[1000] = {false};
int i = 0;
for (int j = 0; j < L.length; j++) {
if (!hashTable[L.data[j]]) { // 如果散列表中没有记录该值
hashTable[L.data[j]] = true; // 在散列表中记录该值
L.data[i++] = L.data[j]; // 保留该值
}
}
L.length = i; // 更新顺序表的长度
return true;
}
示例:
假设初始顺序表 L
为 {4, 3, 1, 2, 5, 3, 2, 1, 5, 6}
。
遍历和处理的步骤如下:
-
初始
i = 0
,遍历到j = 0
,元素4
没有在散列表中,保留4
:L.data[0] = 4
,i++
->i = 1
-
遍历到
j = 1
,元素3
没有在散列表中,保留3
:L.data[1] = 3
,i++
->i = 2
-
遍历到
j = 2
,元素1
没有在散列表中,保留1
:L.data[2] = 1
,i++
->i = 3
-
遍历到
j = 3
,元素2
没有在散列表中,保留2
:L.data[3] = 2
,i++
->i = 4
-
遍历到
j = 4
,元素5
没有在散列表中,保留5
:L.data[4] = 5
,i++
->i = 5
-
遍历到
j = 5
,元素3
已经在散列表中,跳过。 -
遍历到
j = 6
,元素2
已经在散列表中,跳过。 -
遍历到
j = 7
,元素1
已经在散列表中,跳过。 -
遍历到
j = 8
,元素5
已经在散列表中,跳过。 -
遍历到
j = 9
,元素6
没有在散列表中,保留6
:L.data[5] = 6
,i++
->i = 6
最终结果:L
变为 {4, 3, 1, 2, 5, 6}
,长度为 6。