一、与线性表相关的删除操作
1、从线性表中删除具有最小值的元素,并由函数返回被删除元素的值,空出的位置由最后一个元素填补
# define MaxSize 50
// 顺序表类型定义
typedef struct SqList{
ElemType data[MaxSize];
int length;
}SpList;
/*算法思想: 搜索整个顺序表,查找最小元素并记住其位置,搜索结束后用最后一个元素填补空出的最小值的位置 */
// 删除最小元素
bool Del_min(SpList &L, ElemType &value) {
if(L.length == 0){
return false; // 表空,返回false
}
value = L.data[0]; // 假设第一个位置就是最小值
int pos = 0 ; // 0 号元素值最小
for(int i = 1;i<L.length;i++){ // 遍历顺序表,寻找最小值的元素
if(L.data[i]<value){
value = L.data[i];
pos = i;
}
}
L.data[pos] = L.data[L.length-1]; // 让最后一个元素填补空位
L.length--; // 表长 -1
return true;
}
2、删除线性表中所有值为 x 的元素
# define MaxSize 50
// 顺序表类型定义
typedef struct SqList{
ElemType data[MaxSize];
int length;
}SpList;
/*算法思想:遍历顺序表,将不是 x 的元素保留下来 (删除所有 x 的元素)*/
void del_X(SqList &L,ElemType x){
int k = 0; // 用来记录值不等于 x 的个数
for(int i = 0;i<L.length;i++){ // 遍历顺序表
if(L.data[i] != x){
L.data[k] = L.data[i]; // 将不等于x的元素保留下来
k++;
}
}
L.length = k; // 顺序表的长度 = k
}
3、从顺序表中删除其值在给定值 x ~ t 之间的所有元素(x<t)
# define MaxSize 50
// 顺序表类型定义
typedef struct SqList{
ElemType data[MaxSize];
int length;
}SpList;
// 方法一、
/*算法思想:将L.data[i] < s 和L.data[i] > t 的元素保留 */
bool Del_s_t(SqList &L,ElemType s,ElemType t){
if(L.length == 0|| s>t){ // 如果顺序表为空,返回false
return false;
}
int k = 0; // 保存值小于 s ,值大于 t 的元素个数
for(int i = 0;i<L.length;i++){
if(L.data[i]<s || L.data[i] >t){
L.data[k] = L.data[i];
k++;
}
}
L.length = k;
return true;
}
// 方法二、
/*算法思想:扫描顺序表,将位于 s~t 之间数的个数记为 k 个,将不是s~t之间的数向前移 k 个单位*/
bool Del_s_t(SqList &L,ElemType s,ElemType t){
if(L.length == 0 || s>t){ // 如果顺序表为空,返回false
return false;
}
int k = 0; // 保存值小于 s ,值大于 t 的元素个数
for(int i = 0;i<L.length;i++){
if(L.data[i] >=s && L.data[i] <=t){
k++;
}
else{
L.data[i-k] = L.data[i]; // 将元素移动k个单位
}
}
L.length = L.length - k;
return true;
}
4、从有序表中,删除所有值重复的元素
# define MaxSize 50
// 顺序表类型定义
typedef struct SqList{
ElemType data[MaxSize];
int length;
}SpList;
/*算法思想:第一个元素肯定不重复,两个指针 i,j 依次向后扫描,元素不重复就保留,重复的元素不保留*/
bool Delete_same(SqList &L){
if(L.length == 0){ // 如果顺序表为空,返回false
return false;
}
int i; // 存储第一个不重复元素
int j; // 遍历线性表指针
for(i = 0,i = 1;j<L.length;j++){
if(L.data[i] != L.data[j]){
//i++;
//L.data[i] = L.data[j];
L.data[++i] = L.data[j]; // 将不重复的元素保留
}
}
L.length = i+1;
return true;
}