若一个线性表L采用顺序存储结构存储,其中所有的元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1)。
输入格式:
三行数据,第一行是顺序表的元素个数,第二行是顺序表的元素,第三行是x和y。
输出格式:
删除元素值在[x,y]之间的所有元素后的顺序表。
输入样例:
10
5 1 9 10 67 12 8 33 6 2
3 10
输出样例:
1 67 12 33 2
下面是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 10
#define OVERFLOW -1
typedef int ElemType;
typedef struct {
ElemType* elem;
int length;
}SqList;
void InitList(SqList& L);
void ListDelete(SqList& L, int i);
void ListPrint(SqList L);
int main()
{
SqList L;
InitList(L);
int n;
scanf("%d", &n);
L.length = n;
int i ;
for (i = 0; i < n; i++)
{
scanf("%d", &L.elem[i]);
}
int s, t;
scanf("%d %d", &s, &t);
if (t > s)
{
for (i = 0; i < L.length; i++)
{
if (L.elem[i] >= s && L.elem[i] <= t)
{
ListDelete(L, i);
i--;//删除一个结点,以后位置会提前一个
}
}
}
ListPrint(L);
}
void InitList(SqList& L)//创建一个空的顺序表
{
L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem)
exit(OVERFLOW);//内存分配失败
L.length = 0;
}
void ListDelete(SqList& L, int i)//删除元素
{
ElemType* p, * q;
if (i >= 0 && i < L.length)
{
p = &L.elem[i];
q = L.elem + L.length - 1;
for (; p <= q; p++)
*p = *(p + 1);
}
--L.length;
}
void ListPrint(SqList L)//打印顺序表
{
int i;
printf("%d",L.elem[0]);
for (i = 1; i < L.length; i++)
printf(" %d", L.elem[i]);
}
有什么不懂得地方欢迎私信问我,也欢迎大家指出问题。