顺序表的操作

这里先定义个顺序表

#include <iostream>

using namespace std;

#define MAXSIZE 100

typedef struct{
  int *elems;
  int length;
  int size;
}Sqlist;

Sqlist list;

顺序表初始化

  • 定义bool类型函数 initList() ,初始化成功为true,失败为false
//初始化顺序表,创建一个空表
bool initList(Sqlist &L)    //L本身要改变所以为引用型
{
    L.elems = new int[MAXSIZE]; //为顺序表分配内存空间
    if(!L.elems) return false;  //存储分配失败返回false
  
    //分配成功则初始化
    L.length = 0;
    L.size = MAXSIZE;
    return true;                //成功并返回true
}
  • 定义函数 outputInfoList() 用于输出顺序表信息
//输出数据表信息
void outputInfoList(Sqlist &L)
{
    cout << "顺序表储存空间" << L.size << ",已经保存元素个数" << L.length << endl;
    for(int i = 0; i <= L.length - 1;i++){
        cout << L.elems[i] << " ";
    }
    cout << endl;
}

找查元素

  • 定义函数 findElem() 在顺序表中找查一个等于e的元素
/*
* 用于找查顺序表中的元素
* 参数e为要找查的元素
* 若找到则返回元素下标
* 若没找到则返回-1
*/
int findElem(Sqlist L, int e)        //这里我们不改变L,所以不用引用类型
{
  for(int i = 0; i < L.length; i++){
    if(e == L.elems[i])
      return i;                                    //若找到则返回元素下标
  }
  return -1;                                        //若没找到则返回-1
}

插入元素

尾部添加元素

在尾部添加元素要考虑以下几点

  • 顺序表是否已满
  • 添加成功后长度要加1
  • 故定义函数 listAppend()
/*
* 在顺序表尾部插入元素
* 参数e为要插入到尾部的元素
* 若成功则返回true,失败(顺序表已经满了)则返回false
*/
bool listAppend(Sqlist &L, int e)
{
    if(L.length == L.size)
        //顺序表满了
        return false;
  //没满则尾部插入元素并返回true
    L.elems[L.length] = e;
    L.length++;
    return true;
}

在特定位置插入元素

在特定位置插入要考虑以下几点

  • 顺序表是否已满
  • 添加成功后长度要加1
  • 要移动后面的元素而不能移动前面的元素,否则后面的元素会被前面的覆盖

定义如下

//在顺序表p位置(0 <= p <= length)上插入元素e
bool insertElem(Sqlist &L, int p, int e)
{
  if(p < 0 || p > L.length || L.length == MAXSIZE)
    /*
    * 如果位置错误
    * 或者表长已经达到最大允许值
    * 此时插入不成功并返回false
    */
    return false;
  for(int i = L.length - 1; i >= p; --i)
    //从后往前将元素相后方移动一个位置
    L.elems[i+1] = L.elems[i];
  L.elems[p] = e;    //插入元素e到p位置
  L.length++;
  
  return true;        //成功返回true  
}

删除元素

删除元素要考虑以下几点

  • 顺序表位置是否正确
  • 成功后长度要减去1
  • 后方元素向前移动一个位置
//删除p位置的元素
bool delElem(Sqlist &L, int p, int &e)
{
  //位置错误返回false
  if(p < 0 || p > L.length - 1) return false;
  e = L.elems[p];    //将被删除的元素赋值给e
  for(int i = p; i < L.length - 1; i++)
  {
    //从p开始后方元素向前移动一个位置
    L.elems[i] = L.elems[i+1];
  }
  
  L.length--;        //长度减去1
  return true;    //成功返回true
  
}

顺序表的销毁

  • 在初始化函数中,用了new来分配内存,所以在销毁时要释放内存
void destroy(Sqlist &L)
{
  //内存存在则释放内存
  if(L.elems) delete []L.elems;
  L.length = 0;
  L.size = 0;
}
最后修改:2022 年 04 月 01 日
如果觉得我的文章对你有用,请随意赞赏