当前位置: 首页 > article >正文

数据结构 - 顺序表

0.线性表

        1.定义

                线性表就是零个或多个相同数据元素的有限序列。

        2.线性表的存储结构

        ①.顺序结构

        ②.链式结构

        3.线性表的表示方法

例如:

一.线性表的基本运算

二.线性表的复杂运算

1.线性表的合并运算

2.线性表的去重运算

三.顺序表

1.定义

        顺序表,就是线性表的顺序存储格式

2.顺序表的实现

①.顺序表的创建

/**
 * @description:            创建一个新的顺序表
 * @param       :           无
 * @return      :           创建的顺序表的指针
*/
seqlist_t *create_seqlist(void)
{
    seqlist_t *L = NULL;

    /* 1.申请空间 */
    L = (seqlist_t *)malloc(sizeof(seqlist_t));
    if(NULL == L)
    {
        printf("malloc seqlist_t *L faild error!\n");
        return NULL;
    }

    /* 初始化顺序表内部指针的位置 */
    L->last = -1;

    return L;

}

②.置空顺序表

/**
 * @description:        清空顺序表内的数据
 * @param - L   :       要操作的顺序表
 * @return      :       无
*/
void set_empty_seqlist(seqlist_t *L)
{
    if(NULL == L)
    {
        printf("seqlist_t *L is NULL\n");
        return ;
    }

    L->last = -1;
}   

③.释放顺序表

/**
 * @description:       释放一个顺序表
 * @param L    :       要释放的顺序表的指针
 * @return     :       无
*/
void clear_seqlist(seqlist_t * L)
{
    /* 1.首先判断传入的顺序表是否有效 */
    if(NULL == L)
    {
        printf("seqlist_t *L is NULL\n");
        return ;
    }

    /* 若有效,则释放该表 */
    free(L);
}

④.判断顺序表是否满/是否空

/**
 * @description:                  判断顺序表是否为满
 * @param L         :             要进行判断的顺序表
 * @return          :             1 为满 ,其他 为非满
*/
int is_full_seqlist(seqlist_t *L)
{
    if(NULL == L)
    {
        printf("seqlist_t *L is NULL\n");
        return -1;
    }

    return (L->last == MAXSIZE - 1);

}
/**
 * @description:            判断顺序表是否为空
 * @param - L       :       要操作的顺序表
 * @return          :       1 为空,其他 为非空
*/
int is_empty_seqlist(seqlist_t *L)
{
    if(NULL == L)
    {
        printf("seqlist_t *L is NULL\n");
        return -1;
    }

    return (L->last == -1);
}

⑤.向顺序表插入一个元素

/**
 * @description:            向顺序表中指定位置前插入一个数据
 * @param L         :       要进行操作的顺序表
 * @param x         :       要插入的值
 * @param pos       :       要插入的位置
 * @return          :       0 成功, 其他 失败
*/
int insert_seqlist(seqlist_t *L,data_t x,int pos)
{
    int i = 0;

    /* 若顺序表已满,或者插入位置无效 */
    if(is_full_seqlist(L) || (pos < 0) || (pos > L->last +1))
    {
        printf("input argv is invalid\n");
        return -1;
    }

    /* 若pos要插入的位置为i,则从最后一个元素开始,到i的元素先依次往后移动一个位置 */
    for(i = L->last;i >= pos;i--)
    {
        L->data[i + 1] = L->data[i];
    }

    /* 将x的值赋给data[pos]位置 */
    L->data[pos] = x;

    /* 顺序表末尾的指针往后移动一个位置 */
    L->last++;

    return 0;
}

⑥.删除指定位置的元素

/**
 * @description:            在顺序表中指定位置删除一个数据
 * @param - pos     :       指定删除的元素的位置
 * @return          :       0 成功,其他 失败
*/
int delete_seqlist(seqlist_t *L,int pos)
{
    int i = 0;

    if(pos < 0 || pos > L->last)
    {
        printf("input pos invalid\n");
        return -1;
    }

    if(NULL == L)
    {
        printf("seqlist_t *L is NULL\n");
        return -1;
    }

    for(i = pos;i < L->last;i++)
        L->data[i] = L->data[i + 1];
    L->last--;

    return 0;

}

⑦.替换顺序表中指定位置的元素

/**
 * @description:        替换顺序表中指定位置的数据
 * @param - L   :       要操作的顺序表
 * @param - x   :       输入的元素值
 * @param - pos :       要替换的元素的位置
 * @return      :       0 成功, 其他 失败 
*/
int change_seqlist(seqlist_t *L,data_t x,int pos)
{
    if(NULL == L)
    {
        printf("seqlist_t *L is NULL\n");
        return -1;
    }

    if(pos < 0 || pos > L->last)
    {
        printf("input pos invalid\n");
        return -1;
    }

    L->data[pos] = x;

    return 0;
}

⑧.找到元素X在表中第一次出现的位置

/**
 * @description:            查找指定元素在顺序表中第一次出现的位置
 * @param - L       :       要操作的顺序表
 * @param - x       :       要查找的元素
 * @return          :       x第一次出现的位置
*/
int search_seqlist(seqlist_t *L,data_t x)
{
    int i = 0;

    if(NULL == L)
    {
        printf("seqlist_t *L is NULL\n");
        return -1;
    }

    for(i = 0;i <= L->last;i++)
    {
        if(L->data[i] == x)
            return i;   
    }

    return -1;
}   

⑨.打印顺序表的全部内容

/**
 * @description:        打印顺序表的所有数据
 * @param L     :       要进行操作的顺序表
 * @return      :       无
*/
void show_seqlist(seqlist_t *L)
{
    int i = 0;

    if(NULL == L)
    {
        printf("seqlist *L is NULL\n");
        return ;
    }

    for(i = 0;i <= L->last;i++)
        printf("L->data[%d] = %d\n",i,L->data[i]);
    
    return ;
} 

⑩.求顺序表长

/**
 * @description:            获取顺序表的长度
 * @param - L       :       要操作的顺序表
 * @return          :       顺序表的长度
*/
int get_length_seqlist(seqlist_t *L)
{
    if(NULL == L)
    {
        printf("seqlist_t *L is NULL\n");
        return -1;
    }

    return (L->last + 1);
}


http://www.kler.cn/a/300488.html

相关文章:

  • 跟李沐学AI:长短期记忆网络LSTM
  • 目标检测-YOLOv3
  • HTML中的文字与分区标记
  • #include <netinet/in.h>
  • 暴雨液冷服务器硬刚液冷放量元年
  • 探索Python中的斐波那契数列:实现与应用
  • 大规模K8S集群的网络与存储优化:5000+节点规模| 第2集
  • 安装驱动是有什么作用,它是怎么工作的
  • 408算法题leetcode--第一天
  • SprinBoot+Vue高校网上缴费综合务系统的设计与实现
  • 免费云服务器申请教程
  • java反射(reflection)的基本理解和使用
  • MongoDB Limit 与 Skip 方法
  • Java中SringBoot服务连接多个MySQL数据源案例实战
  • 微软面向所有用户推出 Xbox Game Pass Standard
  • Python基础语法(1)下
  • 速盾:未备案网站如何加cdn?
  • 在 `el-upload` 上传图片前裁剪:让你的应用更“裁”心,更“剪”美!
  • linux操作系统日志小知识
  • 【路径规划】 使用计算机视觉和机器人操纵器绘制肖像