结构
操作
- 创建顺序表
- 释放顺序表
- 根据位置插入节点
- 根据位置删除节点
- 根据位置修改节点
- 根据位置获取节点
代码
// 顺序表最大长度
#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;
}