#动态链表C语言实现
1、链表常用操作函数,C语言实现,可在MCU中使用;
2、内存分配函数参考正点原子;具体如下;
/****
1、链表节点内部内存管理部分统一使用了mymalloc,myfree申请释放,
2、search和del函数具体使用时应当重写elem比较语句,
***/
/**------include-------------------------------------------------------------**/
#include "list.h"
/****************************************************************************
*@name : Link* InitLink(void)
*@param : void
*@param : void
*@retval : Link* 返回链表头指针;
*@brief : 初始化一个链表头并将下个节点为NULL
****************************************************************************/
Link* InitLink(void)
{
Link* P = (Link*)mymalloc(LINKSRAM,sizeof(Link));
if(P == NULL)
{
return FALSE;
}
else
{
P->next = NULL;
return P;
}
}
/****************************************************************************
*@name : Function
*@param : P :链表头
*@param : Elem:待查找的元素;
*@retval : Link* 返回该节点指针;
*@brief : 查找节点,(此函数在应用时需要重写具体查找数据)
****************************************************************************/
Link* SearchElem(Link* P,Elem_Struct* Elem)
{
//第一个节点为头结点,elem为空,不用查询
while( P->next != NULL)
{
P = P->next;
/*****重写具体Elem比较*************************************/
if(P->elem->Cmd == Elem->Cmd)
{
if(P->elem->Len == Elem->Len)
{
return P;
}
}
}
/******重写结束*******************************************/
return FALSE;
}
/****************************************************************************
*@name : unsigned char InsertElem(Link * P, Elem_Struct* Elem)
*@param : P:链表头;
*@param : Elem:插入节点值,应为临时变量
*@retval : TRUE:成功,FALSE:失败
*@brief : 在尾部添加节点,内部又重新做了节点内存申请。
****************************************************************************/
unsigned char AddElem(Link * P, Elem_Struct* Elem)
{
Link* temp;
//寻到最后的尾节点
while (P->next != NULL)
{
P = P->next;
}
//申请空间
temp = (Link*)mymalloc(LINKSRAM,sizeof(Link));
if(temp == NULL)
return FALSE;
temp->elem = (Elem_Struct*)mymalloc(LINKSRAM,sizeof(Elem_Struct));
if(temp->elem == NULL)
{
myfree(LINKSRAM,temp);
return FALSE;
}
//拷贝节点的结构体信息;
memcpy(temp->elem,Elem,sizeof(Elem_Struct));
//申请内存存放数组;
temp->elem->Array = (unsigned char*)mymalloc(LINKSRAM,Elem->Len);
if(temp->elem->Array == NULL)
{
myfree(LINKSRAM,temp->elem);
myfree(LINKSRAM,temp);
return FALSE;
}
memcpy(temp->elem->Array,Elem->Array,Elem->Len);
temp->next = NULL;
//插入新节点;
P->next = temp;
return TRUE;
}
/****************************************************************************
*@name : unsigned char DelElem(Link* P, Elem_Struct* Elem)
*@param : P:链表头指针
*@param : Elem:删除节点元素
*@retval : TRUE:成功,FALSE:失败
*@brief : 链表节点删除函数,(具体应用时需要重写)
****************************************************************************/
unsigned char DelElem(Link* P, Elem_Struct* Elem)
{
Link* temp;
//遍历到删除结点的上一个结点,然后将该节点了解到删除节点的下一个一节
//之后在删除对应的节点;
//头结点elem为空,自动跳过;
while (P->next != NULL)
{
/*******重写节点比较*****************************************************/
if(P->next->elem->Cmd == Elem->Cmd)
{
if(P->next->elem->Len == Elem->Len)
{
//先保留删除节点,再链接后边的节点,之后删除该节点
temp = P->next;
P->next = P->next->next;
myfree(LINKSRAM,temp);
return TRUE;
}
/*********结束**********************************************************/
}
//指向下一个节点
P= P->next;
}
return FALSE;
}
/****************************************************************************
*@name : Function
*@param : void
*@param : void
*@retval : void
*@brief : void
****************************************************************************/
unsigned char ChangeElem(Link* P,Elem_Struct* Elem)
{
// Link* temp;
return FALSE;
}
/****************************************************************************
*@name : unsigned char Reset(Link* P)
*@param : void
*@param : void
*@retval : void
*@brief : 释放链表;
****************************************************************************/
unsigned char Reset(Link* P)
{
Link* temp ;
//从链表头开始删除,寻到尾节点时结束
while (P->next != NULL)
{
temp = P->next;
//节点数组
myfree(LINKSRAM,P->elem->Array);
//节点数据
myfree(LINKSRAM,P->elem);
//节点
myfree(LINKSRAM,P);
P = temp;
}
//删除尾节点;
myfree(LINKSRAM,P->elem->Array);
myfree(LINKSRAM,P->elem);
myfree(LINKSRAM,P);
return TRUE;
}
/*********************************************END OF FILE**********************/
H文件
/**------include-------------------------------------------------------------**/
#ifndef __LINK_H
#define __LINK_H
#include "stm32f4xx.h"
#include "malloc.h"
#include "string.h"
#define LINKSRAM SRAMEX
#define TRUE 1;
#define FALSE 0;
//节点元素
typedef struct
{
unsigned short Len; //数据长度(第二重判断)
unsigned char *Array; //数据首地址指针(第三重判断-未写)
unsigned char Cmd; //命令(链表内部第一重判断);
} Elem_Struct;
//链表节点
typedef struct Link
{
Elem_Struct* elem;
struct Link* next; //指针,指向后继元素
}Link;
Link* InitLink(void);
Link* SearchElem(Link* P,Elem_Struct* Elem);
unsigned char AddElem(Link * P, Elem_Struct* Elem);
unsigned char DelElem(Link* P, Elem_Struct* Elem);
unsigned char Reset(Link* P);
/**----END---------------------------------------------------------------------**/
#endif