数据结构——顺序表

结构

  • 逻辑结构:线性结构
  • 存储结构:顺序存储

操作

  • 创建顺序表
  • 释放顺序表
  • 根据位置插入节点
  • 根据位置删除节点
  • 根据位置修改节点
  • 根据位置获取节点

代码

  • 顺序表相关结构体以及宏定义
// 顺序表最大长度
#define SEQUENTIAL_LIST_MAX_LENGTH 5

// 顺序表中节点包含的元素
typedef struct __NODE
{
    int data;
} node_t;

// 顺序表结构体
typedef struct SEQ_LIST
{
    node_t list_node[SEQUENTIAL_LIST_MAX_LENGTH]; // 节点
    int nodes_num;                                // 当前节点数量
} seq_list;
  • 创建顺序表
int create_seq_list(seq_list **p)
{
    *p = (seq_list *)malloc(sizeof(seq_list));
    if (NULL == *p)
    {
        printf("内存分配失败\n");
        exit(-1); // 退出程序
    }
    (*p)->nodes_num = 0; // 节点数量先清零
}
  • 释放顺序表
void free_seq_list(seq_list **p)
{
    free(*p);
    *p = NULL;
}
  • 根据位置插入节点
int insert_seq_list(seq_list *my_list, int pos, int data)
{
    // 对指针形参要做非空检查
    if (NULL == my_list)
    {
        printf("入参为NULL\n");
        return -1;
    }

    // 对位置的合理性做检查
    if (pos < 0 || pos > my_list->nodes_num)
    {
        printf("插入位置不合理 插入失败\n");
        return -1;
    }

    // 判断表是否已经满了
    if (my_list->nodes_num == SEQUENTIAL_LIST_MAX_LENGTH)
    {
        printf("表已经满了 插入失败\n");
        return -1;
    }

    // 执行插入操作
    // 先将待插入位置后面的数据都往后移动一步
    for (int i = my_list->nodes_num - 1; i >= pos; i--)
    {
        my_list->list_node[i + 1] = my_list->list_node[i];
    }

    // 插入
    my_list->list_node[pos].data = data;
    my_list->nodes_num++;

    printf("插入成功\n");
    return 0;
}
  • 根据位置删除节点
int delete_from_seq_list_by_pos(seq_list *my_list, int pos)
{
    if (NULL == my_list)
    {
        printf("入参为NULL\n");
        return -1;
    }

    // 删除位置合理性检查
    if (pos < 0 || pos >= my_list->nodes_num)
    {
        printf("删除位置不合理 删除失败\n");
        return -1;
    }

    // 检查表是否为空
    if (0 == my_list->nodes_num)
    {
        printf("表为空 删除失败\n");
        return -1;
    }

    // 执行删除操作
    // 待删除位置后面的元素都要向前移动一步
    for (int i = pos + 1; i < my_list->nodes_num; i++)
    {
        my_list->list_node[i - 1] = my_list->list_node[i];
    }

    my_list->nodes_num--;
    return 0;
}
  • 根据位置修改节点
int modify_seq_list_by_pos(seq_list *my_list, int pos, int new_value)
{
    if (NULL == my_list)
    {
        printf("入参为NULL 请检查\n");
        return -1;
    }

    // 修改位置合理性检查
    if (pos < 0 || pos >= my_list->nodes_num)
    {
        printf("删除位置不合理 修改失败\n");
        return -1;
    }

    my_list->list_node[pos].data = new_value;
    return 0;
}
  • 根据位置获取节点
int get_data_from_seq_list_by_pos(seq_list *my_list, int pos, node_t *temp)
{
    if (NULL == my_list)
    {
        printf("入参为NULL 请检查\n");
        return -1;
    }

    // 修改位置合理性检查
    if (pos < 0 || pos >= my_list->nodes_num)
    {
        printf("获取数据的位置不合理 获取失败\n");
        return -1;
    }

    *temp = my_list->list_node[pos]; // 跟据下标就可以访问数据
    return 0;
}

应用

  • 进行创建顺序表、插入节点、获取节点、修改节点、删除节点、释放顺序表操作
int main(int argc, const char *argv[])
{
    // 创建顺序表
    seq_list *my_list = NULL;
    create_seq_list(&my_list);

    // 根据位置插入元素
    insert_seq_list(my_list, 0, 100);
    insert_seq_list(my_list, 1, 100);
    insert_seq_list(my_list, 2, 100);

    // 根据位置获取节点
    node_t temp;
    memset(&temp, 0, sizeof(temp)); // 将结构体所有字节置成 0
    get_data_from_seq_list_by_pos(my_list, 1, &temp);

    // 根据位置修改节点
    modify_seq_list_by_pos(my_list, 2, 1314);

    // 按照位置删除元素
    delete_from_seq_list_by_pos(my_list, 0);
    // delete_from_seq_list_by_pos(my_list, 2); // 节点0删除后,节点1会成为新的节点0,节点2成为新的节点1,此时不存在节点2,故会删除失败

    // 释放顺序表
    free_seq_list(&my_list);

    return 0;
}
暂无评论

发送评论 编辑评论


				
上一篇