线性表的实现,如何增删特定元素

问题如下:

img

效果如图:

img

实现要求:
用静态线性列表实现(可用循环,但是不能直接打印!)
不能这样:

  ElemType Array[20] = { 1,2,3,4,5,6,7,8,9,10,10,9,8,7,6,5,4,3,2,1 };

 for (int i = 1; i <= 20; i++)
    ListInsert(my_List2, i, Array[i - 1]);

除此之外其他方法都可
列表打印输出和增删元素框架已经实现
如下:
Arraylist.h

#include <iostream>
using namespace std;

#define MaxSize 100

typedef int ElemType; //声明元素类型

typedef struct {
  ElemType data[MaxSize]; //存放顺序表数据
  int length;
} SqList; // SqList为用户定义的顺序表类型

//初始化空顺序表
void InitList(SqList &L);

//判断顺序表是否为空
bool ListEmpty(SqList L);

//求出顺序表长度
int ListLength(SqList L);

//向顺序表指定位置插入一个新元素
bool ListInsert(SqList &L, int pos, ElemType item);

//从顺序表中删除第一个与指定值匹配的元素
bool ListDelete(SqList &L, int pos, ElemType &item);

//获取顺序表中指定位置上的数据元素
bool GetElem(SqList L, int pos, ElemType &item);

//从顺序表中查找元素,返回第一个与指定值匹配元素位置
int Find(SqList L, ElemType item);

//遍历输出顺序表
void TraverseList(SqList L);

Arraylist.cpp

#include "ArrayList.h"

//初始化空顺序表
void InitList(SqList &L)
{
  L.length = 0;
}

//判断顺序表是否为空
bool ListEmpty(SqList L)
{
  if (L.length == 0)
    return true;
  else
    return false;
}

//求出顺序表长度
int ListLength(SqList L)
{
  return L.length;
}

//向顺序表指定位置插入一个新元素
bool ListInsert(SqList &L, int pos, ElemType item)
{ //pos为插入的(逻辑)位置,item为待插入的数据元素
  int i;
  if (L.length == MaxSize) { //判表满
    cout << "顺序表满,无法插入!" << endl;
    return false;
  }
  if (pos < 1 || pos > L.length + 1) { //判位置
    cout << "插入位置无效!" << endl;
    return false;
  }
  for (i = L.length - 1; i >= pos - 1; i--) //向后移动元素
    L.data[i + 1] = L.data[i];
  L.data[pos - 1] = item; //插入
  L.length++; //表长增一
  return true;
}

//从顺序表中删除指定位置的元素
bool ListDelete(SqList &L, int pos, ElemType &item)
{ //pos为删除的(逻辑)位置,用item返回被删元素
  int i;
  if (ListEmpty(L)) { //判表空
    cout << "顺序表为空表,无法删除!" << endl;
    return false;
  }
  if (pos < 1 || pos > L.length) { //判位置
    cout << "删除位置无效!" << endl;
    return false;
  }
  item = L.data[pos - 1]; //删除元素前,把元素的值通过指针传递给外部,备用
  for (i = pos; i < L.length; i++) //向前移动元素
    L.data[i - 1] = L.data[i];
  L.length--; //表长减一
  return true;
}

//获取顺序表中指定位置上的数据元素
bool GetElem(SqList L, int pos, ElemType &item)
{ //pos为指定位置,item用于返回找到的数据元素
  if (ListEmpty(L))
    return false;
  if (pos < 1 || pos > L.length) {
    cout << "位置无效" << endl;
    return false;
  }
  item = L.data[pos - 1]; //把元素的值通过指针传递给外部
  return true;
}

//从顺序表中查找元素,返回第一个与指定值匹配元素位置
int Find(SqList L, ElemType item)
{ //item为待查找的数据元素
  int i = 0; // i表示当前查找的位置,从头开始
  if (ListEmpty(L)) {
    cout << "顺序表为空表,无法查找!" << endl;
    return 0;
  }
  //从头到尾比较顺序表中的元素,当未超出顺序表的末尾,且未找到时,i向后移
  while (i < L.length && L.data[i] != item)
    i++;
  if (i < L.length) //如果未超出顺序表的末尾,说明找到
    return i + 1; //返回逻辑位置
  else
    return 0; //超出顺序表的末尾,则说明找不到
}

//遍历输出顺序表
void TraverseList(SqList L)
{
  int i;
  for (i = 0; i < L.length; i++) //从头到尾输出顺序表的每一个元素
    cout << L.data[i] << "  ";
  cout << endl;
}

main.cpp

#include "ArrayList.h"

int main()
{
  SqList my_List1, my_List2; //定义顺序表SqList类型的变量
  //ElemType Array[20] = { 1,2,3,4,5,6,7,8,9,10,10,9,8,7,6,5,4,3,2,1 };
  /*for (int i = 0; i < 10; i++)
      Array[i] = i+1;*/
  //初始化顺序表
  InitList(my_List1);
  InitList(my_List2);

  //向顺序表的指定位置插入数据
  ListInsert(my_List1, 1, 89);
  ListInsert(my_List1, 1, 77);
  ListInsert(my_List1, 3, 66);
  ListInsert(my_List1, 1, 2);
  ListInsert(my_List1, 1, 39);
  ListInsert(my_List1, 1, 27);

  //for (int i = 1; i <= 20; i++)
  //  ListInsert(my_List2, i, Array[i - 1]);

  //输出顺序表元素
  cout << "my_list1:";
  TraverseList(my_List1);
  cout << "my_list2:";
  TraverseList(my_List2);

  return 0;
}

求解,谢谢

【以下回答由 GPT 生成】

  1. 实现在指定位置插入元素的功能: 通过判断插入位置是否合法,然后将插入位置及之后的所有元素依次后移一位,将待插入的元素放入指定位置即可。代码如下:
bool ListInsert(SqList &L, int pos, ElemType item) {
    if (pos < 1 || pos > L.length + 1) {
        return false;
    }
    if (L.length >= MaxSize) {
        return false;
    }
    for (int i = L.length; i >= pos; i--) {
        L.data[i] = L.data[i - 1];
    }
    L.data[pos - 1] = item;
    L.length++;
    return true;
}
  1. 实现删除指定位置的元素的功能: 通过判断删除位置是否合法,然后将删除位置及之后的所有元素依次前移一位,将被删除的元素返回即可。代码如下:
bool ListDelete(SqList &L, int pos, ElemType &item) {
    if (pos < 1 || pos > L.length) {
        return false;
    }
    item = L.data[pos - 1];
    for (int i = pos - 1; i < L.length - 1; i++) {
        L.data[i] = L.data[i + 1];
    }
    L.length--;
    return true;
}
  1. 实现打印输出列表的功能: 通过遍历顺序表中的元素,将每个元素依次输出即可。代码如下:
void PrintList(SqList L) {
    for (int i = 0; i < L.length; i++) {
        cout << L.data[i] << " ";
    }
    cout << endl;
}

对于已经实现的使用示例方法,其中的ListInsert函数调用存在问题,参数中的my_List2并未在问题中给出,因此无法确定如何修改该示例方法的调用。需要提供my_List2的定义或者修改示例方法的调用部分。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^