首页 > 其他分享 >单链表:用C语言定义单链表结构

单链表:用C语言定义单链表结构

时间:2023-02-15 11:44:28浏览次数:47  
标签:结点 单链 定义 xxx myLNode C语言 链表 retval plist

一、单链表公共头文件

#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

相关文章