No Code(睡觉版) 2024-02-27 00:27 采纳率: 33.3%
浏览 7
已结题

这里的删除算法哪里出问题了啊?使用删除算法后得不出正确的值

这里的删除算法哪里出问题了啊?使用删除算法后得不出正确的值


/*线性表*/
/*顺序表——顺序存储结构*/
#include<iostream>
using namespace std;
#define maxsize 100
typedef struct //定义顺序表的结构体
{
    int data[maxsize];//存放顺序表元素的数组,默认是int型,可根据题目要求将int换成其他类型
    int length;//存放顺序表的长度
}Sqlist;
/*
顺序表的基本操作:
1、InitList(&L);//初始化操作,建立一个空的线性表;(因为涉及原表数据需要作改动,所以使用引用的方法&L)
2、DestroyList(&L);//销毁已存在的线性表L(引用原表)
3、ClearList(&L);//将线性表清空(问:为什么会涉及引用?和销毁表有什么区别吗?)
4、ListInsert(&L,i,e);//在线性表L的i位置插入e元素(问:为什么此处e不用引用)
5、ListDelete(&L,i,&e);//删除线性表L的i位置的e元素,返回e(问:为什么e也要引用?,元素直接删除不就行了,引用是为了干啥)
6、IsEmpty(L);//bool类型的函数,如果L为空则返回true,否则返回false
7、ListLength(L);//返回线性表L的元素个数
8、LocateElem(L,e);//按值查找,在L中查找与给定值e相等的元素,若成功返回该元素在表中的序号,否则返回0
9、GetElem(L,i,&e);//按位查找,将L中的第i个位置元素返回给e
*/

/*
顺序表的删除:
线性表的删除操作是指将表的第i(1<=i<=n)个结点删除使长度为n的线性表(a1,...,ai-1,ai,ai+1,...,an)变成长度为n-1的线性表(a1,...,ai-1,ai+1,...,an)
算法思想:
①判断删除位置i是否合法(合法值为1<=i<=n)
②将与删除的元素保留在e中
③将第i+1至第n位的元素依此向前移动一个位置
④表长减一,删除成功返回OK
*/

/*int ListDelete(Sqlist L, int i, int& e)//操作:删除操作
{
    if ((i < 1) || (i > L.length))//1、判断删除位置i是否合法
        return false;
    e = L.data[i];
    for (int j=i;j <= L.length-1;j++)//2、将第i+1至第n位的元素依次向前移动一个位置
    {
        e = L.data[i];
        L.data[j-1] = L.data[j];
        L.length--;//3、表长减一,删除成功返回OK
    }
    return e;
}
//时间复杂度:n-1/2(O(n))
*/

