单链表后插法超详细程序及应用接口

头文件声明:

#include 				//提供malloc原型
#include              //提供strcpy()原型
#include          
#include   

变量、结构体、宏定义

/************************************************私人宏定义区*************************************************************************/
#define TSIZE 45   
/************************************************私人结构体区*************************************************************************/
struct film {          /*节点内容*/char title[TSIZE];int rating;
};
typedef struct film Item, Item_put;typedef struct node {Item item;int size;//节点数量struct node *next;
} Node;
typedef Node *List;/************************************************私人变量区*************************************************************************/
List node_head;//链表节点首地址
Item temp;//新添加项
Item_put temp_put;//输出项中内容
char test_put[30];//监视添加的项内容
int test_val;//监视添加的项内容

链表的底层函数声明:

/*****************************************************************链表底层函数*************************************************************************/
/********************************************************************
*函数名:InitializeList();
*功能:初始化链表(单向尾插方式),
*参数:plist:首节点
*执行条件:plist指向一个链表首节点
*产生效果:会将链表首节点地址初始化为NULL
********************************************************************/
void InitializeList(List * plist);/********************************************************************
*函数名:ListIsEmpty();
*功能:查看链表是否为空,为空返回true否则false(单向尾插方式)
*参数:plist:首节点
*执行条件:plist指向一个链表首节点
*产生效果:查看链表是否为空,为空返回true否则false
********************************************************************/
bool ListIsEmpty(const List * plist); /********************************************************************
*函数名:ListIsFull();
*功能:查看链表是已满,已满返回true否则false(单向尾插方式)
*参数:plist:首节点
*执行条件:plist指向一个链表首节点
*产生效果:查看链表是已满,已满返回true否则false
********************************************************************/
bool ListIsFull(const List * plist);/********************************************************************
*函数名:ListItemCount();
*功能:遍历该链表并返回节点数(单向尾插方式)
*参数:plist:首节点
*执行条件:plist指向一个链表首节点
*产生效果:遍历该链表并返回节点数
********************************************************************/
unsigned int ListItemCount(const List * plist);/********************************************************************
*函数名:AddItem();
*功能:添加新节点,并且节点格式可以任意(单向尾插方式)
*参数:plist:首节点;item需要添加的节点
*执行条件:plist指向一个链表首节点,item是一个待添加至链表的节点(可以自己随意定义)
*产生效果:遍历该链表并返回节点数
********************************************************************/
bool AddItem(Item item, List * plist);/********************************************************************
*函数名:Traverse();
*功能:输出函数(可以读取链表中所有节点)(单向尾插方式)
*参数:plist:需读取节点的起始地址;void(*pfun):一般是赋值函数(比如将节点里的数据printf出来)
*执行条件:plist一般为指向一个链表首节点,也可以自定义链表中任何一个节点,该节点地址为开始地址;void(*pfun)需执行的函数
*产生效果:读取从plist开始直到末尾的所有节点;
********************************************************************/
void Traverse(const List * plist,void(*pfun)(Item item));/******************************************************************
*函数名:Traverse_one_node();
*功能:输出函数(读取单个节点,并删除此节点)(单向尾插方式)
*参数:plist:需读取节点的地址;void(*pfun):一般是赋值函数(比如将节点里的数据printf出来)
*执行条件:plist一般为指向一个链表首节点,也可以自定义链表中任何一个节点,该节点地址为开始地址;void(*pfun)需执行的函数
*产生效果:读取plist节点中项;
*返回值:false:读取失败;true:读取成功;
*******************************************************************/
bool Traverse_one_node(List * plist, void(*pfun)(Item item));/********************************************************************
*函数名:EmptyTheList();
*功能:释放掉*plist至末尾的内存空间(单向尾插方式)
*参数:plist:需释放空间地址节点的起始地址;
*执行条件:plist一般为指向一个链表首节点,也可以自定义链表中任何一个节点,该节点地址为开始地址
*产生效果:释放从plist开始直到末尾的所有节点;
********************************************************************/
void EmptyTheList(List * plist);

        底层函数一般不直接调用,一般直接封装掉,避免修改某些关键点导致出错;

链表的应用函数声明:

