线性表-顺序表删除元素的一些基本操作

目录

一、删除最小值

二、删除指定元素

三、删除区间元素(无序表)

四、删除重复元素(有序表)


一、删除最小值

输入包含两行,第一行是顺序表元素个数n,第二行是顺序表中的n个元素。 输出分两种情况:

一、包含两行,第一行为顺序表的最小值,第二行为顺序表中的所有元素(没有为空),把最小值删除并用顺序表的最后一个值替换。

二、若顺序表为空,则输出“Data Error”。

测试输入:

5

1 2 3 4 5

预期输出:

1

5 2 3 4

测试输入: 0

预期输出: Data Error

测试输入:

1

1

预期输出: 1

#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef struct{
	int length;
	int *base;
}SeqList;
Status Init(SeqList &L)
{
	L.base = new int[MAXSIZE];
	if(!L.base) return ERROR;
	L.length = 0;
	return OK;
}
Status Create(SeqList &L, int n)
{
	for(int i = 0; i < n; i ++)
		cin >> L.base[i];
	L.length = n;
	return OK;
}
bool Del_Min(SeqList &L, int &value)
{
    int min = L.base[0], t = 0, i;
    if(L.length == 0) return false;//如果链表为空,返回报错
    for(int i = 1; i < L.length; i ++)//循环遍历查找最小值
    {
        if(L.base[i] < min)//检测到当前值比min还小
        {
            min = L.base[i];//重新赋值min
            t = i;//相应记录下最小值的位置,方便后续删除
        }
    }
    value =  L.base[t]; //把最小值赋给value返回主函数
    if(i == L.length - 1) L.length --;
    else {
        L.base[t] = L.base[L.length-1];//把最小值用顺序表 最后一个值替换
        L.length --;
    }
    return 1;
}
void Show(SeqList L)
{
	for(int i = 0; i < L.length; i ++)
		cout << L.base[i] << ' ';
	cout << endl;
}
int main()
{
	SeqList L;
	Init(L);
	int n;
	cin >> n;
	Create(L, n);
	int value;
	bool flag = Del_Min(L, value);
	if(flag)
	{
		cout << value << endl;
		Show(L);
	}
	else
		cout << "Data Error" << endl;
	
	return 0;
}

二、删除指定元素

输入包含三行,第一行是顺序表元素个数n,接下来1行是顺序表中的n个元素,最后一行是待删的元素x。 输出一行:为顺序表中的所有元素(没有为空)。

测试输入:

5

1 1 3 4 5

1

预期输出: 3 4 5

#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef struct{
	int length;
	int *base;
}SeqList;
Status Init(SeqList &L)
{
	L.base = new int[MAXSIZE];
	if(!L.base) return ERROR;
	L.length = 0;
	return OK;
}
Status Create(SeqList &L, int n)
{
	for(int i = 0; i < n; i ++)
		cin >> L.base[i];
	L.length = n;
	return OK;
}
bool Del_x(SeqList &L, int x)//删除指定元素
{
	for(int i = 0; i < L.length;)
	{
		if(L.base[i] == x)//判断是否等于指定元素
		{
			for(int j = i; j < L.length; j ++)
			{
				L.base[j] = L.base[j + 1];删除
			}
			L.length --;
		}
		else i ++;//具体为什么这样写请看第四个“删除重复元素”中的解释,原因类似
	}
	return 1;
	
}
void Show(SeqList L)
{
	for(int i = 0; i < L.length; i ++)
		cout << L.base[i] << ' ';
	cout << endl;
}
int main()
{
	SeqList L;
	Init(L);
	int n;
	cin >> n;
	Create(L, n);
	
	int x;
	cin >> x;
	Del_x(L, x);
	
	Show(L);
	
	return 0;
}

三、删除区间元素(无序表)

从顺序表中删除其值在给定值st之间(要求s≤t)的所有元素,若st不合理或顺序表为空,则显示出错信息。输入包含三行,第一行是顺序表元素个数n,接下来1行是顺序表中的n个元素,最后一行是给定值st。 输出一行:为顺序表中的所有元素(没有为空)。

测试输入:

5

1 3 4 1 5

1 3

预期输出:

4 5

#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef struct{
	int length;
	int *base;
}SeqList;
Status Init(SeqList &L)
{
	L.base = new int[MAXSIZE];
	if(!L.base) return ERROR;
	L.length = 0;
	return OK;
}
Status Create(SeqList &L, int n)
{
	for(int i = 0; i < n; i ++)
		cin >> L.base[i];
	L.length = n;
	return OK;
}
bool Del_st(SeqList &L, int s, int t)
{
	if(s > t) return false;//删除区间不合理,返回错误
	for(int i = 0; i <= L.length;)//遍历查找在s到t之间的元素
	{
		if(L.base[i] >= s && L.base[i] <= t)//判断元素的值是否在s和t之间
		{
			for(int j = i; j <= L.length; j ++)
			{
				L.base[j] = L.base[j + 1];//删除元素
			}
			L.length --;
		}
        else i ++;
	}
	return 1;
}
void Show(SeqList L)
{
	for(int i = 0; i < L.length; i ++)
		cout << L.base[i] << ' ';
	cout << endl;
}
int main()
{
	SeqList L;
	Init(L);
	int n;
	cin >> n;
	if(n == 0) cout << "Data Error";
	Create(L, n);
	
	int s, t;
	cin >> s >> t;
	int flag = Del_st(L, s, t);
	if(flag)
		Show(L);
	else
		cout << "Data Error" << endl;
	
	return 0;
}

四、删除重复元素(有序表)

输入包含两行,第一行是顺序表元素个数n,接下来1行是顺序表中的n个元素。 输出一行:为顺序表中的所有元素(没有为空)。

测试输入:

5

1 1 3 3 4

预期输出:

1 3 4

#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef struct{
	int length;
	int *base;
}SeqList;
Status Init(SeqList &L)
{
	L.base = new int[MAXSIZE];
	if(!L.base) return ERROR;
	L.length = 0;
	return OK;
}
Status Create(SeqList &L, int n)
{
	for(int i = 0; i < n; i ++)
		cin >> L.base[i];
	L.length = n;
	return OK;
}
bool Delete_Same(SeqList &L)
{
	if(L.length == 0) return false;
	for(int i = 0; i < L.length;)
	{
		if(L.base[i] == L.base[i + 1])//如果相邻两个元素相等, 执行完删除重复的元素以后i先不向后移, 
		//比如遇到1 1 1 1 1这样的测试数据, 应将留下来的那个与下一个继续进行比较,直到两个相邻的元素不相等,再把i向后移,即i ++
		{
			for(int j = i; j < L.length; j ++)
			{
				L.base[j] = L.base[j + 1];
			}
			L.length --;
		}
		else i ++;//若相邻两个不相等,则可以后移与下一个进行比较
	}
	return 1;
}
void Show(SeqList L)
{
	for(int i = 0; i < L.length; i ++)
		cout << L.base[i] << ' ';
	cout << endl;
}
int main()
{
	SeqList L;
	Init(L);
	int n;
	cin >> n;
	Create(L, n);
	
	int flag = Delete_Same(L);
	if(flag) Show(L);
	else cout << "Data Error" << endl;
	
	return 0;
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值