数据结构——顺序表的创建、删除、插入、遍历
顺序表的声明和宏定义:
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)
测试结果如下: