顺序表简介
顺序表是在计算机内存中数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
顺序表结构定义
#define LIST_INIT_SIZE 20 //线性存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct{
int *pBase; //存储空间地址
int length; //当前长度
int listsize; //当前分配的春初容量
}SqList;
顺序表的基本操作
1.初始化顺序表
void InitArr(SqList &pArr){
pArr.pBase = (int *)malloc(sizeof(int)* LIST_INIT_SIZE); //动态分配内存
if(pArr.pBase == NULL){ //判断分配内存是否成功
printf("动态分配内存失败");
exit(-1);
}
pArr.length = LIST_INIT_SIZE; //初始化顺序表长度
pArr.listsize = 0; //实际长度为0
}
2.追加元素
bool AppendArr(SqList &pArr, int val){
if(IsFull(pArr)) //判断顺序表是否已满
return false;
pArr.pBase[pArr.listsize] = val; //将元素放在顺序表最后一个位置
++pArr.listsize;
return true;
}
3.是否为空
bool IsEmpty(SqList &pArr){
if(pArr.listsize == 0) //顺序表实际长度等于0,顺序表为空
return true;
else
return false;
}
4.是否为满
bool IsFull(SqList &pArr){
if(pArr.listsize == pArr.length) //顺序表实际长度等于分配的长度即满
return true;
else
return false;
}
5.输出每个元素
void ShowArr(SqList &pArr){
if(IsEmpty(pArr)){ //判断顺序表是否为空
printf("数组为空\n");
exit(-1);
} else {
printf("输出结果为");
for(int i=0; i<pArr.listsize; i++){ //循环遍历顺序表
printf("%d ", pArr.pBase[i]);
}
}
}
6.插入
bool InsertArr(SqList &pArr, int pos, int val){
int i;
if(IsEmpty(pArr)) //判断顺序表是否为空
return false;
else
{
if(pos < 1||pos>pArr.listsize+1) //判断插入的位置是否正确
return false;
for(i=pArr.listsize-1; i>=pos-1; i++) //寻找第pos-1个元素的位置
pArr.pBase[i+1] = pArr.pBase[i];
pArr.pBase[pos-1] = val;
pArr.listsize++;
return true;
}
}
7.删除
bool DeleteArr(SqList &pArr, int pos)
{
if(IsEmpty(pArr)) //判断顺序表是否为空
{
printf("数组为空\n");
return false;
}
else
{
if(pos < 1||pos > pArr.listsize) //判断要删除的元素位置是否正确
return false;
pArr.pBase[pos-1] =pArr.pBase[pos];
for(int i=pos;i<pArr.listsize; ++i) //寻找pos-1元素的位置
{
pArr.pBase[i] = pArr.pBase[i+1];
}
pArr.listsize--;
return true;
}
}
全部代码
# include<stdio.h>
# include<malloc.h>
# include<stdlib.h>
#define LIST_INIT_SIZE 20
typedef struct Arr{
int *pBase;
int length;
int listsize;
}SqList;
void InitArr(SqList &);
void ShowArr(SqList &);
bool IsEmpty(SqList &);
bool AppendArr(SqList &, int val);
bool IsFull(SqList &);
bool InsertArr(SqList &, int, int);
bool DeleteArr(SqList &, int pos);
int main(void){
return 0;
}
void InitArr(SqList &pArr){
pArr.pBase = (int *)malloc(sizeof(int)* LIST_INIT_SIZE);
if(pArr.pBase == NULL){
printf("动态分配内存失败");
exit(-1);
}
pArr.length = LIST_INIT_SIZE;
pArr.listsize = 0;
}
bool IsFull(SqList &pArr){
if(pArr.listsize == pArr.length)
return true;
else
return false;
}
bool IsEmpty(SqList &pArr){
if(pArr.listsize == 0)
return true;
else
return false;
}
bool AppendArr(SqList &pArr, int val){
if(IsFull(pArr))
return false;
pArr.pBase[pArr.listsize] = val;
++pArr.listsize;
return true;
}
void ShowArr(SqList &pArr){
if(IsEmpty(pArr)){
printf("数组为空\n");
exit(-1);
} else {
printf("输出结果为");
for(int i=0; i<pArr.listsize; i++){
printf("%d ", pArr.pBase[i]);
}
}
}
bool InsertArr(SqList &pArr, int pos, int val){
int i;
if(IsEmpty(pArr))
return false;
else
{
if(pos < 1||pos>pArr.listsize+1)
return false;
for(i=pArr.listsize-1; i>=pos-1; --i)
pArr.pBase[i+1] = pArr.pBase[i];
pArr.pBase[pos-1] = val;
pArr.listsize++;
return true;
}
}
bool DeleteArr(SqList &pArr, int pos)
{
if(IsEmpty(pArr))
{
printf("数组为空\n");
return false;
}
else
{
if(pos < 1||pos > pArr.listsize)
return false;
pArr.pBase[pos-1] =pArr.pBase[pos];
for(int i=pos;i<pArr.listsize; ++i)
{
pArr.pBase[i] = pArr.pBase[i+1];
}
pArr.listsize--;
return true;
}
}