阿树阿 2024-10-04 21:57 采纳率: 0%
浏览 140
已结题

顺序表的删除PTA函数题

PTA函数题
6-1-4 顺序表的删除
分数 10
作者 YJ
单位 西南石油大学
给定一个顺序存储的线性表,请设计一个函数删除所有值小于min和值大于max的元素。删除后表中剩余元素保持顺序存储,并且相对位置不能改变。

函数接口定义:
List Delete( List &L, ElementType minD, ElementType maxD );
L是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较。函数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 Delete( List &L, ElementType minD, ElementType maxD );
List ReadInput(); 
{
   int num,i,temp;
   scanf(“%d”,&num);
   for(i=0;i<num;i++)
{
    scanf(“%d”,&(L->Data[num]));
}
L->last = num-1;
}
void PrintList( List L ); 
{
     for(int i=0;i<=L->last;i++)
     {
          printf(“%d ”,L->Data[i]);
}
}

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 2 1 3 3 

请问一下这个怎么做,为什么不写提交也是段错误?

LNode* Delete(LNode* &L,int minD,int maxD)
{
    
    int k=0;
    for(int i=0;i<=L->last;i++)
    {
        if(L->Data[i]>=minD&&L->Data[i]<=maxD)
        {
            L->Data[k++]=L->Data[i];
        }
    }
    L->last=k-1;
    return L;
}
写了这个也是段错误

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-10-04 21:58
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    这段代码中存在几个问题,导致了段错误(segmentation fault)。我将逐一解释并给出修正建议。

    问题一:数组越界访问 在你的代码中,删除操作完成后,你应该更新线性表的长度 L->last,但是你在遍历过程中使用了 i <= L->last 作为循环条件,这可能导致访问到 L->Data[L->last+1] 这个位置,超出了数组的界限,引发段错误。由于线性表的最后一个元素的有效索引是 L->last,所以循环条件应该是 i < L->last

    问题二:未处理输入数据不完整的情况 在提供的代码片段中,函数 Delete 没有考虑输入数据不完整的情况,例如在调用 ReadInput 函数之后没有对返回值进行验证或错误处理。如果输入的线性表为空或输入的数目不正确,可能会导致段错误或其他问题。因此,应该在调用 Delete 函数之前添加必要的验证和错误处理逻辑。

    修正后的代码示例如下:

    LNode* Delete(LNode* &L, int minD, int maxD) {
        if (L == nullptr || L->last == -1) { // 判断线性表是否为空或未初始化
            return nullptr; // 返回空指针表示处理失败
        }
        
        int k = 0; // 用于记录有效元素的索引位置
        for (int i = 0; i < L->last; i++) { // 修改循环条件为 i < L->last
            if (L->Data[i] >= minD && L->Data[i] <= maxD) { // 判断元素是否在指定范围内
                L->Data[k++] = L->Data[i]; // 将有效元素移动到前面位置并保持顺序不变
            }
        }
        L->last = k - 1; // 更新线性表的长度
        return L; // 返回更新后的线性表指针
    }
    

    请注意,这段代码只是示例代码的一部分,完整的实现还需要包括输入读取和打印输出的函数,以及对线性表的其他相关操作进行正确处理。另外,该代码片段中没有考虑溢出情况,即当删除操作后剩余元素数量超过数组最大容量时的情况。在实际应用中,应该添加相应的错误处理和边界检查来确保程序的健壮性。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月17日
  • 创建了问题 10月4日