数据结构——顺表的创、销、增、删、改、查

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){
	ifNULL == *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 = 0for( 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.判断入参是否为空
	ifNULL == 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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值