单链表算法库

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;}
}
/**************************************************
函数名: 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;}
}/**************************************************
函数名: 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;
}

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);#endif // SINGLELIST_H_INCLUDE

main.cpp 测试函数

#include <stdio.h>
#include "singlelist.h"int main()
{ElemType elem;//定义两个链表LinkList *L1,*L2;ElemType a[8] = {5,4,3,2,1,6,7,8};CreatList_Head(L1,a,8);printf("头插法结果:\n");DisplayLinkList(L1);CreatList_Tail(L2,a,8);printf("尾插法结果:\n");DisplayLinkList(L2);if(LinkListEmpty(L1) == 0){printf("L1不是空表\n");printf("L1有%d个数据元素\n",LinkListLength(L1));}if(SpecificLocate_Value(L1,2,elem)){printf("L1第%d个元素是%d\n",2,elem);}if(SpecificLocate_Value(L2,2,elem)){printf("L2第%d个元素是%d\n",2,elem);}printf("4在L2中第%d个位置\n",SpecificValue_Location(L2,4));if(LinkList_InsertElement(L2,2,elem)){printf("成功向L2的第%d个位置插入%d\n",2,elem);DisplayLinkList(L2);}if(LinkList_Delete_Location(L2,2, elem)){printf("成功删除L2的第2个元素%d\n",elem);DisplayLinkList(L2);}printf("删除L2最大的元素:\n");DeleteMaxNode(L2);DisplayLinkList(L2);
//    InitLinkList(L2);printf("删除L2最大的元素:\n");if(DeleteMaxNode(L2)){printf("删除成功!\n");DisplayLinkList(L2);}
}

测试结果:

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

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

相关文章

SpringBoot Redis 之Lettuce 驱动

一、前言 一直以为SpringBoot中 spring-boot-starter-data-redis使用的是Jredis连接池&#xff0c;直到昨天在部署报价系统生产环境时&#xff0c;因为端口配置错误造成无法连接&#xff0c;发现报错信息如下&#xff1a; 一了解才知道在SpringBoot2.X以后默认是使用Lettuce作…

公链角逐中突围,Solana 何以成为 Web3 世界的流量焦点?

在众多区块链公链中&#xff0c;Solana 凭借其创纪录的处理速度和极低的交易费用&#xff0c;成为了众多开发者和投资者的宠儿。就像网络上流行的那句话所说&#xff1a;“Why slow, when you can Solana?”&#xff0c;Solana 正以它的速度和强大的生态系统&#xff0c;重新定…

一个传入省市区ID的级联框

省市区ID 功能edit页面(主要)script逻辑如何拿到当前级联下所有ID数组长ID数组是如何回显的 (1)长ID数组是如何回显的 (2) 功能 选择第一层传第一层下的所有 id 数组&#xff0c;选择第二层传递第二层以及第二层下的所有 id 数组 edit页面(主要) 编辑页的一个 Table&#xff0c…

蓝桥杯刷题计划-洛谷-持续更新

P8598 [蓝桥杯 2013 省 AB] 错误票据 题目 #include <bits/stdc.h> #define endl \n #define int long long #define INF 0x3f3f3f3f3f const int N 1000010; using namespace std; int arr[N]; signed main() {int N;cin>>N;int idx;while(cin>>arr[idx…

NetCore3.1 Controller中直接返回JObject对象抛出异常解决方案

问题描述 在NetCore 3.1的Web项目中&#xff0c;Controller有一个方法直接返回JObject对象时&#xff0c;抛出了异常 S y s t e m . N o t S u p p o r t e d E x c e p t i o n : T h e c o l l e c t i o n t y p e ′ N e w t o n s o f t . J s o n . L i n q . J O b j …

MybatisPlus速成

MybatisPlus快速入门 快速入门入门案例常见注解常见配置 核心功能条件构造器自定义SQLService接口 扩展功能代码生成静态工具逻辑删除枚举处理器JSON处理器 插件功能分页插件通用分页实体 参考文档 mybatis-plus参考文档 全部资料链接 讲义 快速入门 入门案例 <dependency…

【QT入门】 QListWidget各种常见用法详解之列表模式

往期回顾 【QT入门】 Qt代码创建布局之setLayout使用-CSDN博客 【QT入门】 Qt代码创建布局之多重布局变换与布局删除技巧-CSDN博客 【QT入门】 QTabWidget各种常见用法详解-CSDN博客 【QT入门】 QListWidget各种常见用法详解之列表模式 QListWidget有列表和图标两种显示模式&a…

如何通过vscode连接到wsl

下载wsl扩展 远程连接模式

EDA 全加器设计及例化语句应用

文章目录 前言一、全加器是什么&#xff1f;二、使用步骤1.半加器2.全加器1.新建一个全加器工程2.添加半加器的.v文件到全加器工程中3.新建全加器.v文件&#xff0c;写程序&#xff0c;调用半加器.v文件 完成例化 三、仿真效果总结 前言 提示&#xff1a;这里可以添加本文要记…

【机器学习】数据探索(Data Exploration)---数据质量和数据特征分析

一、引言 在机器学习项目中&#xff0c;数据探索是至关重要的一步。它不仅是模型构建的基础&#xff0c;还是确保模型性能稳定、预测准确的关键。数据探索的过程中&#xff0c;数据质量和数据特征分析占据了核心地位。数据质量直接关系到模型能否从数据中提取有效信息&#xff…

Vue挂载全局方法

简介&#xff1a;有时候&#xff0c;频繁调用的函数&#xff0c;我们需要把它挂载在全局的vue原型上&#xff0c;方便调用&#xff0c;具体怎么操作&#xff0c;这里来记录一下。 一、这里以本地存储的方法为例 var localStorage window.localStorage; const db {/** * 更新…

map与set容器常见操作详解(含示例代码及注意事项)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…