一、线性表
1、逻辑结构:线性结构
2、存储结构:顺序存储,每个数据元素之间的地址是连续的,查找数据可以通过下标直接查询
3、线性表与数组的区别在于顺序表更加符合线性的规则
二、顺序表的相关操作
我们在申请每一个空间和函数传递首地址时都需要判断是否成功
1.定义一个顺序表的方式
typedef struct NODE{ //数据元素的结构体
int number;//数据项,如果有其他的也可以继续添加
}node_t;
typedef struct SEQ_LIST{ //数据对象的结构体
node_t s[N];//这里的N是宏定义的数根据自己的需求定义大小
int count;//用来记录当前表中的元素;
}seq_list_t;
1、创建顺序表的两种方法
(1)通过函数的返回值创建
seq_list_t *create_list1(){
seq_list_t *p=(seq_list_t *)malloc(sizeof(seq_list_t)) //分配地址空间
if(NULLp){
printf(“malloc error\n”);
exit(-1);//结束进程
}
p->count =0;
return p;
}
(2)通过函数的参数创建顺序表
int create——list2(seq_list_t **p){
*p=(seq_list_t *)malloc(sizeof(seq_list_t)) //分配地址空间
if(NULLp){
printf(“malloc error\n”);
return -1;//结束进程
}
(*p)->count=0;//人数清零
return 0;
}
2.释放顺序表
void free_list(seq_list_t **p){
if(NULL != *p){
free(*p);
*p=NULL;
}
}//这里传递二级指针的目的是因为我们需要给实参my_list 置NULL;就必须传递二级指针
3.插入元素
//按照位置插入元素
int insert_list(seq_list_t *my_list, int pos, int value){
//对指针要做非空性检查
if(NULL == my_list){
printf("%s–%s(%d)入参为空 请检查\n", FILE, func, LINE);
return -1;
}
//判断一下表是否为满
if(N == my_list->count){
printf(“表满了 插入失败\n”);
return -1;
}
//判断插入位置是否合理
if(pos<0 || pos>=N || pos>my_list->count){
printf(“插入位置不合理 请检查\n”);
return -1;
}
int i = 0;
for(i=my_list->count-1; i>=pos; i–){
my_list->s[i+1] = my_list->s[i];
}
my_list->s[pos].number = value;
my_list->count++;
return 0;
}
4.顺序表遍历
void print_list(seq_list_t *my_list){
int i = 0;
for(i = 0; i < my_list->count; i++){
printf("%d “, my_list->s[i].number);
}
printf(”\n");
}
5.顺序表元素的删除
//根据位置删除数据
int delete_from_list_by_pos(seq_list_t *my_list, int pos){
//对指针要做非空性检查
if(NULL == my_list){
printf("%s–%s(%d)入参为空 请检查\n", FILE, func, LINE);
return -1;
}
//判断一下表是否为空
if(0 == my_list->count){
printf(“表空了 删除失败\n”);
return -1;
}
//判断删除位置是否合理
if(pos<0 || pos>=N || pos>=my_list->count){
printf(“插入位置不合理 请检查\n”);
return -1;
}
//执行删除操作
int i = 0;
for(i = pos+1; i < my_list->count; i++){
my_list->s[i-1] = my_list->s[i];
}
my_list->count–;
return 0;
}
6.查找元素的两个方法
node_t seach_list2(seq_list_t *my_list, int pos){
node_t temp;
temp.number = -1;
//对指针要做非空性检查
if(NULL == my_list){
printf("%s–%s(%d)入参为空 请检查\n", FILE, func, LINE);
return temp;
}
//判断查找位置是否合理
if(pos<0 || pos>=N || pos>=my_list->count){
printf(“查找位置不合理 请检查\n”);
return temp;
}
//如果合理直接返回对应位置的元素
return my_list->s[pos];
}
//按照位置查找元素 方法二
int seach_list1(seq_list_t *my_list, node_t *temp, int pos){
//对指针要做非空性检查
if(NULL == my_list){
printf(“find filed”);
return -1;
}
//判断查找位置是否合理
if(pos<0 || pos>=N || pos>=my_list->count){
printf(“查找位置不合理 请检查\n”);
return -1;
}
*temp = my_list->s[pos];
return 0;
}