题目:
给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储,并且相对位置不能改变。
函数接口定义:
List Delete( List L, ElementType minD, ElementType maxD );
其中List
结构定义如下:
typedef int Position;
typedef struct LNode *List;
struct LNode {ElementType Data[MAXSIZE];Position Last; /* 保存线性表中最后一个元素的位置 */
};
L
是用户传入的一个线性表,其中ElementType
元素可以通过>、==、<进行比较;minD
和maxD
分别为待删除元素的值域的下、上界。函数Delete
应将Data[]
中所有值大于minD
而且小于maxD
的元素删除,同时保证表中剩余元素保持顺序存储,并且相对位置不变,最后返回删除后的表。
裁判测试程序样例:
#include <stdio.h>#define MAXSIZE 20
typedef int ElementType;typedef int Position;
typedef struct LNode *List;
struct LNode {ElementType Data[MAXSIZE];Position Last; /* 保存线性表中最后一个元素的位置 */
};List ReadInput(); /* 裁判实现,细节不表。元素从下标0开始存储 */
void PrintList( List L ); /* 裁判实现,细节不表 */
List Delete( List L, ElementType minD, ElementType maxD );int main()
{List L;ElementType minD, maxD;int i;L = ReadInput();scanf("%d %d", &minD, &maxD);L = Delete( L, minD, maxD );PrintList( L );return 0;
}/* 你的代码将被嵌在这里 */
输入样例:
10
4 -8 2 12 1 5 9 3 3 10
0 4
输出样例:
4 -8 12 5 9 10
先上错误代码
List Delete( List L, ElementType minD, ElementType maxD )
{int i,k,h=MAXSIZE;for(i=0;i<h;i++){if(L->Data[i]>minD&&L->Data[i]<maxD){for(k=i;k<h;k++){L->Data[k]=L->Data[k+1]; }h--;}}L->Last=L->Data+h-1;return L;
}
跟之前的那个题一样也是向前移动,还不知道具体错因。
1-4 数组元素的区间删除 (20 分)
https://blog.csdn.net/BQDQSZ/article/details/100164636
struct LNode {ElementType Data[MAXSIZE];Position Last; /* 保存线性表中最后一个元素的位置 */
};
这个结构体包含了一个int数组和一个整数;
typedef struct LNode *List;
List L;
这两句又表明这道题中是想让你用结构体指针L
来访问结构体成员:int数组。
1-4 数组元素的区间删除 ,借助了一个新数组。这里就直接用一个新的结构体,然后返回他的地址给L
即可。
但是改完后还是不对,费解。
List Delete( List L, ElementType minD, ElementType maxD )
{struct LNode b;int k=0 ;for(int i=0;i< MAXSIZE;i++){if(L->Data[i]<=minD||L->Data[i]>=maxD){b.Data[k]=L->Data[i];k++; }}b.Last=k-1;return (&b);//错误,函数调用完成后,&b所指的那块存储空间已经物是人非了!!!!!!!!
}
我找到错因了,和之前的某道题一样:忘了局部变量在函数调用完成后就不存在了,所以返回的地址不是指向结构体的。应该使用动态分配。
修改后(20分):
List Delete( List L, ElementType minD, ElementType maxD )
{struct LNode *B;B=(struct LNode *)malloc(sizeof(struct LNode ));//!!!!!!!!!int i,k=0 ;for( i=0;i<=L->Last;i++){if(L->Data[i]<=minD||L->Data[i]>=maxD){B->Data[k]=L->Data[i];k++; }}B->Last=k-1;return (B);
}
还有这种思路我想不到(正确答案):
List Delete( List L, ElementType minD, ElementType maxD )
{int i,count=0;for(i=0;i<=L->Last;i++){if(L->Data[i]<maxD&&L->Data[i]>minD)//若当前元素在区间内,count+1 count++;elseL->Data[i-count]=L->Data[i];/*若当前元素不在区间内,把当前元素向前移动count单位,并替换Data[i-count]*/ }L->Last=L->Last-count;return L;
}