目录
一、删除最小值
输入包含两行,第一行是顺序表元素个数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;
}
三、删除区间元素(无序表)
从顺序表中删除其值在给定值s
与t
之间(要求s≤t
)的所有元素,若s
或t
不合理或顺序表为空,则显示出错信息。输入包含三行,第一行是顺序表元素个数n
,接下来1行是顺序表中的n
个元素,最后一行是给定值s
和t
。 输出一行:为顺序表中的所有元素(没有为空)。
测试输入:
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;
}