/*****************************************************************链表应用函数*************************************************************************//********************************************************************
*函数名:lianbiao_Init();
*功能:初始化链表(单向尾插方式),
*参数:plist:首节点
*执行条件:plist指向一个链表首节点
*产生效果:会将链表首节点地址初始化为NULL,并检查链表是否已满
*返回值:false:初始化失败;true:初始化成功;
********************************************************************/
bool lianbiao_Init();
/********************************************************************
*函数名:lianbiao_node_sum();
*功能:链表节点数量(单向尾插方式),
*参数:
*执行条件:
*产生效果:会将链表首节点地址初始化为NULL,并检查链表是否已满
*返回值:此链表节点总数;
********************************************************************/
unsigned int lianbiao_node_sum();
/********************************************************************
*函数名:lianbiao_add();
*功能:添加链表节点(单向尾插方式),
*参数:rating&title:项中数据;
*执行条件:plist指向一个链表首节点
*产生效果:会将链表首节点地址初始化为NULL,并检查链表是否已满
*返回值:false:添加失败;true:添加成功;
********************************************************************/
bool lianbiao_add(int rating, char *title);
/********************************************************************
*函数名:lianbiao_read_ALL();
*功能:读取全部链表节点(但不删除此节点)(单向尾插方式),
*参数:
*执行条件:
*产生效果:打印项中全部内容,并将内容赋给test_put与test_val变量,以查看节点中项的内容
********************************************************************/
void lianbiao_read_ALL();
/********************************************************************
*函数名:lianbiao_delay_ALL();
*功能:删除链表所有节点并释放空间(单向尾插方式),
*参数:
*执行条件:
*产生效果:删除链表所有节点并释放空间
********************************************************************/
void lianbiao_delay_ALL();
/********************************************************************
*函数名:lianbiao_read_one();
*功能:读取一个链表节点(并删除此节点)(单向尾插方式),
*参数:
*执行条件:
*产生效果:将读取节点中项的内容赋给变量,并删除该节点
*返回值:false:读取失败;true:读取成功;
********************************************************************/
bool lianbiao_read_one();
/********************************************************************
*函数名:lianbiao_Empty();
*功能:查看链表是否为空,为空返回true否则false(单向尾插方式)
*参数:
*执行条件:
*产生效果:查看链表是否为空,为空返回true否则false
********************************************************************/
bool lianbiao_Empty();
/********************************************************************
*函数名:lianbiao_FULL();
*功能:查看链表是已满,已满返回true否则false(单向尾插方式)
*参数:
*执行条件:
*产生效果:查看链表是已满,已满返回true否则false
********************************************************************/
bool lianbiao_FULL();

        客户可以直接调用应用函数即可;

链表的底层函数定义:

