数据存储结构的操作无非就是增删改查,下面逐一介绍。
结尾彩蛋:实现线性表顺序存储结构动态增加存储容量大小的功能函数。实现方法就是采用指针数组,手动为指针分配其所指向地址内存块的大小,注意点就是在程序结束时要记得释放分配的内存空间。
首先线性表顺序存储的结构体代码如下:
//线性表的存储结构代码
#define MAXSIZE 20 //最大存储容量
typedef int ElemType; //数据存储类型,此处定义为int
struct SeqList
{
ElemType data[MAXSIZE]; //数组存储数据元素,最大容量为MAXSIZE
int length; //线性表当前长度
};
一,插入操作
代码结构及思路:
/*线性表的插入操作
1.检查插入位置,若不合理抛出异常
2.检查线性表长度,若大于等于数组长度则抛出异常
3.从线性表中最后一个数据元素开始遍历到第i个(即要插入的位置),分别将它们往后移一个位置
4.将要插入的元素填入位置i
5.线性表长度加1
*/
#define SUCCESS 0
#define FAILURE -1
int seqListInsert(SeqList *L, int insertPosition, const ElemType &e)
{
//检查线性表是否存在
if (L == NULL)
{
printf("SeqList Not Exist!\n");
return FAILURE;
}
//检查插入位置是否合理
if (insertPosition <= 0 || insertPosition >= L->length + 2)
{
printf("Error Insert Position!\n");
return FAILURE;
}
//检查线性表长度
if (L->length == MAXSIZE)
{
printf("SeqList Full!\n");
return FAILURE;
}
//从线性表中最后一个数据元素开始遍历到第i个(即要插入的位置)
for (int k = L->length - 1; k >= insertPosition - 1; k--)
{
L->data[k+1] = L->data[k];
}
//将要插入的元素填入位置i
L->data[insertPosition - 1] = e;
//线性表长度加1
L->length++;
printf("Insert Success!\n");
return SUCCESS;
}
二,删除操作
代码结构及思路
/*线性表的删除操作
1.检查数组是否存在
2.检查删除位置是否合理
3.取出删除元素
4.从删除元素的位置i开始遍历到最后一个元素,分别将它们向前移动一个位置
5.线性表长度减1
*/
int seqListDelete(SeqList *L, int deletePosition, ElemType *e)
{
//检查线性表是否存在
if (L == NULL)
{
printf("SeqList Not Exist!\n");
return FAILURE;
}
//检查删除位置是否合理
if (deletePosition <= 0 || deletePosition >= L->length + 1)
{
printf("Error Delete Position!\n");
return FAILURE;
}
//取出删除元素
*e = L->data[deletePosition - 1];
//从删除元素的位置i开始遍历到最后一个元素,分别将它们向前移动一个位置
for (int k = deletePosition - 1; k < L->length; k++)
{
L->data[deletePosition - 1] = L->data[deletePosition];
}
//线性表长度减1
L->length--;
printf("Delete Success!\n");
return *e;
}
三、修改操作
代码结构及思路
/*修改线性表第i个位置的元素
1.检查线性表是否存在
2.检查修改位置是否合理
3.修改第i个位置元素
*/
int seqListModify(SeqList *L, int ModifyCount, ElemType ModifyElem)
{
//检查线性表是否存在
if (L == NULL)
{
printf("SeqList Not Exist!\n");
return FAILURE;
}
//检查修改位置是否合理
if (ModifyCount <= 0 || ModifyCount >= L->length + 1)
{
printf("Error Modify Position!\n");
return FAILURE;
}
//修改第i个位置元素
L->data[ModifyCount - 1] = ModifyElem;
printf("Modify Success!\n");
return 0;
}
四、查找操作
代码结构及思路
/*查找线性表内是否存在某一元素,存在则返回其顺序位置
1.检查线性表是否存在
2.检查线性表内元素是否存在
3.返回元素所在的顺序位置
*/
int seqListSearch(const SeqList *L, ElemType SearchData)
{
//检查线性表是否存在
if (L == NULL)
{
printf("SeqList Not Exist!\n");
return FAILURE;
}
//遍历线性表内元素,检查线性表内元素是否存在
for (int i = 0; i < L->length; i++)
{
if (L->data[i] == SearchData)
{
printf("SearchData is Exist!\n");
//返回元素所在的顺序位置
return i + 1;
}
}
printf("SearchData Not Exist!\n");
return FAILURE;
}
彩蛋:动态增加线性表存储容量
代码结构及思路:
/*动态分配数组内存,在线性表容量达到上限之后动态增加容量*/
struct Seq_List
{
ElemType *data; //指向数组首地址的指针
int length;
};
/*初始化线性表*/
void seq_ListInitial(Seq_List *L)
{
//线性表长度置为0
L->data = (ElemType *)malloc(MAXSIZE * sizeof(ElemType));//内存申请函数malloc()
L->length = 0;
}
/*释放申请的内存空间*/
void FreeSeqList(Seq_List *L)
{
free(L->data);//内存释放函数free()
}
/*线性表的插入操作-动态增加容量
1.检查插入位置,若不合理抛出异常
2.检查线性表长度,若大于等于数组长度则动态增加容量
3.从线性表中最后一个数据元素开始遍历到第i个(即要插入的位置),分别将它们往后移一个位置
4.将要插入的元素填入位置i
5.线性表长度加1
*/
int seq_ListInsert(Seq_List *L, int insertPosition, const ElemType &e)
{
//检查线性表是否存在
if (L == NULL)
{
printf("SeqList Not Exist!\n");
return FAILURE;
}
//检查插入位置是否合理
if (insertPosition <= 0 || insertPosition >= L->length + 2)
{
printf("Error Insert Position!\n");
return FAILURE;
}
//检查线性表长度,若大于等于数组长度则动态增加容量
if (L->length % MAXSIZE == 0)
{
//realloc()函数重新为指针L->data分配其指向的内存块大小
L->data = (ElemType *)realloc(L->data, (L->length + MAXSIZE) * sizeof(ElemType));
L->data[L->length] = e;
}
else
{
for (int k = L->length - 1; k >= insertPosition - 1; k--)
{
L->data[k+1] = L->data[k];
}
//将要插入的元素填入位置i
L->data[insertPosition - 1] = e;
}
//线性表长度加1
L->length++;
printf("Insert Success! %d\n", L->length);
return SUCCESS;
}