dataStructureDay050807

文章介绍了链表操作的四个关键功能:按位置和值更新链表元素、链表排序(升序/降序)、链表递归销毁以及链表反转的递归实现方法。
摘要由CSDN通过智能技术生成
//按位置进行修改
int list_updata_pos(LinkListPtr L,int pos,datatype e){
	//判断逻辑
	if(NULL==L|| list_empty(L)|| pos<1|| pos>L->len){
		printf("修改失败\n");
		return 0;
	}

	//找到对应位置的节点
	LinkListPtr p = list_search_pos(L,pos);
	if(NULL==p){
		return 0;
	}

	//将要修改成的值,赋给节点的数据域
	p->data = e;

	printf("修改成功\n");
	return 1;
}

//按值进行修改
int list_updata_value(LinkListPtr L,datatype olde,datatype newe){
	//判断逻辑
	if(NULL==L|| list_empty(L)){
		printf("修改失败\n");
		return 0;
	}
	//如果修改前后数据相同,没有修改的必要,并且防止后面的循环进入死循环
	if(olde==newe){
		printf("你修改你马呢\n");
		return 1;
	}
	//修改
	int index = 0;
	//按值找到位置并修改后,再次遍历修改后的链表,如果仍有符合要修改的值的,继续返回
	//下标进行修改,如果没有了,那么函数会返回0,跳出循环
	while((index = list_search_value(L,olde))){
		list_updata_pos(L,index,newe);
	}

	printf("修改成功\n");
	return 0;

}
//链表的排序
int list_sort(LinkListPtr L,int flag){
	//判断逻辑
	if(NULL==L|| list_empty(L)){
		printf("修改失败\n");
		return 0;
	}
	int i = 0;
	int j = 0;
	int index = 1;
	datatype tmp;
	//如果标志位为0为降序排列,否则升序排列,使用选择排序
	for(i=1; i<=L->len; i++){
		index = i;
		for(j=i; j<=L->len; j++){
			if((!flag)&&(list_search_pos(L,index)->data<list_search_pos(L,j)->data)){
				index = j;
			}else if(flag&&(list_search_pos(L,index)->data>list_search_pos(L,j)->data)){
				index = j;
			}
		}
		if(index!=i){
			tmp = list_search_pos(L,index)->data;
			list_search_pos(L,index)->data = list_search_pos(L,i)->data;
			list_search_pos(L,i)->data = tmp;
		}
	}
	

	printf("排序成功\n");
	return 1;
}

//链表的销毁递归方式
void list_free_recursion(LinkListPtr L){
	//判断逻辑
	if(NULL==L){
		printf("释放结束\n");
		return ;
	}else{
		list_free_recursion(L->next);
		free(L);
		L=NULL;
	}
	return;
}

//递归实现链表反转
LinkListPtr list_reverse_recursion(LinkListPtr L,LinkListPtr p){
	//判断逻辑
	if(L->len <=1){
		printf("反转失败\n");
		return NULL;
	}
	if(NULL==p->next){
		L->next = p;
		return p;
	}
		list_reverse_recursion(L,p->next)->next = p;
		p->next = NULL;
}

 思维导图

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值