线性表顺序存储结构之插入、删除、修改和查找操作,还有你想知道的动态分配线性表存储容量操作

数据存储结构的操作无非就是增删改查,下面逐一介绍。
结尾彩蛋:实现线性表顺序存储结构动态增加存储容量大小的功能函数。实现方法就是采用指针数组,手动为指针分配其所指向地址内存块的大小,注意点就是在程序结束时要记得释放分配的内存空间。

首先线性表顺序存储的结构体代码如下:

//线性表的存储结构代码
#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;
}
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值