#include <stdio.h>
#include <stdlib.h>

/*
要写很长代码的时候一定要采用增量编写法
*/

#define MaxSize 50
typedef int ElemType;//顺序表中数据元素的类型
//静态分配
typedef struct {
  ElemType data[MaxSize];//定义的数组,用来存元素
  int length;//当前顺序表中有多少个元素
}SqList;

//插入  i代表插入的位置,从1开始,e要插入的元素
bool ListInsert(SqList& L, int i, ElemType e)
{
  if (i<1 || i>L.length + 1)//判断要插入的位置是否合法
  {
    return false;
  }
  if (L.length >= MaxSize)//超出空间,元素存储的总空间溢出
  {
    return false;
  }
  for (int j = L.length; j >= i; j--)//移动顺序表中的元素
  {
    L.data[j] = L.data[j - 1];
  }
  L.data[i - 1] = e;//数组下标从零开始,插入第一个位置,访问的下标为0
  L.length++;
  return true;//插入成功返回true
}


//删除   使用元素e的引用的目的是为了拿出对应的值
bool ListDelete(SqList& L, int i, ElemType& e)
{
  if (i<1 || i>L.length + 1)//判断要插入的位置是否合法
  {
    return false;
  }
  if (L.length == 0) {//顺序表中没有元素,无需删除
    return false;
  }
  e = L.data[i - 1];//获取顺序表中对应的元素,赋值给e
  for (int j = i; j < L.length; j++)//从i的位置依次把元素往前覆盖 
  {
    L.data[j - 1] = L.data[j];
  }
  L.length--;//删除一个元素,顺序表长度减1
  return true;

}


//查找  查找成功,返回位置,位置从1开始,查找失败,返回0(假)
int LocateElem(SqList L, ElemType e)
{
  int i;
  for (i = 0; i < L.length; i++)
  {
    if (L.data[i] == e)//遍历顺序表
    {
      return i + 1;//加1就是元素在顺序表中的位置
    }
  }
  return 0;
}


//打印顺序表元素
void PrintList(SqList& L)
{
  for (int i = 0; i < L.length; i++)
  {
    printf("%3d", L.data[i]);//%3d表示接收到的整型元素占三个空格
  }
  printf("\n");
}


int main()
{
  SqList L;//顺序表的名称
  bool ret;//查看返回值,布尔型的值为True或False
  ElemType del;//用来存储要删除的元素
  //首先手动在顺序表中前三个元素赋值
  L.data[0] = 1;
  L.data[1] = 2;
  L.data[2] = 3;
  L.length = 3;//总计三个元素

  //插入操作
  ret = ListInsert(L, 2, 60);//往第二个位置插入60这个元素
  if (ret)
  {
    printf("插入成功\n");
    PrintList(L);//打印成功后的顺序表
    printf("\n\n\n");
  }
  else {
    printf("插入失败\n");
  }

  //删除操作
  ret = ListDelete(L, 1, del);//删除第一个位置的元素,并把元素值输出
  if (ret)
  {
    printf("删除成功\n");
    printf("删除元素值为 %d\n", del);
    PrintList(L);
    printf("\n\n\n");
  }
  else {
    printf("删除失败\n");
  }

  //查找操作
  int elem_pos;
  elem_pos = LocateElem(L, 3);
  if (elem_pos)
  {
    printf("查找成功\n");
    printf("元素位置为 %d\n", elem_pos);
  }
  else {
    printf("查找失败\n");
  }
  return 0;
}