数据结构系列之顺序表

打算写一个数据结构系列,将数据结构和算法相关的内容从头到尾整理一遍。如果喜欢这个系列的话,欢迎关注我的个人公众号:“编码魔坊”,回复“数据结构”可免费获取完整代码,查看最新进度哦!!!

一、定义数据类型

下边给出顺序表的静态定义和动态定义两种方式,本案例使用静态定义实现,动态定义实现代码可以去公众号获取。

//定义顺序表中结点存储数据的类型
typedef struct 
{
    int id;           //ID
    char name[10];    //姓名
    int age;          //年龄
}ElemType;

//静态方法定义顺序表的结构
typedef struct
{
    ElemType data[MAXSIZE];      //存储数据元素
    int length;                  //顺序表的已存结点个数,即顺序表长度
}SSList;    //Static Sequential List

//动态方法定义顺序表的结构
typedef struct
{
    ElemType *data;
    int length;
}DSList;    //Dynamic Sequential List

二、顺序表功能实现

1.初始化顺序表

void SequentialListInit(SSList *list)
{
    list->length = 0;  //长度为0,表示初始化的顺序表为空
}

2.顺序表中追加数据

  • 实现思路
    • 1.判断顺序表是否已满,若已满返回OVERFLOW(溢出)
    • 2.添加数据节点
    • 3.顺序表长度加1
int SequentialListAdd(SSList *list,ElemType element)
{
    //判断顺序表是否已满
    if(list->length == MAXSIZE)
    {
        printf("顺序表已满,无法继续添加结点!\n");
        return OVERFLOW;
    }
    //添加数据节点
    list->data[list->length] = element;
    //顺序表长度加1
    list->length++;
    
    //第二步和第三步合并写法
    //list->data[list->length++] = element;
    return OK;
}

3.输出所有的结点

int SequentialListShow(SSList *list)
{
    int i;   //循环变量
    if(list->length <= 0)
    {
        printf("顺序表为空!\n");
        return ERROR;
    }
    //输出顺序表的元素
    for(i = 0; i < list->length;i++)
    {
        printf("%d\t%s\t%d\n",list->data[i].id,list->data[i].name,list->data[i].age);
    }
    return OK;
}

4.指定位置插入结点

  • 实现思路
    • 1.判断顺序表是否已满
    • 2.插入位置是否合法
    • 3.插入位置后面的元素依次后移一位
    • 4.插入完毕后长度自增1
int SequentialListInsert(SSList *list,int index,ElemType element)
{
    int i;    //插入数据所需的循环变量
    //判断顺序表是否已满
    if(list->length == MAXSIZE)
    {
        printf("顺序表已满,无法继续添加!\n");
        return OVERFLOW;
    }
    //判断下标位置是否合法
    //顺序表从0开始,但是人的思维是从1开始
    //小于1超出左边下界,大于(list->length - 1)超出右边上界
    if(index < 1 || index > (list->length - 1))
    {
        printf("插入位置错误,无法插入!\n");
        return ERROR;
    }
    //插入结点
    //顺序表从0开始,所以最后一个元素的下标为(list->length-1)
    for(i = list->length; i >= index; i--)
    {
        //因为在index处插入,所以index及其后面的所有元素均后移一位
        //在顺序表最后一个元素处开始后移一位
        list->data[i] = list->data[i-1];
    }
    list->data[index-1] = element;  //在指定位置插入新元素
    list->length++;               //顺序表的长度加1
    return OK;    //插入成功
}

5.删除指定位置的数据元素

  • 实现思路
    • 1.判断删除的下标是否合法
    • 2.被删除元素后面所有的数据都要向前移动一位
    • 3.删除元素后,顺序表长度减1
int SequentialListDelete(SSList *list,int delIndex)
{
    int i; //删除结点时所需的循环变量
    //判断下标是否合法
    //小于0超出左边下界,大于(list->length-1)超出右边上界
    if(delIndex < 0 || delIndex > (list->length - 1))
    {
        printf("删除位置有误,删除失败!\n");
        return ERROR;
    }
    //被删除数据后面的元素依次向前移动
    //顺序表从0开始,用户输入的下标要减1
    //i达到顺序表的最大长度则后续元素前移完毕
    for(i=delIndex-1;i < list->length;i++)
    {
        list->data[i] = list->data[i+1];
    }
    list->length--;
    return OK;      //删除成功
}

6.根据下标查找数据元素

  • 实现思路
    • 1.判断查找的位置是否合法
    • 2.将查找到的结点的地址保存到element中
int SequentialListSearchByIndex(SSList *list,int index,ElemType *element)
{
    //判断查找的位置是否合法
    //人类思维下标是1到n,但是顺序表是从0到n,所以查找的下标要减1
    //即查找范围为:1到(list->length-1)
    if(index < 1 || index > (list->length - 1))
    {
        printf("查找的下标位置有误!\n");
        return ERROR;     //查找失败
    }
    //保存查找到的结点的地址
    element->id = list->data[index - 1].id;
    strcpy(element->name,list->data[index - 1].name);
    element->age = list->data[index - 1].age;
    return OK;
}

7.根据用户ID查找结点

int SequentialListSearchById(SSList *list, int id, ElemType *element)
{
    int i;   //循环变量
    for (i = 0; i < list->length; i++)
    {
        if(id == list->data[i].id)
        {
            //查找成功,返回查找到的结点及其下标
            element->id = list->data[i].id;
            strcpy(element->name,list->data[i].name);
            element->age = list->data[i].age;
            return (i + 1);
        }
    }
    return FALSE;       //未查找到
}

8.不主要的函数

/**
 * @brief 获取顺序表的长度
 */
int GetSequentialListLength(SSList *list)
{
    return (list->length);
}

/**
 * @brief    清空顺序表
 */
int SequentialListClear(SSList *list)
{
    if(list->length == 0)
    {
        printf("顺序表为空,无需清空!\n");
        return ERROR;
    }
    //顺序表不为空,清空顺序表
    list->length = 0;
}

/**
 * @brief   判断顺序表是否为空
 */
int SequentialListIsEmpty(SSList *list)
{
    if(list->length == 0)
    {
        return TRUE;     //是空表
    }
    return FALSE;        //不是空表
}

完整代码可以关注公众号:“编码魔坊”,回复:“数据结构”就可以免费获取了!!!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道人禅(armey)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值