数据结构——单链表查询、逆序、排序

2024-09-05 11:36

本文主要是介绍数据结构——单链表查询、逆序、排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、思维导图

2、查、改、删算法

//快慢排序法找中间值
int mid_link(Link_t *plink)
{Link_Node_t *pfast = plink->phead;Link_Node_t *pslow = pfast;int m = 0;while(pfast != NULL){pfast = pfast->pnext;++m;if(m % 2 == 0){pslow = pslow->pnext;}}printf("%d\n",pslow->data);printf("%p\n",pslow);}//快慢排序法查询倒数第k个
Link_Node_t *recipe_link_count(Link_t *plink)
{Link_Node_t *pfast = plink->phead;Link_Node_t *pslow = pfast;int m = 0;int n;scanf("%d",&n);while(pfast != NULL && m < n){pfast = pfast->pnext;m++;}while(pfast != NULL){pfast = pfast->pnext;pslow = pslow->pnext;}//printf("%d\n",pslow->data);//printf("%p\n",pslow);return pslow;
}//删除指定节点
int pop_point_node(Link_t *plink)
{int n;int m = 0;printf("选择删除节点:");scanf("%d",&n);Link_Node_t *p = plink->phead;Link_Node_t *pdel = NULL;Link_Node_t *ptmp = NULL;if(p == NULL){return 0;}else if(p->data == n){pdel = p;plink->phead = p->pnext;}else if(p != NULL){while(p->data != n){ptmp = p;p = p->pnext;}pdel = p;ptmp->pnext = pdel->pnext;}free(pdel);return 0;
}

3、单链表逆序

//链表逆序
int reverse_link(Link_t *plink)
{if(is_empty_link(plink))return 0;Link_Node_t *ptmp = plink->phead;Link_Node_t *pinsert = NULL;plink->phead = NULL;while(ptmp != NULL){pinsert = ptmp;ptmp = ptmp->pnext;pinsert->pnext = plink->phead;plink->phead = pinsert;}
}

4、插入排序(从未排序部分取出一个元素,插入到已排序部分的正确位置)

void insert_sort_link(Link_t *plink)
{if(is_empty_link(plink) || 1 == plink->clen){return;}Link_Node_t *ptmp = plink->phead->pnext;Link_Node_t *pinsert = NULL;Link_Node_t *p = NULL;plink->phead->pnext = NULL;while(ptmp != NULL){pinsert = ptmp;ptmp = ptmp->pnext;if(pinsert->data <= plink->phead->data){pinsert->pnext = plink->phead; //头插plink->phead = pinsert;}else{p = plink->phead;while(p->pnext != NULL && p->pnext->data < pinsert->data){p = p->pnext;}pinsert->pnext = p->pnext;  //尾插p->pnext = pinsert;   }}
}

双向链表——插删查改:

#include<stdio.h>
#include"dlink.h"
#include<stdlib.h>DLink_t *create_doulink()
{DLink_t *pdoulink = malloc(sizeof(DLink_t));if(NULL == pdoulink){perror("fail creat");return NULL;}pdoulink->phead = NULL;pdoulink->clen = 0;pthread_mutex_init(&pdoulink->mutex,NULL);return pdoulink;
}//判空
int is_empty_doulink(DLink_t *pdoulink)
{return NULL == pdoulink->phead;
}//头插
int push_doulink_head(DLink_t *pdoulink,DataType data)
{DLink_Node_t *pnode = malloc(sizeof(DLink_Node_t));if(NULL == pnode){perror("fail malloc");return -1;}pnode->ppre = NULL;pnode->pnext = NULL;pnode->data = data;if(is_empty_doulink(pdoulink)){pdoulink->phead = pnode;}else{pnode->pnext = pdoulink->phead;pdoulink->phead->ppre = pnode;pdoulink->phead = pnode;}pdoulink->clen++;
}//遍历
void print_pdoulink(DLink_t *pdoulink,int flag)
{if(is_empty_doulink(pdoulink))return;DLink_Node_t *p = pdoulink->phead;if(flag){while(p != NULL){printf(" %d %s %d\n",p->data.id,p->data.name,p->data.score);p = p->pnext;}}else{while(p->pnext != NULL){p = p->pnext;}while(p != NULL){printf(" %d %s %d\n",p->data.id,p->data.name,p->data.score);p = p->ppre;}}}//尾插
int push_doulink_tail(DLink_t *pdoulink ,DataType data)
{DLink_Node_t *pnode = malloc(sizeof(DLink_Node_t));if(pnode == NULL){perror("fail malloc");return -1;}pnode->data = data;pnode->ppre = NULL;pnode->pnext = NULL;if((is_empty_doulink(pdoulink))){push_doulink_head(pdoulink,data);free(pnode);}else{DLink_Node_t *p = pdoulink->phead;while(p->pnext != NULL){p = p->pnext;}p->pnext = pnode;pnode->ppre = p;}}//头删
int pop_head(DLink_t *pdoulink)
{if(is_empty_doulink(pdoulink)){return 0;}DLink_Node_t *p = pdoulink->phead;pdoulink->phead = p->pnext;if(p->pnext != NULL){p->pnext->ppre = NULL;}free(p);
}//尾删
int pop_tail(DLink_t *pdoulink)
{DLink_Node_t *p = pdoulink->phead;if(is_empty_doulink(pdoulink)){return 0;}else if(p->pnext == NULL){pop_head(pdoulink);}else{while(p->pnext->pnext != NULL){p = p->pnext;}free(p->pnext);p->pnext = NULL;}
}//查找 name
DataType *find_dliink_data(DLink_t *pdoulink,char *data)
{if(is_empty_doulink(pdoulink))return NULL;DLink_Node_t *p = pdoulink->phead;while(p != NULL){if(strcmp(p->data.name,data) == 0){return &(p->data);}p = p->pnext;}return NULL;
}//修改(根据name查找)
void update_dlink_data(DLink_t *pdoulink,char *old_data,char *new_data)
{if(is_empty_doulink(pdoulink))return;DLink_Node_t *p = pdoulink->phead;while(p != NULL){if(strcmp(p->data.name,old_data) == 0){strcpy(p->data.name,new_data);break;}p = p->pnext;}}//销毁void destory_dlink(DLink_t *pdoulink)
{while(!(is_empty_doulink(pdoulink))){pop_head(pdoulink);}free(pdoulink);
}

这篇关于数据结构——单链表查询、逆序、排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138852

相关文章

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实