6-15 线性表元素的区间删除 (20分)

给定一个顺序存储的线性表,请设计一个函数删除所有值大于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元素可以通过>、==、<进行比较;minDmaxD分别为待删除元素的值域的下、上界。函数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 

思想:你不想要的东西,直接复制剩下你需要的,组成一个新的顺序表,把原有的顺序表覆盖掉;当然,表长也要改变。

这里,准备一套直接能运行的代码

#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;
}

/* 你的代码将被嵌在这里 */

List ReadInput(){
     List L;
     int n;
     scanf("%d", &n);
     for(int i = 0; i < n; i++){
         scanf("%d",&L->Data[i]);
       }
     L->Last = n;
	 return L;
 }
void PrintList( List L )
{
	int i;
	for(i = 0; i <L->Last; i++)
	{
		printf("%d ",L->Data[i]);
	}
	printf("\n");
}

List Delete( List L, ElementType minD, ElementType maxD )
{
	int i,p;
	for(i = 0,p = 0; i <= L->Last ;i++)
	{
		if(L->Data[i] <= minD||L->Data[i] >= maxD)
		{
			L->Data[p++] = L->Data[i];
		}
		
	}
	L->Last = p-1;
	return L;
}

 就是有一个地方不太明白,为什么我的ReadInput函数和PrintList函数都是从i读到Last-1而Delete函数要从i读到Last才能过。。

发布了184 篇原创文章 · 获赞 27 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_37618760/article/details/104206073