单链表交叉分离,运用头插法,尾插法(算法库应用)

原文博客链接:单链表分离(头插法和尾插法的结合,理解指针变换)_3.对任务1或者2中创建的某一个单链表{a1,b1,a2,b2,...,an,bn},编写一个算法将-CSDN博客

函数实现:

/**************************************************
函数名:separate_LinkList
功  能: 把一个链表,交叉新建成两个表,一个尾插法,一个头插法(尾插法在原表之上)
注意:① 等构建完再置空
参  数: (1)LinkList *&L:原表(2)LinkList *&List_tail:原表之上尾插法建立的新表(3)LinkList*&List_head: 另外新建的单链表(头插法)
原文链接:https://blog.csdn.net/qq_57484399/article/details/127132144
返回值:  无
**************************************************/
void separate_LinkList(LinkList *&L,LinkList *&List_tail,LinkList*&List_head)
{LinkList *newNode;                     //新节点LinkList *rearNode;                   //新节点后继信息存储LinkList *Tail_pointer;                //List_tail尾指针newNode = L->next;                      //新节点从L->next开始List_tail = L;                          //List_tail从L开始Tail_pointer = List_tail;List_head = (LinkList*)malloc(sizeof(LinkList));    //List_head构建新节点List_head->next = NULL;while(newNode != NULL){Tail_pointer->next = newNode;        //List_tail尾指针指向新节点Tail_pointer = newNode;              //①尾指针Tail_pointer后移,构建完成newNode = newNode->next;              //新节点后移rearNode = newNode->next;               //新节点后继信息存储newNode->next = List_head->next;        //新节点头插法插入List_head->next = newNode;newNode = rearNode;                      //书接上回}Tail_pointer->next = NULL;
}

完整代码:

main.cpp

#include <stdio.h>
#include <malloc.h>
#include "singlelist.h"void split(LinkList *&L,LinkList *&L1,LinkList*&L2);//分离链表
/**************************************************
函数名:separate_LinkList
功  能: 把一个链表,交叉新建成两个表,一个尾插法,一个头插法(尾插法在原表之上)
注意:① 等构建完再置空
参  数: (1)LinkList *&L:原表(2)LinkList *&List_tail:原表之上尾插法建立的新表(3)LinkList*&List_head: 另外新建的单链表(头插法)
原文链接:https://blog.csdn.net/qq_57484399/article/details/127132144
返回值:  无
**************************************************/
void separate_LinkList(LinkList *&L,LinkList *&List_tail,LinkList*&List_head)
{LinkList *newNode;                     //新节点LinkList *rearNode;                   //新节点后继信息存储LinkList *Tail_pointer;                //List_tail尾指针newNode = L->next;                      //新节点从L->next开始List_tail = L;                          //List_tail从L开始Tail_pointer = List_tail;List_head = (LinkList*)malloc(sizeof(LinkList));    //List_head构建新节点List_head->next = NULL;while(newNode != NULL){Tail_pointer->next = newNode;        //List_tail尾指针指向新节点Tail_pointer = newNode;              //①尾指针Tail_pointer后移,构建完成newNode = newNode->next;              //新节点后移rearNode = newNode->next;               //新节点后继信息存储newNode->next = List_head->next;        //新节点头插法插入List_head->next = newNode;newNode = rearNode;                      //书接上回}Tail_pointer->next = NULL;
}int main()
{LinkList *L1, *L2,*L;ElemType a[10]= {1,10,2,9,3,8,4,7,5,6};CreatList_Tail(L, a, 10);printf("输出L表结果:");DisplayLinkList(L);separate_LinkList(L,L1,L2);printf("L1表结果:");DisplayLinkList(L1);printf("L2结果:");DisplayLinkList(L2);return 0;}

singlelist.cpp  单链表函数库

