一、单链表公共头文件
#ifndef __MYHEAD_H__
#define __MYHEAD_H__
/******************************************************************
* @file :myhead.h
* @brief :公共头文件定义
* @details :常用的库文件包含,函数结果状态标志
* @author :kxwslmsps
* @email :
* @version :
* @date :2023-00-00
******************************************************************/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
// 定义函数结果状态标志
#define OK 1 ///< OK:表示操作成功
#define ERROR 0 ///< ERROR:表示某结构不存在
#define TRUE 1 ///< TRUE:表示真
#define FALSE 0 ///< FALSE:表示假
#define ERR_PARA -1 ///< ERR_PARA:传入实参值不符合要求
#define ERR_OVERFLOW -2 ///< ERR_OVERFLOW:内存溢出
/// @brief 函数结果状态标志
typedef int status;
#endif // !__MYHEAD_H__
二、定义单链表结构
#ifndef __MYLINKLIST_H__
#define __MYLINKLIST_H__
/******************************************************************
* @file :myLinkList.h
* @brief :单链表头文件定义
* @details :链表结点定义,链表结构定义,链表常用函数接口声明,包括:
* :init,clear,destroy,output,size,empty,findPre,find,
* :locate,locateTail,creatNode,insertNode,push_back,
* :push_front,pop_back,pop_front,insert,remove,
* @details :链表结点结构定义,链表结构定义,及单链表基本实现的函数接口
* @author :kxwslmsps
* @email :[email protected]
* @version :1.0
* @date :2023-01-014
******************************************************************/
#include "myhead.h"
#define INIT_SIZE 10 ///< 定义一个初始宏常量
typedef void(myOpFunType)(void*); ///< 定义操作函数类型
typedef int linkType; ///< 定义链表结点数据域数据类型
/// @brief 链表结点定义
typedef struct t_linkNode
{
struct t_linkNode* pnext; ///< 结点指针域
linkType data; ///< 结点数据域
}myLNode;
/// @brief 链表结构定义
typedef struct t_linkList
{
myLNode* phead; //< 链表头结点
}myLinkList;
/// @mybrief 初始化单链表
/// @param plist:链表结构指针
/// @return status:返回初始化结果
/// @retval ERROR(0):链表不存在,不可操作
/// @retval ERR_OVERFLOW(-2):创建头结点失败,初始化失败
/// @retval OK(1):初始化成功
/// @attention 内部实现函数的开参是二指指针
status xxx_init(myLinkList* plist);
status xxx_init_(myLNode** phead);
/// @mybrief 清空单链表
/// @param plist:链表结构指针
/// @return 无返回值
void xxx_clear(myLinkList* plist);
void xxx_clear_(myLNode* phead);
void xxx_destroy(myLinkList* plist);
void xxx_destroy_(myLNode* phead);
/// @brief 通过键盘输入元素创建单链表
/// @param plist 链表指针
/// @param flag 当从键盘输入的内容与flag相等时,结束键盘输入
void xxx_input(myLinkList* plist, linkType flag);
void xxx_input_(myLNode* phead, linkType flag);
/// @brief 打印链表
/// @param plist 链表指针
/// @param opf 回调函数指针,指向具体的打印函数
void xxx_output(const myLinkList* plist, myOpFunType* opf);
void xxx_output_(const myLNode* phead, myOpFunType opf);
/// @brief 求链表结点个数
/// @param plist 链表指针
/// @return 返回结点个数
/// @retval -1:链表不存在
/// @retval 非负整数:链表结点个数
int xxx_size(const myLinkList* plist);
int xxx_size_(const myLNode* phead);
/// @brief 判空函数
/// @param plist 链表指针
/// @return status:返回链表是否为空
status xxx_empty(const myLinkList* plist);
/// @brief 查找x元素第一次出现在链表时所在结点的前驱结点
/// @param plist 链表指针
/// @param x 待查找元素
/// @return 返回前驱结点地址
/// @retval 非NULL:查找成功
/// @retval 0地址值:查找失败
myLNode* xxx_findPre(myLinkList* plist, linkType x);
myLNode* xxx_findPre_(myLNode* phead, linkType x);
/// @brief 查找元素x第一次出现在链表时所在的结点
/// @param plist 链表指针
/// @param x 待查元素
/// @return 返回查找结果
/// @retval 非NULL:查找成功
/// @retval 0地址值:查找失败
myLNode* xxx_find(myLinkList* plist, linkType x);
myLNode* xxx_find_(myLNode* phead, linkType x);
/// @brief 定位链表第pos个位序结点的前驱
/// @param plist :链表指针
/// @param pos :位序,取值范围是[1,size]
/// @return 返回第pos个结点的前驱
myLNode* xxx_locatePre(myLinkList* plist, int pos);
myLNode* xxx_locatePre_(myLNode* phead, int pos);
/// @brief 定位链表第pos个位序结点的前驱
/// @param plist :链表指针
/// @param pos :位序,取值范围是[1,size]
/// @return 返回第pos个结点的前驱
myLNode* xxx_locate(myLinkList* plist, int pos);
myLNode* xxx_locate_(myLNode* phead, int pos);
/// @brief 定位链表尾结点
/// @param plist
/// @return 返回定位结果
/// @retval 非NULL:尾结点地址
/// @retval NULL:定位失败
myLNode* xxx_locateTail(myLinkList* plist);
myLNode* xxx_locateTail_(myLNode* phead);
/// @brief 给定元素x,创建堆上链表结点
/// @return 返回所创建结点的地址
/// @retval NULL:创建结点失败
/// @retval 非NULL:所创建结点地址
myLNode* xxx_createNode(linkType x);
/// @brief 在链表头部插入元素x,即头插法
/// @param plist 链表指针
/// @param x 待插元素
/// @return 返回插入是否成功
/// @retval ERROR(0):链表不存在,不可操作
/// @retval - ERR_OVERFLOW(-2):创建新结点失败,插入失败
/// @retval OK(1):插入成功
status xxx_push_front(myLinkList* plist, linkType x);
status xxx_push_front_(myLNode* phead, linkType x);
/// @brief 在链表尾部插入元素x,即尾插法
/// @param plist 链表指针
/// @param x 待插元素
/// @return 返回插入是否成功
/// @retval ERROR(0):链表不存在,不可操作
/// @retval - ERR_OVERFLOW(-2):创建新结点失败,插入失败
/// @retval OK(1):插入成功
status xxx_push_back(myLinkList* plist, linkType x);
status xxx_push_back_(myLNode* phead, linkType x);
/// @brief 删除链表首元结点,即头删法
/// @param plist 链表指针
/// @return 返回是否删除成功标志
/// @retval ERROR(0):链表不存在或链表为空,不可操作
/// @retval OK(1):删除成功
status xxx_pop_front(myLinkList* plist);
status xxx_pop_front_(myLNode* phead);
/// @brief 删除链表尾结点,即尾删法
/// @param plist 链表指针
/// @return 返回是否删除成功标志
/// @retval ERROR(0):链表不存在或链表为空,不可操作
/// @retval OK(1):删除成功
status xxx_pop_back(myLinkList* plist);
status xxx_pop_back_(myLNode* phead);
/// @brief 在位序pos处插入新结点
/// @param plist 链表指针
/// @param pos 位序
/// @param x 待插元素
/// @return 返回是否插入成功的标志
/// @retval ERROR(0):链表不存在,不可操作
/// @retval ERR_OVERFLOW(-2):新建结点失败,导致插入失败
/// @retval ERR_PARA(-1):插入失败,pos值小于1或大于size + 1
status xxx_insert(myLinkList* plist, int pos, linkType x);
status xxx_insert_(myLNode* phead, int pos, linkType x);
/// @brief 删除表中第pos个结点
/// @param plist 链表指针
/// @param pos 位序
/// @return status 是否成功删除的标志
/// @retval ERROR(0):表不存在或为空,不可操作
/// @retval ERR_PARA(-1):pos位序不合理,删除失败
/// @retval OK(1):删除成功
status xxx_remove(myLinkList* plist, int pos);
status xxx_remove_(myLNode* phead, int pos);
/// @brief 删除链表中元素值为x的第一个结点
/// @param plist 链表指针
/// @param x 待删元素
/// @return 返回是否删除成功的标志
/// @retval ERROR(0):链表不存在,不可操作
/// @retval FALSE(0):找不到x元素结点,删除操作失败
status xxx_removeX(myLinkList* plist, linkType x);
status xxx_removeX_(myLNode* phead, linkType x);
/// @brief 删除链表中元素值为x的第一个结点
/// @param plist 链表指针
/// @param x 待删元素
/// @return 返回是否删除成功的标志
/// @retval ERROR(0):链表不存在,不可操作
/// @retval FALSE(0):找不到x元素结点,删除操作失败
status xxx_remove_allX(myLinkList* plist, linkType x);
status xxx_remove_allX_(myLNode* phead, linkType x);
status xxx_remove_allX_1_(myLNode* phead, linkType x);
status xxx_remove_allX_2_(myLNode* phead, linkType x);
#endif // !__MYLINKLIST_H__
标签:结点,单链,定义,xxx,myLNode,C语言,链表,retval,plist
From: https://www.cnblogs.com/kxwslmsps/p/17122233.html