一.顺序表
1.1 概念
逻辑结构:线性结构
存储结构:
顺序存储(顺序表)--基础数组实现
缺点:
空间使用不够灵活,需要提前确定数组的大小
插入和删除元素比较麻烦,因为需要批量的移动元素
优点:
按照位置查找元素比较快,因为可以通过数组下标来访问元素
1.2 操作:
创建线性表
插入数据元素(尾插、任意位置插入法)
删除数据元素(尾山法、任意位置删除法)
修改数据元素(根据位置、值修改)
在顺序表中查找元素(按位置查找)
顺序表的排序 --排序
清空顺序表
释放顺序表
1.3代码实现
#ifndef _SEQ_LIST_H_
#define _SEQ_LIST_H_
#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct _Student{
int data;
}stu_t;
typedef struct _seq_list{
stu_t s[N];
int count;
}seq_list_t;
seq_list_t* create_seq_list();
int insert_seq_list_by_tail(seq_list_t* my_class, int in_data);
int print_seq_list(seq_list_t* my_class);
int insert_seq_list_by_pos(seq_list_t* my_class,int position,int in_data);
int delete_from_deq_list_by_pos(seq_list_t *my_class, int pos);
int sort_seq_list(seq_list_t *my_class, int flag);
#endif
#include "sql_list.h"
seq_list_t* create_seq_list()
{
seq_list_t* temp = (seq_list_t*)malloc(sizeof(seq_list_t));
if (NULL == temp){
printf("内存分配失败\n");
exit(-1);
}
temp->count = 0;
return temp;
}
int insert_seq_list_by_tail(seq_list_t* my_class, int in_data)
{
if(NULL == my_class){
printf("入参为 NULL, 请检查\n");
return -1;
}
if (my_class->count == N){
printf("已经满了\n");
}
my_class->s[my_class->count].data = in_data;
my_class->count++;
return 0;
}
int print_seq_list(seq_list_t* my_class)
{
if(NULL == my_class){
printf("入参为 NULL, 请检查\n");
return -1;
}
int i = 0;
for (i = 0; i < my_class->count; i++){
printf("%d ",my_class->s[i].data);
}
puts("");
return 0;
}
int insert_seq_list_by_pos(seq_list_t* my_class,int position,int in_data)
{
if(NULL == my_class){
printf("入参为 NULL, 请检查\n");
return -1;
}
if (my_class->count == N){
printf("已经满了\n");
return -1;
}
if (position <= 0 || position >my_class->count){
printf("插入位置错误");
return -1;
}
for (int i = my_class->count - 1; i >= position; i--){
my_class->s[i + 1] = my_class->s[i];
}
my_class->s[position].data = in_data;
my_class->count++;
return 0;
}
int delete_from_deq_list_by_pos(seq_list_t *my_class, int pos)
{
if (NULL == my_class){
printf("入参为 NULL, 请检查\n");
return -1;
}
if (my_class->count == 0){
printf("为空,不能删除\n");
return -1;
}
if (pos < 0 || pos >= my_class->count){
printf("插入位置错误");
return -1;
}
for (int i = pos; i < my_class->count-1; i++){
my_class->s[i] = my_class->s[i+1];
}
my_class->count--;
return 0;
}
int clean_seq_list(seq_list_t *my_class)
{
if (NULL == my_class){
printf("入参为 NULL, 请检查\n");
return -1;
}
my_class->count = 0;
return 0;
}
int destroy_seq_list(seq_list_t **my_class)
{
if(NULL == my_class || NULL == *my_class){
printf("入参为 NULL, 请检查\n");
return -1;
}
free(*my_class);
*my_class = NULL;
return 0;
}
int sort_seq_list(seq_list_t *my_class, int flag){
if(NULL == my_class){
printf("入参为 NULL, 请检查\n");
return -1;
}
int i = 0;
int j = 0;
stu_t temp;
if(0 == flag){//升序
for(i = 0; i < my_class->count-1; i++){
for(j = 0; j < my_class->count-1-i; j++){
if(my_class->s[j].data > my_class->s[j+1].data){
temp = my_class->s[j];
my_class->s[j] = my_class->s[j+1];
my_class->s[j+1] = temp;
}
}
}
}else if(1 == flag){//降序
for(i = 0; i < my_class->count-1; i++){
for(j = 0; j < my_class->count-1-i; j++){
if(my_class->s[j].data < my_class->s[j+1].data){
temp = my_class->s[j];
my_class->s[j] = my_class->s[j+1];
my_class->s[j+1] = temp;
}
}
}
}
return 0;
}