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

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

相关文章

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

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

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

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

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

MYSQL关联关系查询方式

《MYSQL关联关系查询方式》文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家... 目录mysql关联关系查询关联关系查询这个查询做了以下几件事MySQL自关联查询总结MYSQL关联关系查询

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

查询Oracle数据库表是否被锁的实现方式

《查询Oracle数据库表是否被锁的实现方式》本文介绍了查询Oracle数据库表是否被锁的方法,包括查询锁表的会话、人员信息,根据object_id查询表名,以及根据会话ID查询和停止本地进程,同时,... 目录查询oracle数据库表是否被锁1、查询锁表的会话、人员等信息2、根据 object_id查询被

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常