题目
从顺序表中删除其值在给定值s与t之间(包含s和t,要求s<t)的所有元素。
如果或t不合理或顺序表为空,则显示出错信息并退出运行
算法思路
查找、移动
扫描顺序表,将s-t之间数的个数记为k,将不是s-t之间的数向前移动k个单位
代码
1、先写核心代码
2、将框架补充完整
bool Del_t(sqlist &L ,Elemtype s , Elemtype t){
int i = 0, k = 0;
if (L.length == 0 || s >= t)
retuen false;
for(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;
}
完整代码实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MaxSize 10//定义最大长度
int InitArr[10] = { 1,2,2,3,4,2,5,2,6,7 };
typedef struct {
int data[MaxSize];//用静态的数据存放数据元素
int length;//顺序表当前长度
}Sqlist;//顺序表的类型定义
void print(Sqlist* L)
{
for (int i = 0;i < L->length;i++)
{
printf("%d ", L->data[i]);
}
}
//初始化一个顺序表
void InitList(Sqlist* L)
{
for (int i = 0;i < MaxSize;i++)
{
L->data[i] = InitArr[i];//将所有数据元素设置为默认初始值
}
L->length = 10;//顺序表初始长度为0
}
//对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,
//该算法删除线性表中的所有值为x的数据元素
//算法思路
bool Del_t(Sqlist* L ,int s ,int t){
int i = 0, k = 0;
if (L -> length == 0 || s >= t)
return false;
for(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;
}
int main()
{
Sqlist L;
InitList(&L);//初始化一个顺序表:1,2,2,3,4,2,5,2,6,7
printf("初始顺序表为:");
print(&L);
printf("请输入2个值x进行删除操作:");
int a = 0 , b = 0;
scanf("%d %d", &a ,&b);
printf("\n");
Del_t(&L,a,b);
if(Del_t(&L,a,b) == true){
printf("删除所有值为x的元素后顺序表为:");
print(&L);
}
else
printf("Error");
return 0;
}