1.顺序表
1.1含义:
基于数组,顺序存储在连续内存空间中。
1.2特点:
随机访问O(1),插入和删除O(n)
可用指针实现动态扩展和缩小容量
2.顺序表的操作
2.0定义数据类型、结点
//定义数据元素类型
typedef int Data_type;
//定义结点的数据类型
typedef struct Node{
Data_type data;
struct Node* pNext;
}List;
2.1创建
//功能:创建一个顺表
//参数:void
//返回值:List*
List* Creat_List (void){
List* pList = (List*)malloc(sizeof(List));//申请空间
if(NULL == pList){
return NULL;
}
memset(pList, 0, sizeof(List)); //初始化
return pList;
}
2.2销毁
顺表销毁,直接释放头结点
//功能:销毁顺表
//参数:顺表首地址的地址List** ppList
//返回值:int,成功返回OK(=0),失败返回失败原因(枚举定义)
int Destroy_List(List** ppList){
if(NULL == *ppList){ //入参判断
return NULL_ERROR;
}
free(*ppList); //释放头结点
*ppList = NULL;
return OK;
}
2.3插入
1.判满;2.判位置;3.移动元素;4.插入元素;5.计数count++
//功能:按照位置插入数据
//参数:1.顺表首地址List* List;
2.插入的位置 int pos;
3.插入的数据 Data_type item
//返回值:成功返回OK,失败返回失败原因
int Insert_List(List* pList, int pos, Data_type item){
//1.判断顺表是否存在
if(NULL == pList){
return NULL_ERROR;
}
//2.判断表满否,表满不能存
if(N == pList->count){
return FULL_ERROR;
}
//3.判断插入位置是否正确
if(pos<0 || pos>pList->count){
return POS_ERROR;
}
//4.插入数据
//4.1移动数据, 空出数组下标为pos的位置,pos~(count-1) 依次向后移动一位
int i = 0;
for( i=pList->count-1; i>=pos; i-- ){
pList->arr[i+1] = pList->arr[i];
}
//4.2赋值
pList->arr[pos] = item;
//5.计数变量+1
pList->count++;
return OK;
}
2.4删除
1.判断顺表是否存在
2.判断要删的位置pos是否合适
3.保存要删的数据
4,pos之后的值直接向前移动一位,(pos+1) ~ (count-1)
5.计数变量减1
//功能:删除一个元素
//参数:1.顺表首地址List* pList
2.要删的位置
3.保存删除数据
//返回值:int
int Del_list(List* pList, int pos, data_type* item){
//1.判断顺表是否存在
if(NULL == pList){
return NULL_ERROR;
}
//2.判断顺表是否为空
if(0 == pList->count){
return EMPTY;
}
//3.判断删除位置是否合适
if( pos<0 || pos>count-1 ){
return POS_ERROR;
}
//4.保存被删值
*item = pList->arr[pos];
//5.移动数据,从前往后移动
int i = 0;
for( i=pos+1; i<=pList->count-1; i++){
pList->arr[i-1] = pList->arr[i];
}
//6.计数变量减1
pList->count--;
return OK;
}
2.5显示顺表
//功能:显示一个顺表
//参数:1.首地址
//返回值:成功返回OK,失败返回失败原因
int Show_List(List* pList){
if(NULL == pList){
return NULL_ERROR;
}
int i = 0;
for( i=0; i<pList->count-1; i++){
printf("%d ", pList->arr[i]);
}
return OK;
}
2.6查找
//功能:查一个值,pos记录
//参数:1首地址,2要查的元素,3存储位置的指针
//返回值:成功返回OK,失败返回失败原因
int Search_List(List* pList, data_type elem, int* pos){
//1.判断入参是否为空
if(NULL == pList){
return NULL_ERROR;
}
//2.遍历顺表,找值,并记录下标,0 ~ count-1
int i = pList->count-1;
for( i=pList->count-1; i>=0; i--){
if(elem == pList->arr[i]){
*pos = i;
return OK;
}
}
return NO_VALUE;
}
2.7改值
//功能:修改某位置上的元素
//参数:1首地址 2位置 3要改的值
//返回值:int 成功返回OK,失败返回失败原因
int Update_List(List* pList, int pos, data_type elem){
if(NULL == pList){
return NULL_ERROR;
}
//pos是数组下标,数组第pos+1个值
pList->arr[pos] = elem;
}