/*****************************************************************链表底层函数*************************************************************************/
/********************************************************************
*函数名:nape_val();
*功能:将项中的值付给需要的变量(单向尾插方式),
*参数:item:需要读取项
*执行条件:写入需读取的项
*产生效果:将项中的内容赋给相应的变量
********************************************************************/
void nape_val(Item item) {temp_put = item;
}
/********************************************************************
*函数名:nape_val_printf();
*功能:将项中的值打印(单向尾插方式),
*参数:item:需要读取项
*执行条件:写入需读取的项
*产生效果:打印项中的内容
********************************************************************/
void nape_val_printf(Item item) {printf("Item_title:%s \n",item.title);printf("Item_rating:%d \n",item.rating);memcpy(test_put, item.title, strlen(item.title));test_val = item.rating;
}
/********************************************************************
*函数名:nape_clean();
*功能:清理项中内容(但不会删除节点)(单向尾插方式),
*参数:NAPE:需要清除的项内容
*执行条件:输入需要清除的项
*产生效果:将输入项清空
********************************************************************/
//void nape_clean(Item NAPE) {
//	memset(&NAPE, 0, strlen(&NAPE));
//}
/********************************************************************
*函数名:InitializeList();
*功能:初始化链表(单向尾插方式),
*参数:plist:首节点
*执行条件:plist指向一个链表首节点
*产生效果:会将链表首节点地址初始化为NULL
********************************************************************/
void InitializeList(List * plist) {*plist = NULL;
}
/******************************************************************
*函数名:CopyToNode();
*功能:拷贝结构(单向尾插方式),
*参数:item:需要拷贝的结构;pnode:节点
*执行条件:item:自定义的结构;pnode:目标节点
*产生效果:会将自定义结构付给目标节点中的item变量
*******************************************************************/
static void CopyToNode(Item item, Node * pnode){pnode->item = item; //拷贝结构
}
/******************************************************************
*函数名:ListIsEmpty();
*功能:查看链表是否为空,为空返回true否则false(单向尾插方式)
*参数:plist:首节点
*执行条件:plist指向一个链表首节点
*产生效果:查看链表是否为空,
*返回值:true:为空;false:不为空;
*******************************************************************/
bool ListIsEmpty(const List * plist) {if (*plist == NULL)return true;elsereturn false;
}
/******************************************************************
*函数名:ListIsFull();
*功能:查看链表是已满,已满返回true否则false(单向尾插方式)
*参数:plist:首节点
*执行条件:plist指向一个链表首节点
*产生效果:查看链表是已满,已满返回true否则false
*返回值:false:链表是不满;true:链表是已满;
*******************************************************************/
bool ListIsFull(const List * plist) {Node * pt;bool full;pt = (Node *)malloc(sizeof(Node));if (pt == NULL)full = true;elsefull = false;free(pt);return full;
}
/******************************************************************
*函数名:ListItemCount();
*功能:遍历该链表并返回节点数(单向尾插方式)
*参数:plist:首节点
*执行条件:plist指向一个链表首节点
*产生效果:遍历该链表并返回节点数
*******************************************************************/
unsigned int ListItemCount(const List * plist) {unsigned int count = 0;Node * pnode = *plist; //设置链表的开始while (pnode != NULL) {++count;pnode = pnode->next;//设置下一个节点}return count;
}
/******************************************************************
*函数名:AddItem();
*功能:添加新节点,并且节点格式可以任意(单向尾插方式)
*参数:plist:首节点;item需要添加的节点
*执行条件:plist指向一个链表首节点,item是一个待添加至链表的节点(可以自己随意定义)
*产生效果:遍历该链表并返回节点数
*返回值:false:添加失败;true:添加成功;
*******************************************************************/
bool AddItem(Item item, List * plist) {Node * pnew;Node * scan = *plist;pnew = (Node *)malloc(sizeof(Node));if (pnew == NULL)return false;   //失败时退出函数CopyToNode(item, pnew);pnew->next = NULL;if (scan == NULL)*plist = pnew;else {while (scan->next != NULL)scan = scan->next; //找到链表的末尾scan->next = pnew; //把pnew添加到链表的末尾}return true;
}
/******************************************************************
*函数名:Traverse();
*功能:输出函数(可以读取链表中所有节点)(单向尾插方式)
*参数:plist:需读取节点的起始地址;void(*pfun):一般是赋值函数(比如将节点里的数据printf出来)
*执行条件:plist一般为指向一个链表首节点,也可以自定义链表中任何一个节点,该节点地址为开始地址;void(*pfun)需执行的函数
*产生效果:读取从plist开始直到末尾的所有节点;
*******************************************************************/
void Traverse(const List * plist, void(*pfun)(Item item)) {Node * pnode = *plist; //设置链表的开始while (pnode != NULL) {(*pfun)(pnode->item); //把函数应用于链表中的节点pnode = pnode->next; //前进到下一项}}
/******************************************************************
*函数名:Traverse_one_node();
*功能:输出函数(读取单个节点,并删除此节点)(单向尾插方式)
*参数:plist:需读取节点的地址;void(*pfun):一般是赋值函数(比如将节点里的数据printf出来)
*执行条件:plist一般为指向一个链表首节点,也可以自定义链表中任何一个节点,该节点地址为开始地址;void(*pfun)需执行的函数
*产生效果:读取plist节点中项;
*返回值:false:读取失败;true:读取成功;
*******************************************************************/
bool Traverse_one_node(List * plist, void(*pfun)(Item item)) {bool flay;Node * pnode = *plist; //设置读取节点if (pnode != NULL) {(*pfun)(pnode->item); //把函数应用于链表中的节点*plist = pnode->next; //把下一节点地址作为首地址free(pnode); //释放当前节点空间flay = true;}elseflay = false;return flay;
}
/******************************************************************
*函数名:EmptyTheList();
*功能:释放掉*plist至末尾的内存空间(单向尾插方式)
*参数:plist:需释放空间地址节点的起始地址;
*执行条件:plist一般为指向一个链表首节点,也可以自定义链表中任何一个节点,该节点地址为开始地址
*产生效果:释放从plist开始直到末尾的所有节点;
*******************************************************************/
void EmptyTheList(List * plist) {Node * psave;while (*plist != NULL) {psave = (*plist)->next;//保存下一个节点的地址free(*plist); //释放当前节点*plist = psave; //前进至下一个节点}
}

 链表的应用函数定义:

/*****************************************************************链表应用函数*************************************************************************/
/********************************************************************
*函数名:lianbiao_Init();
*功能:初始化链表(单向尾插方式),
*参数:plist:首节点
*执行条件:plist指向一个链表首节点
*产生效果:会将链表首节点地址初始化为NULL,并检查链表是否已满
*返回值:false:初始化失败;true:初始化成功;
********************************************************************/
bool lianbiao_Init() {InitializeList(&node_head);//初始化首节点地址return ListIsFull(&node_head);//检测链表是否已满
}
/********************************************************************
*函数名:lianbiao_node_sum();
*功能:链表节点数量(单向尾插方式),
*参数:
*执行条件:
*产生效果:会将链表首节点地址初始化为NULL,并检查链表是否已满
*返回值:此链表节点总数;
********************************************************************/
unsigned int lianbiao_node_sum() {return ListItemCount(&node_head);//检测链表节点数
}
/********************************************************************
*函数名:lianbiao_add();
*功能:添加链表节点(单向尾插方式),
*参数:rating&title:项中数据;
*执行条件:plist指向一个链表首节点
*产生效果:会将链表首节点地址初始化为NULL,并检查链表是否已满
*返回值:false:添加失败;true:添加成功;
********************************************************************/
bool lianbiao_add(int rating, char *title) {bool flat;Item item;item.rating = rating;memcpy(item.title, title, strlen(title));flat=AddItem(item, &node_head);return flat;
}
/********************************************************************
*函数名:lianbiao_read_ALL();
*功能:读取全部链表节点(但不删除此节点)(单向尾插方式),
*参数:
*执行条件:
*产生效果:打印项中全部内容
********************************************************************/
void lianbiao_read_ALL() {Traverse(&node_head, nape_val_printf);
}
/********************************************************************
*函数名:lianbiao_delay_ALL();
*功能:删除链表所有节点并释放空间(单向尾插方式),
*参数:
*执行条件:
*产生效果:删除链表所有节点并释放空间
********************************************************************/
void lianbiao_delay_ALL() {EmptyTheList(&node_head);
}
/********************************************************************
*函数名:lianbiao_read_one();
*功能:读取一个链表节点(并删除此节点),将此节点存入temp_put项中(单向尾插方式),
*参数:
*执行条件:
*产生效果:将读取节点中项的内容赋给变量,并删除该节点
*返回值:false:读取失败;true:读取成功;
********************************************************************/
bool lianbiao_read_one() {return Traverse_one_node(&node_head, nape_val);
}
/********************************************************************
*函数名:lianbiao_FULL();
*功能:查看链表是已满,已满返回true否则false(单向尾插方式)
*参数:
*执行条件:
*产生效果:查看链表是已满,已满返回true否则false
********************************************************************/
bool lianbiao_FULL() {return ListIsFull(&node_head);
}
/********************************************************************
*函数名:lianbiao_Empty();
*功能:查看链表是否为空,为空返回true否则false(单向尾插方式)
*参数:
*执行条件:
*产生效果:查看链表是否为空,为空返回true否则false
********************************************************************/
bool lianbiao_Empty() {return ListIsEmpty(&node_head);
}

        以上为链表使用的全部代码,亲测可用,注释也写的很清楚,可以直接调用;

        也可以直接下载源码:

        https://download.csdn.net/download/weixin_54519440/87300698


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部