【C】数据结构——顺序表

定义和表示方法

定义

顺序表:零个或多个相同元素的有限序列

基础知识补充

值比较

printf("%d", -1 == -1); // 1
printf("%d", 1 == -1);  // 0

引入布尔类型

#include <stdbool.h>  // C99标准才支持
true
false

顺序表的表示方法(重点)

#define MAXSIZE 100  // 顺序表最大长度
typedef int data_t ; // 数据类型

typedef struct {
    data_t data[MAXSIZE]; // 存储空间大小
    int last;             // 当前表尾指针
}seqlist_t, *sqlink_t;    // 顺序表类型

说明:

  • last = -1时,表示顺序表为空
  • seqlist_t 顺序表值
  • *sqlink_t 顺序表指针 ,typedef struct {} * sqlink_t

图示

顺序表运算

创建一个空的顺序表

步骤:

  1. 创建结构体指针seqlist_t *L = NULL;
  2. 申请内存L = (seqlist_t *)malloc(sizeof(seqlist_t));
  3. 初始化设置:L->last = -1;
  4. 返回值:return L;

代码:

seqlist_t *create_seqlist(void){
    // 1. 申请内存空间
    seqlist_t *L = NULL;
    L = (seqlist_t *)malloc(sizeof(seqlist_t));
    if (L== NULL){
        puts("debug : malloc failed !");
        return NULL;
    }
    // 2. 初始化
    L->last = -1;
    return L;
}

置空表

步骤:

  1. 检查输入参数是否有效
  2. 释放空间

代码:

/*清空顺序表*/
void clear_seqlist(seqlist_t *L) {
    // 1.检查输入参数是否有效:判断表是否为空
    if (NULL == L) {
        puts("seqlist_ *L is NULL!");
        return;
    }
    // 2.释放内存空间
    free(L);
    return;
}

判断表是否为空

  1. 参数判断,如果指针为空,返回-1

  2. 返回值:

    • 顺序表为空时,返回1

    • 顺序表不为空时,返回0

代码:

/*判断顺序表是否为空*/
int is_empty_seqlist(seqlist_t* L) {
    // 参数判断
    if (NULL == L) {
        puts("seqlist *L  is NULL !");
        return -1;
    }
    // 2.返回结果
    return (L->last == -1);
}

判断顺序表是否为满

步骤:

  1. 参数判断
  2. 返回结果

代码:

/*判断顺序表是否为满*/
int is_full_seqlist(seqlist_t* L) {
    // 1.检查输入参数是否有效:判断表是否为空
    if (L == NULL) {
        puts("seqlist_ *L is NULL!");
        return -1;
    }
    // 2. 通过比较last与MAXSIZE的大小判断顺序表是否为满
    return (L->last == (MAXSIZE - 1));
}

设置顺序表为满

步骤:

  1. 参数判断
  2. 将顺序表设置为满

代码:

/*设置顺序表为满*/
void set_empty_seqlist(seqlist_t* L) {
    // 1.参数判断
    if (NULL == L) {
        puts("seqlist *L  is NULL !");
        return;
    }
    // 2. 将顺序表设置为满
    L->last = MAXSIZE - 1;
    return;
}

获取顺序表长度

步骤:

  1. 参数判断
  2. 返回结果

代码:

/*获取顺序表长度*/
int get_length_seqlist(seqlist_t* L) {
    // 1. 参数判断
    if (NULL == L) {
        puts("seqlist *L  is NULL !");
        return -1;
    }
    // 2.返回结果
    return (L->last +1);
}

显示数据:遍历顺序表有效元素

步骤:

  1. 参数判断
  2. 获取顺序表长度
    • for循环遍历顺序表长度
    • 遍历内容:[0, L->last]
    • 取顺序表的值: L->data[i]

代码:

/*显示数据表*/
void show_seqlist(seqlist_t* L) {
    // 1. 参数判断
    if (NULL == L) {
        puts("seqlist *L  is NULL !");
        return;
    }
    // 2. 获取顺序表长度
    for (int i = 0; i <= L->last; ++i) {
        printf("L->data[%d] = %d\n", i, L->data[i]);
    }
    return;
}

通过位置插入数据

描述:将元素x插入到表中,第i个元素ai之前,且表长+1

步骤:

  1. 参数检查

    • 链表是否已满is_full_seqlist(L)
    • 位置是否合法pos > (L->last + 1)
  2. 移动元素

    • 从最后一个位置开始移动i = L->last
    • 依次后移1位:L->data[i + 1] = L->data[i]
    • 结束条件:i < pos
  3. 插入数据

    • 插入值L->data[pos] = data
    • 改变顺序表的当前长度L->last++

代码:

/*通过位置插入数据*/
int insert_seqlist(seqlist_t* L, data_t data, int pos) {
    // 1.检查输入参数是否有效
    // a. 链表是否已满 
    // b. 位置是否合法
    if ((1 == is_full_seqlist(L)) || (pos < 0) || (pos > (L->last + 1))) 
    {
        puts("debug : input argv is invald !");
        return -1;
    }
    // 2.移动元素
    int i = 0; // 此处可以删除
    for (int i = L->last; i >= pos; i--) {
        L->data[i + 1] = L->data[i];
    }
    // 3. 插入数据
    L->data[pos] = data;
    L->last++;
    return 0;
}

通过位置修改数据

步骤:

  1. 参数判断
  2. 改变元素

代码

/*通过位置修改数据*/
int change_seqlist(seqlist_t* L, data_t x, int pos) {
    // 1. 参数判断
    if (NULL == L || pos <0 || pos > L->last) {
        puts("seqlist *L  is NULL or input pos is invalid !");
        return -1;
    }
    // 2.改变元素
    L->data[pos] = x;
    return 0;
}

通过位置删除数据

步骤:

  1. 参数判断
  2. 删除元素
  3. 改变顺序表的长度

代码:

/*通过位置删除数据*/
int delete_seqlist(seqlist_t* L, int pos) {
    // 1. 参数判断
    if (NULL == L || pos <0 || pos > L->last) {
        puts("seqlist *L  is NULL or input pos is invalid !");
        return -1;
    }
    // 2.删除元素
    int i = 0;
    for (i = pos; i < get_length_seqlist(L); ++i) {
        L->data[i] = L->data[i + 1];
    }
    // 3.改变顺序表的长度
    --L->last;
    return 0;
}

通过位置查找数据

步骤:

  1. 参数判断
  2. 遍历查找

代码:

/*通过数据查找位置*/
int search_seqlist(seqlist_t* L, data_t x) {
    // 1. 参数判断
    if (NULL == L ) {
        puts("seqlist *L  is NULL or input pos is invalid !");
        return -1;
    }
    // 2.遍历查找
    int i = 0;
    for (i = 0; i <= L->last; ++i){
        if (x == L->data[i]) {
            return i;
        }
    }
    return -1;
}

posted on 2020-08-09 11:32  索米尔  阅读(364)  评论(0)    收藏  举报

导航