首页 > 其他分享 >单链表:用C语言实现-单链表头文件相关定义

单链表:用C语言实现-单链表头文件相关定义

时间:2023-02-14 18:24:54浏览次数:41  
标签:结点 单链 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/17120515.html

相关文章

  • 【数据结构】单链表 — 纯C实现单链表
    ......
  • C语言学习笔记(九):文件的操作
    C文件的知识什么是文件操作系统把各种设备都统一作为文件来处理。例如,终端键盘是输入文件,显示屏和打印机是输出文件。文件一般指存储在外部介质上数据的集合。操作系统......
  • springcloud sidecar 实现C语言调用语言模块
    以前对springcloud的印象停留在大项目功能模块的独立、负载均衡、熔断等功能。这次项目接触了另一个用法,多语言异构。以前Java调C都是用的JNA或者JNI,这次C调Java用了spring......
  • 直播app源码,给elementUI的table表头添加按钮或者多选框
    直播app源码,给elementUI的table表头添加按钮或者多选框<el-table-column   prop="date"   :render-header="renderHeader"></el-table-column>methods:{  r......
  • C语言填空:数组a b c,c中元素包括a,但不在b中
    #include<stdio.h>//数组a中有8个不相等的元素,b中有5个不相等的元素,数组c中包含那些a中但不在b中的元素,并输出数组c各元素的值main(){inta[8],b[5],i,j,count;......
  • Java POI导出excel经典实现-交叉报表斜表头
    Java使用poi组件导出excel报表,能导出excel报表的还可以使用jxl组件,但jxl想对于poi功能有限,jxl应该不能载excel插入浮动层图片,poi能很好的实现输出excel各种功能,介绍poi导出e......
  • C语言学习笔记(八): 自定义数据类型
    结构体变量什么是结构体C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体结构体的成员可以是任何类型的变量,如整数,字符串,浮点数,其他结构体,指针......
  • C语言学习2
    C语言常见的数据类型char     //字符数据类型short     //短整型int       //整型long     //长整型longlong  //更......
  • C语言学习笔记(七): 指针的使用
    函数的定义形参和实参在定义函数时函数名后面括号中的变量名称为“形式参数”(简称“形参”)或“虚拟参数”。在主调函数中调用一个函数时,函数名后面括号中的参数称为“......
  • c语言 字符串拼接
    voidstr_cat(char*s1,char*s2){inti=0,j=0;while(s1[i++]);i--;while(s1[i++]=s2[j++]);}voidstr_cat(char*s1,char*s2){inti=0,j......