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

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

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

mysql关联查询速度慢的问题及解决

《mysql关联查询速度慢的问题及解决》:本文主要介绍mysql关联查询速度慢的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql关联查询速度慢1. 记录原因1.1 在一次线上的服务中1.2 最终发现2. 解决方案3. 具体操作总结mysql

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要