数据结构——顺序表的创建、删除、插入、遍历

版权声明:小能 https://blog.csdn.net/qq_43152052/article/details/88381518

顺序表的声明和宏定义:

typedef int Status;
typedef int ElemType;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
constexpr auto OVERFLOW = -2;

#define LIST_INIT_SIZE 100  //线性表存储空间的初始化分配量
#define LISTINCREMENT 10   //线性表储存空间的分配增量
typedef struct sqlist
{
 ElemType* elem;     //存储空间的基址
 int length;      //当前长度
 int listsize;     //当前分配的存储容量(sizeof(ElemType)为单位)
}SqList;
Status InitList_Sq(sqlist& L); //构造一个空的线性表L
Status ListInsert_Sq(sqlist& L, int i, ElemType e);//插入新的元素
Status ListDelete_Sq(sqlist& L, int i, ElemType& e);//删除元素
Status ListTraverse(sqlist& L);//遍历线性表

创造一个顺序表:

//构造一个空的线性表
Status InitList_Sq(sqlist& L)
{
 L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
 if (!L.elem)exit(OVERFLOW);  //存储分配失败
 L.length = 0;     //空表长度为0
 L.listsize = LIST_INIT_SIZE; //初始存储容量
 return OK;
}

插入元素:

//插入元素
Status ListInsert_Sq(sqlist& L, int i, ElemType e)
{
 ElemType* newbase = 0;
 if (i<1 || i>L.length + 1)
  return ERROR; //i值不合法
 if (L.length >= L.listsize)  //存储空间已满,增加分配
 {
  newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
  if (!newbase)exit(OVERFLOW);  //存储分配失败
  L.elem = newbase;     //新基址
  L.listsize += LISTINCREMENT;  //增加存储容量
 }
 ElemType* q, * p;
 q = &(L.elem[i - 1]);
 for (p = &(L.elem[L.length - 1])/*最后一个元素,数组的下标*/; p >= q; --p)
  //将p从q开始往后依次移一位
  * (p + 1) = *p;
 *q = e;  //插入e
 ++L.length; //表的长度+1
 return OK;
}

删除元素:

//删除元素
Status ListDelete_Sq(sqlist& L, int i,ElemType& e)
{
 ElemType* q, * p;
 if ((i<1 || i>L.length))
  return ERROR;
 p = &(L.elem[i - 1]);//对应线性表ai,数组是a[i-1],区别是从0开始还是1开始
 *p=e;    //被删除数赋给e
 q = L.elem + L.length - 1;//表尾元素的位置,length转为字节数表示指针的移动
 for (++p; p <= q; ++p)  //被删除元素左移,第一循环将p右移一个单位
  * (p - 1) = *p;   //后一个元素值给前一个元素
 --L.length;
 return OK;
}

遍历顺序表:

//遍历顺序表
Status ListTraverse(sqlist& L)
{
 cout << "线性表中各元素为:";
 for (int j = 0; j != L.length; ++j)
  cout << L.elem[j] << " ";
 cout << endl;
 return OK;
}

测试代码如下:

SqList sql;
 ElemType e;
 InitList_Sq(sql);
 ListInsert_Sq(sql, 1, 1);
 ListInsert_Sq(sql, 2, 2);
 ListInsert_Sq(sql, 3, 3);
 ListInsert_Sq(sql, 4, 4);
 ListTraverse(sql);
 e = 3;
 ListDelete_Sq(sql, 3, e);
 ListTraverse(sql)

测试结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/88381518
今日推荐