顺序表的插入,删除

typedef struct
{
    ElemType data[MaxSIze];
    int length;

    /* data */
} SqList;

这段代码定义了一个结构体类型 SqList(通常表示“顺序列表”或“顺序存储的线性表”),用于表示一个具有固定最大容量 MaxSIze 的线性表。这里的 ElemType 应该是一个在代码的其他部分定义的类型,它表示线性表中存储的元素类型(例如 intfloatchar 或自定义的结构体等)。

  1. typedef 关键字

    • typedef 用于为已存在的类型创建一个新的名字。在这里,它为下面的结构体类型创建了一个新的名字 SqList
  2. 结构体定义

    • 结构体是一个用户定义的数据类型,它允许你将多个不同类型的数据项组合成一个单一的类型。
    • 在这个结构体中,有两个成员:
      • data:一个 ElemType 类型的数组,用于存储线性表的元素。数组的大小是固定的,由 MaxSIze 宏定义(这应该在代码的其他部分定义)。
      • length:一个 int 类型的变量,用于存储当前线性表中元素的数量(或称为“长度”)

 顺序表的插入

bool InsertList(SqList &L, int i, ElemType s)
{

    // 判断插入i是否合法
    if (i < 0 || i > L.length+1)
    {
        /* code */
        return false;
    }
    // 判断储存空间是否满
    if (L.length >= MaxSIze)
    {
        return false;
    }
    for (int j = L.length; j >= i; j--)
    {
        L.data[j] = L.data[j - 1];

        /* code */
    }
    L.data[i - 1] = s;
    L.length++;
    return true;
}
  1. 插入位置合法性判断
    • 函数首先检查插入位置i是否合法。这里使用了i < 0 || i > L.length+1作为条件。这通常是正确的,因为我们想确保插入位置i在线性表的有效范围内。在顺序表中,如果位置是从1开始计数的,那么有效范围是1 <= i <= L.length + 1(包括末尾的插入)。如果位置是从0开始计数的,那么有效范围是0 <= i <= L.length(不包括末尾的插入,因为末尾的下一个位置是L.length)。
  2. 存储空间是否满的判断
    • 接下来,函数检查顺序表的当前长度L.length是否已经达到了其最大容量MaxSIze。这是通过L.length >= MaxSIze来判断的。如果顺序表已满,则无法插入新元素,函数返回false
  3. 元素后移
    • 如果插入位置合法且存储空间未满,函数会进入一个循环,从L.length开始递减到i(包括i),将每个元素向后移动一个位置。这是为了腾出空间给新元素s
  4. 插入新元素
    • 在所有需要后移的元素都被移动后,函数在位置i-1(假设位置从0开始计数)处插入新元素s。如果位置是从1开始计数的,这里的代码就是正确的。
  5. 更新顺序表长度
    • 插入新元素后,函数通过L.length++来增加顺序表的长度

删除元素

bool DeleteList(SqList &L, int i, ElemType &e)
{
    // 判断i是否合法
    if (i < 1 || i > L.length)
    {

        return false;
    }
    e = L.data[i - 1];
    // 删除
    for (int j = i; j < L.length; j++)
    {
        L.data[j - 1] = L.data[j];
        /* code */
    }
    L.length--;
    return true;
}

 

  1. 判断i是否合法
    • 函数首先检查删除位置i是否合法。条件i < 1 || i > L.length正确地确保了i是在有效范围内的(假设位置从1开始计数)。如果i小于1或大于当前列表长度L.length,则返回false
  2. 保存被删除的元素
    • 在删除元素之前,函数通过e = L.data[i - 1];将被删除的元素(在数组中的位置是i-1,因为数组通常是从0开始计数的)保存到引用参数e中。
  3. 删除元素
    • 接着,函数通过一个从iL.length-1的循环来将后面的元素向前移动一个位置,以填补被删除元素留下的空位。注意这里循环的起始条件应该是j = i,因为在i位置上的元素已经被取出并保存到e中了。
  4. 更新顺序表长度
    • 在所有元素都被移动后,函数通过L.length--;来减少顺序表的长度,以反映已删除一个元素的事实。
  5. 返回结果
    • 如果一切顺利,函数返回true表示删除成功。

总运行代码

#include <stdlib.h>
#include <stdio.h>
#define MaxSIze 50

typedef int ElemType;

typedef struct
{
    ElemType data[MaxSIze];
    int length;

    /* data */
} SqList;

bool InsertList(SqList &L, int i, ElemType s)
{

    // 判断插入i是否合法
    if (i < 0 || i > L.length + 1)
    {
        /* code */
        return false;
    }
    // 判断储存空间是否满
    if (L.length >= MaxSIze)
    {
        return false;
    }
    for (int j = L.length; j >= i; j--)
    {
        L.data[j] = L.data[j - 1];

        /* code */
    }
    L.data[i - 1] = s;
    L.length++;
    return true;
}

void PrintList(SqList L)
{

    for (int i = 0; i < L.length; i++)
    {
        printf("%3d", L.data[i]);
        /* code */
    }
    printf("\n");
}
bool DeleteList(SqList &L, int i, ElemType &e)
{
    // 判断i是否合法
    if (i < 1 || i > L.length)
    {

        return false;
    }
    e = L.data[i - 1];
    // 删除
    for (int j = i; j < L.length; j++)
    {
        L.data[j - 1] = L.data[j];
        /* code */
    }
    L.length--;
    return true;
}

int main()
{
    SqList L;
    L.length = 3;
    L.data[0] = 1;
    L.data[1] = 2;
    L.data[2] = 3;
    bool ret;
    bool ret1;
    ret = InsertList(L, 2, 5);
    if (ret)
    {

        PrintList(L);
    }
    printf("''''''''''\n");
    ElemType del;
    DeleteList(L, 1, del);
    printf("del=%d", del);

    if (ret1)
    {

        PrintList(L);
    }
    return 0;
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值