给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储,并且相对位置不能改变。
函数接口定义:
int Delete( int A[], int L, int minA, int maxA );
其中A是整型数组,存储原始线性表的元素;L是表长,即A中元素的个数;minA和maxA分别为待删除元素的值域的下、上界。函数Delete应将A中所有值大于minA而且小于maxA的元素删除,同时保证表中剩余元素保持顺序存储,并且相对位置不变,最后返回删除后的表长
#include
#define MAXN 20
int Delete( int A[], int L, int minA, int maxA );
int main()
{
int A[MAXN], L, minA, maxA, i;
scanf("%d", &L);
for (i=0; i"%d", &A[i]);
scanf("%d %d", &minA, &maxA);
L = Delete(A, L, minA, maxA);
for (i=0; i"%d ", A[i]);
printf("\n");
return 0;
}
int Delete( int A[], int L, int minA, int maxA )
{
int i=0,j,k,d;
while(i[i]while(j[j]if(d==0)
return 0;
else
{
for(k=j;k[k-d]=A[k];
}
L=L-d;
}
运行不出来,求指正。
i是小于min的索引
j是小于max的索引
如果j和i相等,说明min和max相等,那就不应该删表
表长度不变才对,你return 0是几个意思?
后面应该从i到j之间的删掉,你循环k=j又是要干啥
修改如下,改动处见注释,供参考:
#include <stdio.h>
#define MAXN 20
int Delete(int A[], int L, int minA, int maxA);
int main()
{
int A[MAXN], L, minA, maxA, i;
scanf("%d", &L);
for (i = 0; i < L; i++) scanf("%d", &A[i]);
scanf("%d %d", &minA, &maxA);
L = Delete(A, L, minA, maxA);
for (i = 0; i < L; i++)
printf("%d ", A[i]);
printf("\n");
return 0;
}
int Delete(int A[], int L, int minA, int maxA)
{
int i = 0, j, k, d;
while (i < L && A[i] <= minA)//while (i < L && A[i] < minA) 修改
i++;
j = i;
while (j < L && A[j] < maxA)
j++;
d = j - i;
if (d != 0) // 修改
{
while (j < L)//for (k = j; k < L; k++) 修改
A[i++] = A[j++]; // 修改
L -= d; //L = L - d;
}
return L; //return 0; 修改
}