动态链表C语言实现

#动态链表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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值