代码只进行了简单的测试 如果代码存在问题 欢迎各位带哥在评论区指出
数据结构
typedef struct{
ElemType *elem; //存储空间基地
int length = 0; //表长,元素个数
int listsize; //表容量,空间大小
}SqList;
顺序表的原子操作实现
1. 表的初始化操作
Status InitList_Sq(SqList &L)
{
//构造空线性表L 通过引用带回 O(1)
L.elem = (ElemType *) malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(L.elem == NULL) //也可写作 if(!L.elem)
exit(OVERFLOW);
L.length = 0; //初始化表长,即空表
L.listsize = LIST_INIT_SIZE; //初始化存储容量
return OK; //返回状态码
}
2.表的删除操作
Status DestroyList_Sq(SqList &L)
{
//销毁列表 O(1)
free(L.elem); //释放列表
//修改列表长度及容量
L.length = 0;
L.listsize = 0;
return OK;
}
3.表元素的插入操作
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{
//向列表中第i个位置插入元素 O(n)
if(i < 0 || i >= L.length) //插入位置不合法
return ERROR;
if(L.length >= L.listsize)
{
//表满扩容
L.elem = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!L.elem)
exit(OVERFLOW);
L.listsize += LISTINCREMENT;
}
ElemType *q = L.elem + i, *p = L.elem+L.length -1;
while(p >= q) //插入位置后的元素右移
{
*(p+1) = *p;
p--;
}
*q = e; //插入元素
L.length++; //更新长度
return OK; //返回状态码
}
4.表元素的删除操作
Status ListDelete_Sq(SqList &L, int i)
{
//删除列表第i个元素 O(n)
if(i < 0 || i >= L.length) //删除位置不合法
return ERROR;
ElemType *q = L.elem + i, *p = L.elem+L.length -1;
while(p > q) //删除位置后的元素向前覆盖
{
*q = *(q+1);
q++;
}
L.length--; //更新表长
return OK; //返回状态码
}
5.表尾追加元素操作
Status ListAppend_Sq(SqList &L, ElemType e)
{
//向列表尾追加元素 O(1)
if(L.length >= L.listsize)
{
//表满扩容
L.elem = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!L.elem)
exit(OVERFLOW);
L.listsize += LISTINCREMENT;
}
ElemType *p = L.elem + L.length;
*p = e; //插入元素
L.length++; //更新表长
return OK;
}
6.获取指定位置元素
Status GetElem_Sq(SqList L, int i, ElemType &e)
{
//获取列表第i个位置的元素,用e带回 O(1)
if(i < 0 || i >= L.length) //查找位置不合法
return ERROR;
e = *(L.elem + i);
return OK;
}
7.打印表
void PrintList_Sq(SqList L)
{
//打印列表
if(!L.length)
{
printf("Empty List\n");
return;
}
int i = 0;
while(i < L.length)
{
printf("%d ", *(L.elem+i));
i++;
}
printf("\n");
}
8.获取表长
int ListLength_Sq(SqList &L)
{
//返回列表长度
return L.length;
}