/*
顺序表的插入:
线性表的插入运算是指在表的第i(1<=i<=n+1)个位置上,插入一个新结点e,使长度为n的线性表(a1,...,ai-1,ai,...,an)变成长度为n+1的线性表(a1,...,ai-1,e,ai,...,an)变成长度为n+1的线性表(a1,...,ai-1,e,ai,...,an)
算法思想:
①判断插入位置i是否合法
②判断顺序表的存储空间是否已满,若已满返回ERROR
③将第n至第i位的元素依次向后移动一个位置,空出第i个位置
*/
int ListInsert(Sqlist &L, int i, int e)//操作:插入操作——在i位置插入e元素(问:i,e是否都是用户给出的数值?)
{
    if (i<1 || i>L.length + 1)//判断插入位置是否合法
        return false;
    if (L.length == maxsize)//判断存储空间是否为满
        return false;
    for (int j = L.length - 1;j >= i - 1;j--)//注意此处j为L.length-1,且插入是倒着插
        L.data[j + 1] = L.data[j];
    L.data[i - 1] = e;
    L.length++;
    return true;
}
int InitList(Sqlist &L) //构造一个空的顺序表L;
{
    L.length = 0;
    return true;
}
int ListDelete(Sqlist &L, int i)//操作:删除算法
{
    if ((i<1)||(i>L.length))//判断删除位置是否合法
        return false;
    for (int j = i;j < L.length-1;j++)//注意此处j<L.length-1,且删除是顺着往前挪
    {
        L.data[j-1] = L.data[j];
        L.length--;
    }
    return true;
}
int GetElem(Sqlist L,int a,int &e) //操作:按位查找——在线性表中查找i位置的元素,返回给e
{
    e = L.data[a];
    return e;
}
int LocateElem(Sqlist L, int e)//操作:按值查找——在线性表L中查找值为e的数  
{
    int i =0 ;
    for (int i = 0;i < L.length;++i)
    {
        if (e == L.data[i]) 
            return i;
    }
    return i;
}
int Getlength(Sqlist L)//操作:获得线性表的长度
{
    return(L.length);
}
int main()
{
    Sqlist L;
    /*
    int a = 0;
    int i = 0;
    L.length = 10;
    std::cout << "第一次赋值操作后:";
    for (int i = 0;i < 10; i++) //线性表的数组赋值
    {
        L.data[i] = i;
        std::cout << L.data[i];
    }
    ListInsert(L,2,6);
    std::cout << "第一次数组长度为:"<<L.length<<endl;
    std::cout << "第一次插入操作后:" ;
    for (int i = 0;i < 10; i++) //线性表的数组赋值
    {
        std::cout<< L.data[i];
    }
    std::cout << "第二次数组长度为:" <<L.length<<endl;
    ListDelete(L, 3);
    std::cout << "第一次删除操作后:";
    for (int i = 0;i < 10; i++) //线性表的数组赋值
    {
        std::cout<< L.data[i];
    }
    std::cout << "第三次数组长度为:" <<L.length<<endl;
    */
    InitList(L);
    ListInsert(L, 1, 1);
    ListInsert(L, 2, 2);
    ListInsert(L, 3, 3);
    ListInsert(L, 4, 4);
    ListInsert(L, 5, 5);
    for (int i = 0;i < L.length; i++) //线性表的数组赋值
    {
        std::cout << L.data[i];
    }
    std::cout << "第一次插入操作后数组长度为:" <<Getlength(L)<<endl;
    ListDelete(L, 1);
    for (int i = 0;i < L.length; i++) //线性表的数组赋值
    {
        std::cout << L.data[i];
    }
    std::cout << "第二次删除操作后数组长度为:" <<Getlength(L)<< endl;
    return 0;
}
  • 写回答

5条回答 默认 最新

  • GISer Liu 2024-02-27 00:28
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    问题分析:

    1. 删除算法中的循环条件和逻辑错误。
    2. 删除算法中未正确更新表的长度。
    3. 插入算法中未正确处理数组元素的移动。
    4. 按位查找函数中返回值错误。
      解决方案:
    5. 删除算法中的循环条件应该是 j < L.length,因为删除元素后,表的长度已经减少,所以循环条件应该是小于当前长度而不是长度减一。
    6. 在删除算法中,应该先将要删除的元素移出,然后再将后面的元素向前移动,最后更新表的长度。
    7. 插入算法中,在移动元素时应该从后往前移动,而不是从前往后。因为我们需要空出位置给新元素。
    8. 按位查找函数中,返回值应该是 i + 1 而不是 i,因为题目要求是序号,序号从1开始。
      以下是修改后的代码:
      cppCopy code
      int ListDelete(Sqlist &L, int i)//操作:删除算法
      {
      if ((i < 1) || (i > L.length))//判断删除位置是否合法
      return false;
      for (int j = i - 1; j < L.length - 1; j++) //注意此处j<L.length-1,且删除是顺着往前挪
      {
      L.data[j] = L.data[j + 1];
      }
      L.length--; // 更新表的长度
      return true;
      }
      int ListInsert(Sqlist &L, int i, int e)//操作:插入操作——在i位置插入e元素
      {
      if (i < 1 || i > L.length + 1)//判断插入位置是否合法
      return false;
      if (L.length == maxsize)//判断存储空间是否为满
      return false;
      for (int j = L.length - 1; j >= i - 1; j--)//注意此处从后往前移动元素
      {
      L.data[j + 1] = L.data[j];
      }
      L.data[i - 1] = e;
      L.length++;
      return true;
      }
      int LocateElem(Sqlist L, int e)//操作:按值查找——在线性表L中查找值为e的数
      {
      int i = 0;
      for (int i = 0; i < L.length; ++i)
      {
      if (e == L.data[i])
      return i + 1; // 返回序号应该加1
      }
      return 0;
      }
      
      这些修改应该能够解决你提到的问题。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月6日
  • 已采纳回答 2月27日
  • 创建了问题 2月27日

悬赏问题

  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题