//按位置进行修改
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;
}
思维导图