数据结构代码题--与线性表的相关删除操作

一、与线性表相关的删除操作

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; 
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XUN~MLF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值