#include "singlelist.h"/**************************************************
①函数名: CreatList_Head
功  能: 头插法建立单链表
参  数: (1)LinkList *&L: 传入的单链表指针地址(2)ElemType Array_used[]:要用来建表的数组(3)int Array_number: 数组的长度
返回值:    无
**************************************************/
void CreatList_Head(LinkList *&L, ElemType Array_used[], int Array_number)
{int counter;LinkList *newnode;L = (LinkList *)malloc(sizeof(LinkList)); //创建头结点L->next = NULL;for(counter = 0; counter < Array_number; counter++){newnode = (LinkList *)malloc(sizeof(LinkList));  //创建新节点newnode->data = Array_used[counter];newnode->next = L->next;         //将newnode插在原开始结点之前,头结点之后L->next = newnode;}
}
/**************************************************
②函数名: CreatList_Tail
功  能: 尾插法建立单链表
参  数: (1)LinkList *&L: 传入的单链表指针地址(2)ElemType Array_used[]:要用来建表的数组(3)int Array_number:数组的长度
返回值:   无
**************************************************/
void CreatList_Tail(LinkList *&L, ElemType Array_used[], int Array_number)
{int counter;LinkList *newnode,*tailnode;L = (LinkList *)malloc(sizeof(LinkList));//创建头结点L->next = NULL;tailnode = L;       //尾结点tailnode始终指向终端结点,开始指向头结点for(counter = 0; counter < Array_number; counter++){newnode = (LinkList *)malloc(sizeof(LinkList)); //创建新节点newnode->data = Array_used[counter];tailnode->next = newnode;   //将新节点插入到尾结点之后tailnode = newnode;         //更新尾结点}tailnode->next = NULL;          //终端结点next域置空
}/**************************************************
③函数名: DisplayLinkList
功  能: 输出单链表
参  数: (1)LinkList *L:将要输出的单链表
返回值: 无
**************************************************/void DisplayLinkList(LinkList *L)
{LinkList *shownode;shownode = L->next;while(shownode != NULL){printf("%d ",shownode->data);shownode = shownode->next;        //一直遍历,直到指向尾->newt = NULL}printf("\n");
}
/**************************************************
④函数名: DestroyLinkList
功  能: 销毁单链表
参  数: (1)LinkList *&L:要销毁的单链表
注意:① 等到指引下一个节点的指针为Null时就跳出,避免出现野指针,此时再销毁destroyNode② 避免断开联系,记录 销毁节点的下一个节点
返回值: 无
**************************************************/
void DestroyLinkList(LinkList *&L)
{LinkList *destoryNode,*nextNode;destoryNode = L;nextNode = destoryNode->next;while(nextNode != NULL)        //①{free(destoryNode);destoryNode = nextNode;nextNode = destoryNode->next;   //②}free(destoryNode);}
/**************************************************
⑤函数名: InitLinkList
功  能: 初始化单链表
参  数: LinkList *&L:要被初始化的链表指针地址
返回值: 无
**************************************************/
void InitLinkList(LinkList *&L)
{L = (LinkList *)malloc(sizeof(LinkList));//创建头结点L->next = NULL;
}
/**************************************************
⑥函数名: LinkListEmpty
功  能: 判断单链表是否为空
参  数: (1)LinkList *L:要判断的单链表
返回值: bool: 是否为空? treu:false
**************************************************/
bool LinkListEmpty(LinkList *L)
{return (L->next == NULL);
}/**************************************************
⑦函数名: LinkListLength
功  能: 返回单链表L中数据节点的个数
参  数: LinkList *L:要计算的数据节点
返回值: int: 线性表数据节点个数值
**************************************************/
int LinkListLength(LinkList *L)
{int counter = 0;LinkList *nowNode = L;while(nowNode->next != NULL){counter++;nowNode = nowNode->next;}return counter;
}/**************************************************
⑧函数名: GetLocateValue
功  能: 求特定位置的数据元素值
参  数: (1)LinkList *L:要找的单链表(2)int location:所要找的位置(3)ElemType &value: 传递回所要找的值
注意: ① 判断跳出的时候, 是查找成功, 还是抵达末尾② counter == 要找到序号,则跳出,所以counter < location  ,nowNode指向的节点为空,则到末尾,则跳出③④ 这两条语句, 所指向的序号和节点, 是同步的, 位置到或者此节点为空,则跳出
返回值: bool: 是否查找成功? true:false
**************************************************/
bool SpecificLocate_Value(LinkList *L,int location, ElemType &value)
{int counter = 0;LinkList *nowNode = L;while(counter < location && nowNode != NULL)//②{counter++;          //③  当前计数的节点nowNode = nowNode->next;//④当前遍历到的节点}if(nowNode == NULL)                //①{return false;}else{value = nowNode->data;return true;}}/**************************************************
⑨函数名:SpecificValue_Location
功  能: 查找特定数据值的节点,并返回其位置
参  数: (1)LinkList *L: 被查找的单链表(2)ElemType e:
注  意:  ①从头结点后的第一个节点开始找②while循环内的两条语句是同步指向的③当nowNode为空时(到达末尾仍未找到), counter作废④当nowNode不为空时,跳出时, counter表示所指向节点存在,并符合所需
返回值:
**************************************************/
int SpecificValue_Location(LinkList *L, ElemType value)
{int counter = 1;LinkList *nowNode = L->next;    //①while(nowNode != NULL && nowNode->data != value){nowNode = nowNode->next;counter++;                     //②}if(nowNode == NULL)           //③{return 0;}else                    //④{return counter;}}
/**************************************************
⑩函数名: LinkList_InsertElement
功  能: 在单链表特定位置插入节点
参  数: (1)LinkList *&L:要插入的单链表(2)int location:要插入的位置(3) ElemType &value:插入的数据
思路:    先在单链表L中,找到第 i-1个节点(不算头结点),若存在这样的节点,将值为value的节点 插入到其后面
注意:    ① 计数器和 nowNode是同步往后移动(从L->next开始算第一个节点),直到 找到counter = location-1,②此时 nowNode不为空,则此时nowNode指向要插入位置的 前一个节点③ 覆盖指针前, 牢记 nowNode->next里面存放的是后继节点信息,所以要先处理newNode->next = nowNode->next;然后我们才能再把 nowNode->next指向新节点 newNode
返回值: bool: 是否存在第i-1个节点,并插入成功? true : false
**************************************************/
bool LinkList_InsertElement(LinkList *&L, int location, ElemType &value)
{int counter = 0;LinkList *nowNode = L;LinkList *newNode;while((counter < (location-1)) && (nowNode != NULL)) //①{counter++;nowNode = nowNode->next;}if(nowNode == NULL)//②{return false;}else{newNode = (LinkList *)malloc(sizeof(LinkList));newNode->data = value;newNode->next = nowNode->next;//③nowNode->next = newNode;return true;}
}
/**************************************************
(11)函数名: LinkList_Delete_Location
功  能: 删除特定位置的节点元素
参  数: (1)LinkList *&L:被删除的单链表 (2)int location:特定位置(3) ElemType &value:被删除的元素值
思路:    找到第location-1个元素, 存储第locataion个元素值(判断null),然后free链接 location-1 和 location+1
注意:    ① counter和指针节点是同步的,要么找到location-1个节点,要么到末尾② 虽然可能找到location-1个元素,其可能是最后一个元素,从而导致删除失败需要判断一下,deleteNode是否为空,才能得出是否任务成功③ 指针覆盖还是老生常谈,先存储一下deleteNode(方便free),然后指针交替,然后free
返回值:  bool: 是否删除成功? true:false
**************************************************/
bool LinkList_Delete_Location(LinkList *&L,int location, ElemType &value)
{int counter = 0;LinkList *nowNode = L;LinkList *deleteNode;while(counter < (location-1) && nowNode != NULL)   //①{counter++;nowNode = nowNode->next;}if(nowNode == NULL){return false;}else{deleteNode = nowNode->next;if(deleteNode == NULL)    //②{return false;}value = deleteNode->data;nowNode->next = deleteNode->next;  //③free(deleteNode);return true;}
}/**************************************************
(12)函数名: DeleteMaxNode
功  能: 删除单链表中最大的一个节点
参  数: (1)LinkList *&L:要删除节点的单链表
思路: 四个指针, 最大指针,最大指针前一个节点目前遍历的指针,遍历指针的前一个节点, 边比较,边替换,边遍历
注意:①避免只有一个头结点,造成空指针替换异常②③ 顺序不能变,因为③跳出的时候, 会利用到while的非空条件,避免对比的时候, 出现野指针,直到为空时,即可直接跳出,非空则比较替换
返回值:是否删除成功 ? true:false
**************************************************/
bool   DeleteMaxNode(LinkList *&L)
{LinkList *nowNode,*preNode;LinkList *maxNode,*preMaxNode;nowNode = L->next;preNode = L;maxNode = nowNode;preMaxNode = preNode;if(nowNode == NULL) //①{return false;}while(nowNode != NULL) //直到末尾{if(nowNode->data > maxNode->data)   //②{maxNode = nowNode;preMaxNode = preNode;}preNode = nowNode;       //接着走下一个节点nowNode = nowNode->next;   //③}preMaxNode->next = maxNode->next;free(maxNode);return true;
}/**************************************************
(13)函数名:LinkList_sorting
功  能:对单链表中元素进行排序(至少有2个数据节点)
参  数:LinkList *&L:要进行排序的单链表
注意: ① 空表,或者只有一个数据节点,则不需要排序,返回false② 开始节点必须是头结点,因为我们会用到start_compare->next,③ 把数据节点(第二个数据节点及以后)和原始链表(头结点+一个数据节点)④ 在有序表中,一直找到比前一个节点大,比后一个节点小的空挡,所以时刻对比start_compare->next->data, 并且start_compare->next不能为空(为空代表到达末尾,交替空指针)⑤ 顺序不能变, 避免丢失有序表后续信息(指针覆盖的一句话)
详细链接:https://blog.csdn.net/qq_57484399/article/details/127141307
返回值:bool: 是否符合排序标准,并排序成功  ? true: false
**************************************************/
bool LinkList_sorting(LinkList *&L)
{LinkList *compare,*start_compare,*Remaining_node;if(L->next == NULL || L->next->next == NULL)//①保证至少有2个数据节点{return false;}compare = L->next->next;start_compare = L;  //②开始节点必须是头结点Remaining_node = compare->next;L->next->next = NULL; //③把数据节点(第二个数据节点及以后)和原始链表(头结点+一个数据节点)while(compare != NULL){Remaining_node = compare->next;start_compare = L;while((start_compare->next != NULL) && (compare->data > start_compare->next->data)){start_compare = start_compare->next;} //④compare->next = start_compare->next;start_compare->next = compare;     //⑤compare = Remaining_node;}return true;}

singlelist.h  单链表函数库头文件

#ifndef SINGLELIST_H_INCLUDE
#define SINGLELIST_H_INCLUDE#include <stdio.h>
#include <malloc.h>typedef int ElemType;   //定义单链表节点类型typedef struct LNode
{ElemType data;struct LNode *next; //指向后继节点}LinkList;
//①头插法建立单链表
void CreatList_Head(LinkList *&L, ElemType Array_used[], int Array_number);
//②尾插法建立单链表
void CreatList_Tail(LinkList *&L, ElemType Array_used[], int Array_number);
//③输出单链表
void DisplayLinkList(LinkList *L);
//④销毁单链表
void DestroyLinkList(LinkList *&L);
//⑤ 初始化线性表
void InitLinkList(LinkList *&L);
//⑥ 判断线性表是否为空表
bool LinkListEmpty(LinkList *L);
//⑦ 返回单链表L中数据节点的个数
int LinkListLength(LinkList *L);
//⑧ 求线性表L中指定位置的某个数据元素
bool SpecificLocate_Value(LinkList *L,int location, ElemType &value);
//⑨ 按元素值查找特定元素的位置
int SpecificValue_Location(LinkList *L, ElemType value);
//⑩ 把元素插入到特定位置
bool LinkList_InsertElement(LinkList *&L, int location, ElemType &value);
//(11) 删除特定位置的节点元素
bool LinkList_Delete_Location(LinkList *&L,int location, ElemType &value);
//(12)单链表删除其中其最大节点元素
bool  DeleteMaxNode(LinkList *&L);
//(13)对单链表中元素进行排序(至少有2个数据节点)
bool LinkList_sorting(LinkList *&L);
#endif // SINGLELIST_H_INCLUDE

代码运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电机控制杂谈——永磁同步电机中的永磁体谐波反电势

1.问题的引出 在我的谐波抑制专题中&#xff0c;讲了三种谐波抑制的策略。当时是通过增大逆变器死区来产生较大的谐波。但是在实际电机里面&#xff0c;我感觉死区的影响基本上没有。。。课题组的驱动器中&#xff0c;逆变器的非线性其实基本可以忽略不计了。 但是&#xff0…

怎么配置Dubbo的容错机制?

Dubbo的容错机制用于处理在分布式环境中可能出现的故障和异常情况&#xff0c;以保障系统的稳定性和可靠性。Dubbo提供了多种容错机制&#xff0c;可以根据实际情况进行配置。以下是几种常见的容错机制及其适用场景&#xff1a; Failover&#xff08;重试&#xff09;&#xff…

langchin-chatchat部分开发笔记(持续更新)

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径及一点个人思考大模型应用开发实用开源项目汇总大模型问答项目…

Spring MVC Thymeleaf在一个表单中的多个提交按钮

今天遇见一个form需要两个button提交显示不同Controller的需求 一开始解决思路&#xff1a; 我有一个HTML页面的一个窗体和2个按钮的片段&#xff1a; <form action"#" data-th-action"{/action/edit}" data-th-object"${model}" method&qu…

JS获取本机IP地址的2种方法

目录 1.获取本机IP地址方法1&#xff1a;2.获取本机IP地址方法2解决方案&#xff1a; 1.获取本机IP地址方法1&#xff1a; if(typeof window ! undefined){var RTCPeerConnection window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnectio…

SpringBoot中处理校验逻辑的两种方式:Hibernate Validator+全局异常处理

最近正在开发一个校园管理系统&#xff0c;需要对请求参数进行校验&#xff0c;比如说非空啊、长度限制啊等等&#xff0c;可选的解决方案有两种&#xff1a; 一种是用 Hibernate Validator 来处理一种是用全局异常来处理 两种方式&#xff0c;我们一一来实践体验一下。 一、…

AXI4-Stream Interconnect IP核(1)——原理

一、概述 AXI4-Stream Interconnect 是复杂片上系统&#xff08;SoC&#xff09;和现场可编程门阵列&#xff08;FPGA&#xff09;应用设计中的关键组件&#xff0c;它负责在系统内部不同模块之间路由数据流。AXI4-Stream协议是ARM引入的AMBA&#xff08;高级微控制器总线架构&…

httpClient使用介绍

HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新的版本和建议。 就是用来发送http请求或者解析http响应的。 导入依赖&#xff1a; <dependency…

插入排序和希尔排序:

插入排序 1. 算法思想&#xff1a; 由数组下标为1 开始的数值作为判断依据&#xff0c;与之前的数据从后往前比较定义tmp 暂存判断的数值&#xff0c;若前面的数据大于tmp&#xff0c;则将前面的数据向后移动 : arr[j1]arr[j]若对比的数据比tmp 大&#xff0c;则往后移&#…

Mysql中的执行计划怎么分析?

一、背景 在我们日常工作中&#xff0c;我们可能会遇到一些慢SQL语句或者要对一些SQL进行性能优化&#xff0c;那么就需要使用explain对SQL进行执行计划分析了。Mysql中的执行计划可以通过EXPLAIN或DESCRIBE关键字获取&#xff0c;当我们拿到执行计划后可以帮助我们分析这条sq…

JavaIO流与字节输出流OutputStream

1 概述 1.1 什么是IO流 IO流是存储和读取数据的解决方案&#xff0c;用于读写文件中的数据&#xff08;包括本地文件、网络等&#xff09; IO流的参照是程序或内存&#xff0c;即使程序在读&#xff0c;程序在写。 1.2 IO的分类 根据流的方向分为&#xff1a;输入流和输出流…

C++STL学习之unordered_map与unordered_set(底层Hash)

前言&#xff1a;我们前面已经学习论map和set&#xff0c;现在又冒出来一个unordered_map和unordered_set&#xff0c;这两个有啥差别吗&#xff1f;前面我们已经说过&#xff0c;map和set的底层是红黑树&#xff0c;那unordered_map和unordered_set的底层是什么呢&#xff1f;…

入门指南:使用Spark MLlib进行数据处理和机器学习

引言&#xff1a; 在当今大数据时代&#xff0c;数据处理和机器学习成为了许多企业和数据科学家的核心任务。然而&#xff0c;处理大规模数据和训练复杂的机器学习模型并不容易。幸运的是&#xff0c;Apache Spark提供了一个强大的机器学习库&#xff0c;即Spark MLlib&#xf…

esp32CAM环境搭建(arduino+MicroPython+thonny+固件)

arduino ide 开发工具 arduino版本&#xff1a;1.8.19 arduino ide 中文设置&#xff1a;​ file >> preferences >> ​ arduino IDE 获取 ESP32 开发环境&#xff1a;打开 Arduino IDE &#xff0c;找到 文件>首选项 ,将 ESP32 的配置链接填入附加开发板管理网…

TypeScript实战使用技巧分享

TypeScript使用分享 前言 本次技术分享是想将自己使用TypeScript&#xff08;TS&#xff09;的经验给大家做一个技术分享。主要目的是分享我使用TS的方式或者习惯&#xff0c;以及怎么在项目中更好的使用它&#xff0c;而不是对TS这门语言的学习。并非说需要大家都去这样写&a…

python --dejavu音频指纹识别

Dejavu是一个用于音频指纹识别的Python库&#xff0c;它能够将音频文件转换成独特的指纹&#xff0c;然后通过比对数据库中已知音频的指纹&#xff0c;识别出输入音频的来源或相似音频。Dejavu库支持多种类型的音频文件&#xff0c;包括MP3、WAV等&#xff0c;同时也支持在不同…

【Canvas与艺术】简约式胡萝卜配色汽车速度表

【效果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>胡萝卜色汽车速度仪表盘简化版</title><style type"…

go |struct embedding、generics、goroutine

go 的结构内嵌 注意点&#xff0c;有点像js func main() {fmt.Println("hello zhangbuda...")// 这个内嵌 和 js 有点像co : container{base: base{num: 22,},str: "zhangdbau hahahahah ",}fmt.Println("co: ", co)/*在 Go 语言中&#xff0c;如…

Linux学习第三天(gcc/g++的使用、gdb的使用)

1、gcc的四个阶段 预处理 预处理功能主要包括宏定义&#xff0c;文件包含&#xff0c;条件编译&#xff0c;去注释预处理指令是以#号开头的代码行例子&#xff1a;gcc -E hello.c -o hello.i选项&#xff1a;-E 该选项的作用是让gcc在预处理之后停止编译过程选项&#xff1a;-…

设置mysql 数据库和表 的编码方式UTF-8

要设置 MySQL 数据库表和字段的编码方式为 UTF-8&#xff0c;可以使用下面的SQL语句&#xff1a; 1. 设置数据库默认编码为 UTF-8&#xff1a; ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2. 创建表时指定编码为 UTF-8&#xff1a…