【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
图示

顺序表运算
创建一个空的顺序表
步骤:
- 创建结构体指针
seqlist_t *L = NULL; - 申请内存
L = (seqlist_t *)malloc(sizeof(seqlist_t)); - 初始化设置:
L->last = -1; - 返回值:
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;
}
置空表
步骤:
- 检查输入参数是否有效
- 释放空间
代码:
/*清空顺序表*/
void clear_seqlist(seqlist_t *L) {
// 1.检查输入参数是否有效:判断表是否为空
if (NULL == L) {
puts("seqlist_ *L is NULL!");
return;
}
// 2.释放内存空间
free(L);
return;
}
判断表是否为空
-
参数判断,如果指针为空,返回-1
-
返回值:
-
顺序表为空时,返回1
-
顺序表不为空时,返回0
-
代码:
/*判断顺序表是否为空*/
int is_empty_seqlist(seqlist_t* L) {
// 参数判断
if (NULL == L) {
puts("seqlist *L is NULL !");
return -1;
}
// 2.返回结果
return (L->last == -1);
}
判断顺序表是否为满
步骤:
- 参数判断
- 返回结果
代码:
/*判断顺序表是否为满*/
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));
}
设置顺序表为满
步骤:
- 参数判断
- 将顺序表设置为满
代码:
/*设置顺序表为满*/
void set_empty_seqlist(seqlist_t* L) {
// 1.参数判断
if (NULL == L) {
puts("seqlist *L is NULL !");
return;
}
// 2. 将顺序表设置为满
L->last = MAXSIZE - 1;
return;
}
获取顺序表长度
步骤:
- 参数判断
- 返回结果
代码:
/*获取顺序表长度*/
int get_length_seqlist(seqlist_t* L) {
// 1. 参数判断
if (NULL == L) {
puts("seqlist *L is NULL !");
return -1;
}
// 2.返回结果
return (L->last +1);
}
显示数据:遍历顺序表有效元素
步骤:
- 参数判断
- 获取顺序表长度
- 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
步骤:
-
参数检查
- 链表是否已满
is_full_seqlist(L) - 位置是否合法
pos > (L->last + 1)
- 链表是否已满
-
移动元素
- 从最后一个位置开始移动
i = L->last - 依次后移1位:
L->data[i + 1] = L->data[i] - 结束条件:
i < pos
- 从最后一个位置开始移动
-
插入数据
- 插入值
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;
}
通过位置修改数据
步骤:
- 参数判断
- 改变元素
代码
/*通过位置修改数据*/
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;
}
通过位置删除数据
步骤:
- 参数判断
- 删除元素
- 改变顺序表的长度
代码:
/*通过位置删除数据*/
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;
}
通过位置查找数据
步骤:
- 参数判断
- 遍历查找
代码:
/*通过数据查找位置*/
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;
}
浙公网安备 33010602011771号