动态组包程序(C)

功能特性

  • 可存储任意格式数据
    • 基础类型数据使用8字节存储
    • 自定义构造类型使用指针(支持引用与实体两种方式)
  • 可自动根据id顺序将有效数据打包
  • 可定位自指定id开始后的最大连续id
  • 可获取自指定id后8个节点的id的连续情况
  • 可根据id排序
  • 可查询指定id范围内的节点数量
  • 支持追加、插入(前向,后向,头,尾)、删除

代码

头文件

#ifndef MY_DS_H
#define MY_DS_H

#include <stdint.h>


#define MY_D2LINK_LIST_ITEM_ITEM_NAME_USED  1
struct my_d2link_item
{
    int id;
    #if MY_D2LINK_LIST_ITEM_ITEM_NAME_USED
    char item_name[32];
    #endif
    uint8_t data_type;
    uint32_t data_len;
    uint64_t data_uint64;
    uint8_t p_data_type;
    void* p_data;
    struct my_d2link_item* next_item;
    struct my_d2link_item* pri_item;
};
typedef struct my_d2link_item my_d2link_item_t;

#define MY_D2LINK_LIST_LIST_NAME_USED  1
typedef struct
{
    int list_item_num;
    uint32_t list_data_len;
    #if MY_D2LINK_LIST_LIST_NAME_USED
    char list_name[32];
    #endif
    my_d2link_item_t* first_item;
    my_d2link_item_t* end_item;
}my_d2link_t;


/**
 * @brief 创建一个元素
 * @param id 元素的id,需自定义
 * @param p_data 数据指针,可为NULL(为NULL时,p_data_type自动失效,且data_uint64有效)
 * @param p_data_type p_data的类型,0:引用(原始数据不可删除,否则引用失效),1:拷贝(原数据可删除)
 * @param data_uint64 0-8字节的int型数据
 * @param data_len p_data或data_uint64中实际有效的数据长度, 0-sizeof(uint32_t), 单位Byte
 * @param item_name 元素名称
 * @return 非NULL:成功, NULL:失败
 */
my_d2link_item_t* My_D2Link_Create_Item(int id, void* p_data, uint8_t p_data_type, uint64_t data_uint64, uint32_t data_len, char* item_name);

/**
 * @brief 创建一个p_data元素
 * @param id 要追加的元素的id,需自定义
 * @param p_data 数据指针
 * @param p_data_type p_data的类型,0:引用(原始数据不可删除,否则引用失效),1:拷贝(原数据可删除)
 * @param data_len p_data中有效数据长度, 单位Byte
 * @param item_name 元素名称
 * @return 非NULL:成功, NULL:失败
 */
my_d2link_item_t* My_D2Link_Create_Item_pt(int id, void* p_data, uint8_t p_data_type, uint32_t data_len, char* item_name);

/**
 * @brief 创建一个引用类型的p_data元素
 * @param id 要追加的元素的id,需自定义,不可重复
 * @param p_data 数据指针
 * @param data_len p_data中有效数据长度, 单位Byte
 * @param item_name 元素名称
 * @return 非NULL:成功, NULL:失败
 */
my_d2link_item_t* My_D2Link_Create_Item_pt_ref(int id, void* p_data, uint32_t data_len, char* item_name);

/**
 * @brief 创建一个实体类型的p_data元素
 * @param id 要追加的元素的id,需自定义,不可重复
 * @param p_data 数据指针
 * @param data_len p_data中有效数据长度, 单位Byte
 * @param item_name 元素名称
 * @return 非NULL:成功, NULL:失败
 */
my_d2link_item_t* My_D2Link_CreateItem_pt_ent(int id, void* p_data, uint32_t data_len, char* item_name);

/**
 * @brief 创建一个0-8字节的int元素
 * @param id 要追加的元素的id,需自定义,不可重复
 * @param data_uint64 0-8字节以内数据
 * @param data_len data_uint64中实际有效的数据长度, 0-sizeof(uint32_t), 单位Byte
 * @param item_name 元素名称
 * @return 非NULL:成功, NULL:失败
 */
my_d2link_item_t* My_D2Link_Create_Item_int(int id, uint64_t data_uint64, uint32_t data_len, char* item_name);

/**
 * @brief 向my_d2link_t双向链表中追加一个元素
 * @param p_list 链表指针
 * @param newitem 新元素指针
 * @return 0:成功, -1:p_list无效, -2:newitem无效, -3:item->id重复
 */
int My_D2Link_Append_Item(my_d2link_t* p_list, my_d2link_item_t* newitem);

/**
 * @brief 直接向双向链表中追加一个元素
 * @param p_list 指定一个my_d2link_t链表
 * @param id 要追加的元素的id,需自定义,不可重复
 * @param p_data 数据指针,可为NULL(为NULL时,p_data_type自动失效,且data_uint64有效)
 * @param p_data_type p_data的类型,0:引用(原始数据不可删除,否则引用失效),1:拷贝(原数据可删除)
 * @param data_uint64 当p_data==NULL时有效
 * @param data_len p_data或data_uint64中实际有效的数据长度, 0-sizeof(uint32_t), 单位Byte
 * @param item_name 元素名称
 * @return 0:成功, -1:p_list不存在, -2:id重复, -3:新元素节点内存申请失败
 */
int My_D2Link_Create_And_Append_Item(my_d2link_t* p_list, int id, void* p_data, uint8_t p_data_type, uint64_t data_uint64, uint32_t data_len, char* item_name);

/**
 * @brief 向双向链表中插入一个元素
 * @param p_list 指定一个my_d2link_t链表
 * @param insert_direct 插入方向, 0:插入insert_id之前, 1:插入insert_id之后, -1:插入p_list头部, -2:插入p_list尾部
 * @param insert_id 链表中已有的元素id,从该位置插入
 * @return 0:成功, -1:p_list无效, -2:newitem无效, -3:item->id重复
 * @note 如果未找到insert_id, 则会追加到p_list尾部
 */
int My_D2Link_Insert_Item(my_d2link_t* p_list, int insert_direct, int insert_id, my_d2link_item_t* newitem);

/**
 * @brief 从双向链表中删除指定id的元素
 * @param p_list 指定一个my_d2link_t链表
 * @param id 要删除的元素的id
 * @return 0:成功, -1:链表不存在, 1:链表长度为0, 2:未找到对应id的元素
 */
int My_D2Link_Delete_Item(my_d2link_t* p_list, int id);

/**
 * @brief 删除链表
 * @param p_list 链表指针
 */
int My_D2Link_Delete(my_d2link_t** p_list);

/**
 * @brief 从指定my_d2link_t链表中统计在某个id区间内有多少元素,闭区间
 * @param p_list 指定一个my_d2link_t链表
 * @param id_begin 起始id
 * @param id_end 结束id
 * @return -1:链表不存在, -2:空链表, >=0:匹配到的元素个数
 * @note id_begin与id_end大小关系无限制,如果超出实际存在的id范围,则会自动按实际截取
 */
int My_D2Link_match_id_count_statistic(my_d2link_t* p_list, int id_begin, int id_end);

/**
 * @brief 将指定my_d2link_t中的有效数据打包
 * @param p_list 指定一个my_d2link_t链表
 * @param saving 打包后的存储区指针
 * @param saving_len saving存储区大小
 * @return 0:成功, -1:链表不存在, -2:saving无效, -3:空链表, -4:saving_len过小(小于链表数据大小), 1:部分成功
 */
int My_D2Link_Data_Packer(my_d2link_t* p_list, void* saving, uint32_t saving_len);

/**
 * @brief 将指定my_d2link_t中的有效数据根据id顺序打包
 * @param p_list 指定一个my_d2link_t链表
 * @param saving 打包后的存储区指针
 * @param saving_len saving存储区大小
 * @param direct 0:根据id从小到大打包, 1:根据id从大到小打包(暂未实现)
 * @return 0:成功, -1:链表不存在, -2:saving无效, -3:空链表, -4:saving_len过小(小于链表数据大小), 1:部分成功
 */
int My_D2Link_Data_Packer_accordingID(my_d2link_t* p_list, void* saving, uint32_t saving_len, uint8_t direct);

/**
 * @brief 在指定my_d2link_t中从指定id开始,寻找最大的连续id
 * @param p_list 指定一个my_d2link_t链表
 * @param start_id 起始id
 * @return -1:链表不存在, -2:空链表, 其他:匹配成功返回最大连续id+1
 * @note start_id不限定id范围,如果给出不存在的id,会返回该不存在的id
 */
int My_D2Link_GetItem_ContinousMaxId_next(my_d2link_t* p_list, int start_id);

/**
 * @brief 在指定my_d2link_t中从指定id开始,查询从该id开始的后8个id的连续情况
 * @param p_list 指定一个my_d2link_t链表
 * @param start_id 起始id
 * @param end_id end_id<=start_id:尾部不填充1, end_id>start_id:尾部填充1
 * @return -1:链表不存在, -2:空链表, 0x00-0xff:成功
 */
int My_D2Link_GetItem_ContinousDistribution_8_ByCurId(my_d2link_t* p_list, int start_id, int end_id);

/**
 * @brief 创建一个my_d2link_t类型链表
 * @param list_name 链表名称
 * @return 链表指针
 */
my_d2link_t* My_D2Link_Creat(char* list_name);

/**
 * @brief 创建一个my_d2link_t类型链表
 * @param p_list 打印链表
 * @return 0:成功, -1:链表不存在, -2:空链表
 */
int My_D2Link_PrintList(my_d2link_t* p_list);

/**
 * @brief 获取my_d2link_t链表指定id的元素节点
 * @param p_list 指定一个my_d2link_t链表
 * @param id 指定id
 * @return NULL:失败, 其他:成功
 */
void* My_D2Link_GetItem_Storage_ById(my_d2link_t* p_list, int id);

/**
 * @brief 根据id大小排序链表元素
 * @param p_list 指定一个my_d2link_t链表
 * @param direct 0:从小到大排序, 1:从大到小排序
 * @return 0:成功, -1:失败
 */
int My_D2Link_Data_Sort_Data_accordingID(my_d2link_t* p_list, uint8_t direct);

/**
 * @brief 在链表中获取id最小的元素
 * @param p_list 指定一个my_d2link_t链表
 * @return 非NULL:成功, NULL:失败
 */
void* My_D2Link_GetItem_MinId(my_d2link_t* p_list);

/**
 * @brief 在链表中获取id最大的元素
 * @param p_list 指定一个my_d2link_t链表
 * @return 非NULL:成功, NULL:失败
 */
void* My_D2Link_GetItem_MaxId(my_d2link_t* p_list);

/**
 * @brief 在链表中获取比指定元素id大的相邻元素
 * @param p_list 指定一个my_d2link_t链表
 * @param p_item my_d2link_item_t类型元素
 * @return NULL:失败, 其他:成功
 * @note 如果p_item已经是最大的id项,则返回NULL
 */
void* My_D2Link_GetItem_IdGreaterThan(my_d2link_t* p_list, my_d2link_item_t* p_item);


#endif

具体实现

#include "my_ds.h"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


my_d2link_item_t* My_D2Link_Create_Item(int id, void* p_data, uint8_t p_data_type, uint64_t data_uint64, uint32_t data_len, char* item_name)
{
    my_d2link_item_t* newitem = NULL;
    newitem = (my_d2link_item_t*)calloc(1, sizeof(my_d2link_item_t));
    int item_name_len = 0;

    if(newitem==NULL)
    {
        return NULL;
    }

    #if MY_D2LINK_LIST_ITEM_ITEM_NAME_USED
    if(item_name!=NULL)
    {
        item_name_len = strlen(item_name);
        if(item_name_len>31)
        {
            item_name_len = 31;
        }
        memcpy(newitem->item_name, item_name, item_name_len);
    }
    #endif

    newitem->id = id;
    //------------------------------------
    if(p_data!=NULL)
    {
        newitem->data_type = 1;
        newitem->p_data_type = p_data_type;
        if(!p_data_type)
        {
            newitem->p_data = p_data;
        }
        else
        {
            newitem->p_data = calloc(1, data_len);
            if(newitem->p_data!=NULL)
            {
                memcpy(newitem->p_data, p_data, data_len);
            }
        }
    }
    else
    {
        newitem->data_type = 0;
        newitem->data_uint64 = data_uint64;
        if(data_len>8) data_len=8;
        
    }
    newitem->data_len = data_len;
    
    newitem->next_item = NULL;
    newitem->pri_item = NULL;

    return newitem;
}

my_d2link_item_t* My_D2Link_Create_Item_pt(int id, void* p_data, uint8_t p_data_type, uint32_t data_len, char* item_name)
{
    return My_D2Link_Create_Item(id, p_data, p_data_type, 0, data_len, item_name);
}

my_d2link_item_t* My_D2Link_Create_Item_pt_ref(int id, void* p_data, uint32_t data_len, char* item_name)
{
    return My_D2Link_Create_Item(id, p_data, 0, 0, data_len, item_name);
}

my_d2link_item_t* My_D2Link_CreateItem_pt_ent(int id, void* p_data, uint32_t data_len, char* item_name)
{
    return My_D2Link_Create_Item(id, p_data, 1, 0, data_len, item_name);
}

my_d2link_item_t* My_D2Link_Create_Item_int(int id, uint64_t data_uint64, uint32_t data_len, char* item_name)
{
    return My_D2Link_Create_Item(id, NULL, 0, data_uint64, data_len, item_name);
}

int My_D2Link_Append_Item(my_d2link_t* p_list, my_d2link_item_t* newitem)
{
    if(p_list==NULL)
    {
        return -1;
    }
    if(newitem==NULL)
    {
        return -2;
    }
    int item_name_len = 0;
    my_d2link_item_t* item_index = p_list->first_item;
    
    if(p_list->list_item_num>0)
    {
        do
        {
            if(item_index->id==newitem->id)
            {
                break;
            }
            if(item_index->next_item!=NULL)
            {
                item_index = item_index->next_item;
            }
        } while (item_index!=p_list->end_item);
        if(item_index->id==newitem->id)
        {
            free(newitem);
            return -3;
        }
    }

    p_list->list_data_len += newitem->data_len;
    //------------------------------------

    if(p_list->list_item_num==0)
    {
        p_list->first_item = newitem;
        newitem->pri_item = NULL;
        newitem->next_item = NULL;
    }
    else
    {
        p_list->end_item->next_item = newitem;
        newitem->pri_item = p_list->end_item;
        newitem->next_item = NULL;
    }
    p_list->end_item = newitem;
    p_list->list_item_num++;
    return 0;
}

int My_D2Link_Create_And_Append_Item(my_d2link_t* p_list, int id, void* p_data, uint8_t p_data_type, uint64_t data_uint64, uint32_t data_len, char* item_name)
{
    if(p_list==NULL)
    {
        return -1;
    }
    my_d2link_item_t* newitem = NULL;
    newitem = (my_d2link_item_t*)calloc(1, sizeof(my_d2link_item_t));
    int item_name_len = 0;
    my_d2link_item_t* item_index = p_list->first_item;
    
    if(p_list->list_item_num>0)
    {
        do
        {
            if(item_index->id==id)
            {
                break;
            }
            if(item_index->next_item!=NULL)
            {
                item_index = item_index->next_item;
            }
        } while (item_index!=p_list->end_item);
        if(item_index->id==id)
        {
            if(newitem!=NULL)free(newitem);
                return -2;
        }
    }

    if(newitem!=NULL)
    {
        #if MY_D2LINK_LIST_ITEM_ITEM_NAME_USED
        if(item_name!=NULL)
        {
            item_name_len = strlen(item_name);
            if(item_name_len>31)
            {
                item_name_len = 31;
            }
            memcpy(newitem->item_name, item_name, item_name_len);
        }
        #endif

        newitem->id = id;
        //------------------------------------
        if(p_data!=NULL)
        {
            newitem->data_type = 1;
            newitem->p_data_type = p_data_type;
            if(!p_data_type)
            {
                newitem->p_data = p_data;
            }
            else
            {
                newitem->p_data = calloc(1, data_len);
                if(newitem->p_data!=NULL)
                {
                    memcpy(newitem->p_data, p_data, data_len);
                }
            }
        }
        else
        {
            newitem->data_type = 0;
            newitem->data_uint64 = data_uint64;
        }
        newitem->data_len = data_len;
        p_list->list_data_len += data_len;
        //------------------------------------

        newitem->next_item = NULL;
        if(p_list->list_item_num==0)
        {
            p_list->first_item = newitem;
            newitem->pri_item = NULL;
            newitem->next_item = NULL;
        }
        else
        {
            p_list->end_item->next_item = newitem;
            newitem->pri_item = p_list->end_item;
            newitem->next_item = NULL;
        }
        p_list->end_item = newitem;
        p_list->list_item_num++;
        return 0;
    }
    else
    {
        return -3;
    }
    return 0;
}

int My_D2Link_Insert_Item(my_d2link_t* p_list, int insert_direct, int insert_id, my_d2link_item_t* newitem)
{
    if(p_list==NULL)
    {
        return -1;
    }
    if(newitem==NULL)
    {
        return -2;
    }
    my_d2link_item_t* item_index = p_list->first_item;
    
    if(p_list->list_item_num>0)
    {
        do
        {
            if(item_index->id==newitem->id)
            {
                break;
            }
            if(item_index->next_item!=NULL)
            {
                item_index = item_index->next_item;
            }
        } while (item_index!=p_list->end_item);
        if(item_index->id==newitem->id)
        {
            free(newitem);
            return -3;
        }
    }

    p_list->list_data_len += newitem->data_len;
    //------------------------------------

    if(p_list->list_item_num==0)//链表为空
    {
        p_list->first_item = newitem;
        newitem->pri_item = NULL;
        newitem->next_item = NULL;
        p_list->end_item = newitem;
    }
    else//链表不为空
    {
        if(insert_direct==-1)//指定插入到最前面
        {
            newitem->pri_item = NULL;
            newitem->next_item = p_list->first_item;
            p_list->first_item->pri_item = newitem;
            p_list->first_item = newitem;
        }
        else if(insert_direct==-2)//指定追加到尾部
        {
            newitem->pri_item = p_list->end_item;
            newitem->next_item = NULL;
            p_list->end_item->next_item = newitem;
            p_list->end_item = newitem;
        }
        else//指定了id
        {
            my_d2link_item_t* find_id_item = NULL;
            find_id_item = p_list->first_item;
            for(int i=0; (i<p_list->list_item_num)&&(find_id_item!=NULL); i++)
            {
                if(find_id_item->id!=insert_id)
                {
                    find_id_item = find_id_item->next_item;
                }
                else
                {
                    break;
                }
            }
            if(find_id_item==NULL)//未找到目标id,追加到尾部
            {
                newitem->pri_item = p_list->end_item;
                newitem->next_item = NULL;
                p_list->end_item->next_item = newitem;
                p_list->end_item = newitem;
            }
            else//找到了目标id
            {
                if(insert_direct==0)//前向插入
                {
                    if(find_id_item==p_list->first_item)//目标id已经是第一项
                    {
                        newitem->pri_item = NULL;
                        newitem->next_item = p_list->first_item;
                        p_list->first_item->pri_item = newitem;
                        p_list->first_item = newitem;
                    }
                    else//目标id不是第一项
                    {
                        newitem->pri_item = find_id_item->pri_item;
                        newitem->next_item = find_id_item;
                        find_id_item->pri_item->next_item = newitem;
                        find_id_item->pri_item = newitem;
                    }
                }
                else if(insert_direct==1)//后向插入
                {
                    if(find_id_item==p_list->end_item)//目标id已经是最后一项
                    {
                        newitem->pri_item = p_list->end_item;
                        newitem->next_item = NULL;
                        p_list->end_item->next_item = newitem;
                        p_list->end_item = newitem;
                    }
                    else//目标id不是最后一项
                    {
                        newitem->pri_item = find_id_item;
                        newitem->next_item = find_id_item->next_item;
                        find_id_item->next_item->pri_item = newitem;
                        find_id_item->next_item = newitem;
                    }
                }
            }
        }
    }
    p_list->list_item_num++;
    return 0;
}

int My_D2Link_Delete_Item(my_d2link_t* p_list, int id)
{
    if(p_list==NULL)
    {
        return -1;
    }
    if(p_list->list_item_num==0)
    {
        return 1;
    }

    my_d2link_item_t* item_index = p_list->first_item;
    do
    {
        if(item_index->id==id)
        {
            break;
        }
        if(item_index->next_item!=NULL)
        {
            item_index = item_index->next_item;
        }
    } while (item_index!=p_list->end_item);
    if(item_index->id==id)
    {
        if((item_index!=p_list->first_item)&&(item_index!=p_list->end_item))
        {
            item_index->pri_item->next_item = item_index->next_item;
            item_index->next_item->pri_item = item_index->pri_item;
        }
        else
        {
            if(item_index==p_list->first_item)
            {
                p_list->first_item = item_index->next_item;
            }
            if(item_index==p_list->end_item)
            {
                p_list->end_item = item_index->pri_item;
                if(p_list->end_item!=NULL)
                {
                    p_list->end_item->next_item = NULL;
                }
            }
        }

        p_list->list_data_len -= item_index->data_len;

        //---------------------------------------------
        if(item_index->p_data_type)
        {
            if(item_index->p_data!=NULL)
            {
                free(item_index->p_data);
            }
        }
        //---------------------------------------------
        
        free(item_index);
        if(p_list->list_item_num>0)
        {
            p_list->list_item_num--;
        }
        return 0;
    }
    else
    {
        return 2;
    }
    return 0;
}

int My_D2Link_Delete(my_d2link_t** p_list)
{
    if((*p_list)==NULL)
    {
        return -1;
    }

    my_d2link_item_t* p = (*p_list)->first_item;
    my_d2link_item_t* p_next = NULL;
    for(int i=0; (i<(*p_list)->list_item_num)&&(p!=NULL); i++)
    {
        p_next = p->next_item;

        //-----------------------------------
        if(p->p_data_type)
        {
            if(p->p_data!=NULL)
            {
                free(p->p_data);
            }
        }
        //-----------------------------------

        free(p);
        p = p_next;
    }

    free(*p_list);
    *p_list = NULL;

    return 0;
}

int My_D2Link_match_id_count_statistic(my_d2link_t* p_list, int id_begin, int id_end)
{
    if(p_list==NULL)
    {
        return -1;
    }
    if(p_list->list_item_num==0)
    {
        return -2;
    }

    if(id_begin>id_end)
    {
        int temp = id_begin;
        id_begin = id_end;
        id_end = temp;
    }

    my_d2link_item_t* p = p_list->first_item;
    int matching_id_counter = 0;
    for(int i=0; (i<p_list->list_item_num)&&(p!=NULL); i++)
    {
        if((p->id>=id_begin)&&(p->id<=id_end))
        {
            matching_id_counter++;
        }
        p = p->next_item;
    }

    return matching_id_counter;
}

int My_D2Link_Data_Packer(my_d2link_t* p_list, void* saving, uint32_t saving_len)
{
    if(p_list==NULL)
    {
        return -1;
    }
    if(saving==NULL)
    {
        return -2;
    }
    if(p_list->list_item_num==0)
    {
        return -3;
    }

    if(p_list->list_data_len > saving_len)
    {
        return -4;
    }

    my_d2link_item_t* p = p_list->first_item;

    char* p_saving_byte = (char*)saving;
    uint32_t copy_counter = 0;
    uint32_t copy_size = 0;
    for(int i=0; (i<p_list->list_item_num)&&(p!=NULL); i++)
    {
        if((copy_size+p->data_len)<=saving_len)
        {
            if(p->data_type==0)
            {
                memcpy(p_saving_byte, &p->data_uint64, p->data_len);
            }
            else if(p->data_type==1)
            {
                if(p->p_data!=NULL)
                {
                    memcpy(p_saving_byte, p->p_data, p->data_len);
                }
            }
            p_saving_byte += p->data_len;
            copy_counter++;
            copy_size += p->data_len;
            p = p->next_item;
        }
        else
        {
            return 1;
        }
    }

    return 0;
}

void* My_D2Link_GetItem_MinId(my_d2link_t* p_list)
{
    if(p_list==NULL)
    {
        return NULL;
    }
    if(p_list->list_item_num==0)
    {
        return NULL;
    }

    my_d2link_item_t* item_index = p_list->first_item;

    my_d2link_item_t* min_id_item = p_list->first_item;
    for(int i=0; i<p_list->list_item_num; i++)
    {
        if(min_id_item->id > item_index->id)
        {
            min_id_item = item_index;
        }
        item_index = item_index->next_item;
    }
    return min_id_item;
}

void* My_D2Link_GetItem_MaxId(my_d2link_t* p_list)
{
    if(p_list==NULL)
    {
        return NULL;
    }
    if(p_list->list_item_num==0)
    {
        return NULL;
    }

    my_d2link_item_t* item_index = p_list->first_item;

    my_d2link_item_t* max_id_item = p_list->first_item;
    for(int i=0; i<p_list->list_item_num; i++)
    {
        if(max_id_item->id < item_index->id)
        {
            max_id_item = item_index;
        }
        item_index = item_index->next_item;
    }
    return max_id_item;
}

void* My_D2Link_GetItem_IdGreaterThan(my_d2link_t* p_list, my_d2link_item_t* p_item)
{
    if(p_list==NULL)
    {
        return NULL;
    }
    if(p_item==NULL)
    {
        return NULL;
    }
    if(p_list->list_item_num==0)
    {
        return NULL;
    }

    my_d2link_item_t* item_index = p_list->first_item;
    my_d2link_item_t* next_min_id_item = My_D2Link_GetItem_MaxId(p_list);

    if(p_item==next_min_id_item)
    {
        return NULL;
    }

    for(int i=0; (i<p_list->list_item_num)&&(item_index!=NULL); i++)
    {
        if((item_index->id > p_item->id) && (item_index->id < next_min_id_item->id))
        {
            next_min_id_item = item_index;
        }
        item_index = item_index->next_item;
    }
    return next_min_id_item;
}

int My_D2Link_Data_Packer_accordingID(my_d2link_t* p_list, void* saving, uint32_t saving_len, uint8_t direct)
{
    if(p_list==NULL)
    {
        return -1;
    }
    if(saving==NULL)
    {
        return -2;
    }
    if(p_list->list_item_num==0)
    {
        return -3;
    }

    #if MY_D2LINK_LIST_LIST_NAME_USED
    #endif

    if(p_list->list_data_len > saving_len)
    {
        return -4;
    }

    char* p_saving_byte = (char*)saving;
    uint32_t copy_counter = 0;
    uint32_t copy_size = 0;
    if(direct==0)
    {
        my_d2link_item_t* start_item = My_D2Link_GetItem_MinId(p_list);
        my_d2link_item_t* max_id_item = My_D2Link_GetItem_MaxId(p_list);
        if(start_item!=NULL)
        {
            my_d2link_item_t* next_item = start_item;
            for(int i=0; (i<p_list->list_item_num)&&(next_item!=NULL); i++)
            {
                if((copy_size+next_item->data_len)<=saving_len)
                {
                    if(next_item->data_type==0)
                    {
                        memcpy(p_saving_byte, &next_item->data_uint64, next_item->data_len);
                    }
                    else if(next_item->data_type==1)
                    {
                        if(next_item->p_data!=NULL)
                        {
                            memcpy(p_saving_byte, next_item->p_data, next_item->data_len);
                        }
                    }
                    p_saving_byte += next_item->data_len;
                    copy_counter++;
                    copy_size += next_item->data_len;
                    next_item = My_D2Link_GetItem_IdGreaterThan(p_list, next_item);
                }
                else
                {
                    return 1;
                }
            }
        }
    }
    else if(direct==1)
    {

    }
    else
    {

    }

    return 0;
}

/**
 * @brief 交换双向链表中两个相邻的节点
 * @param list 链表指针 (用于更新头指针)
 * @param item1 第一个节点
 * @param item2 第二个节点 (item1的下一个节点)
 */
static void My_D2Link_Swap_Items(my_d2link_t* list, my_d2link_item_t* item1, my_d2link_item_t* item2) {
    if (item1 == item2 || item1 == NULL || item2 == NULL) {
        return;
    }

    my_d2link_item_t* prev1 = item1->pri_item;
    my_d2link_item_t* next2 = item2->next_item;

    // 重新连接指针
    // item2 指向 item1 的前一个节点
    item2->pri_item = prev1;
    if (prev1) {
        prev1->next_item = item2;
    } else {
        // item1 是头节点,现在 item2 成为新的头节点
        list->first_item = item2;
    }

    // item1 指向 item2 的后一个节点
    item1->next_item = next2;
    if (next2) {
        next2->pri_item = item1;
    } else {
        // item2 是尾节点,现在 item1 成为新的尾节点
        list->end_item = item1;
    }

    // 交换 item1 和 item2 之间的连接
    item1->pri_item = item2;
    item2->next_item = item1;
}

int My_D2Link_Data_Sort_Data_accordingID(my_d2link_t* p_list, uint8_t direct) {
    // 1. 参数校验
    if (p_list == NULL || p_list->first_item == NULL) {
        return -1;
    }

    // 如果链表只有一个或没有元素,则无需排序
    if (p_list->first_item->next_item == NULL) {
        return 0;
    }

    int swapped;
    my_d2link_item_t* current;
    my_d2link_item_t* last_unsorted = NULL; // 标记每趟排序的末尾

    // 2. 冒泡排序主循环
    do {
        swapped = 0;
        current = p_list->first_item;

        // 内层循环,进行一趟冒泡
        while (current->next_item != last_unsorted) {
            int condition_met = 0;
            if (direct == 0 && current->id > current->next_item->id) {
                condition_met = 1;
            } else if (direct == 1 && current->id < current->next_item->id) {
                condition_met = 1;
            }

            if (condition_met) {
                // 3. 如果顺序错误,则交换节点
                My_D2Link_Swap_Items(p_list, current, current->next_item);
                swapped = 1;
                // 交换后,current指针现在指向的是原来的item2
                // 下一次循环将从这个位置继续比较
            } else {
                // 如果顺序正确,移动到下一个节点
                current = current->next_item;
            }
        }
        // 每趟排序后,末尾的元素已经就位
        last_unsorted = current;
    } while (swapped); // 如果一趟下来没有交换,说明已经排好序

    return 0;
}

int My_D2Link_GetItem_ContinousMaxId_next(my_d2link_t* p_list, int start_id)
{
    if(p_list==NULL)
    {
        return -1;
    }
    if(p_list->list_item_num==0)
    {
        return -2;
    }

    my_d2link_item_t* item_index = p_list->first_item;

    int j=0;
    for(; j<p_list->list_item_num; j++)
    {
        int i=0;
        item_index = p_list->first_item;
        for(; i<p_list->list_item_num&&(item_index!=NULL); i++)
        {
            if((start_id+j) == item_index->id)
            {
                break;
            }
            item_index = item_index->next_item;
        }
        if(!(i<p_list->list_item_num))
        {
            return start_id+j;
        }
    }
    
    return start_id+j;
}

int My_D2Link_GetItem_ContinousDistribution_8_ByCurId(my_d2link_t* p_list, int start_id, int end_id)
{
    if(p_list==NULL)
    {
        return -1;
    }
    if(p_list->list_item_num==0)
    {
        return -2;
    }

    my_d2link_item_t* item_index = p_list->first_item;

    int ret = 0;
    int j=0;
    for(; (j<8); j++)
    {
        int i=0;
        item_index = p_list->first_item;
        for(; i<p_list->list_item_num&&(item_index!=NULL); i++)
        {
            if((start_id+j) == item_index->id)
            {
                ret|=(1<<j);
                break;
            }
            item_index = item_index->next_item;
        }
        if(!(i<p_list->list_item_num))
        {
            
        }
        if(end_id > start_id)
        {
            if(start_id+j >= end_id)
            {
                break;
            }
        }
    }
    if(j<8)
    {
        for(; j<8; j++)
        {
            ret|=(1<<j);
        }
    }
    
    return ret;
}

void* My_D2Link_GetItem_Storage_ById(my_d2link_t* p_list, int id)
{
    if(p_list==NULL)
    {
        return NULL;
    }
    if(p_list->list_item_num==0)
    {
        return NULL;
    }

    my_d2link_item_t* item_index = p_list->first_item;
    do
    {
        if(item_index->id==id)
        {
            break;
        }
        if(item_index->next_item!=NULL)
        {
            item_index = item_index->next_item;
        }
    } while (item_index!=p_list->end_item);
    if(item_index->id==id)
    {
        return item_index->p_data;
    }
    else
    {
        return NULL;
    }
    return NULL;
}

int My_D2Link_PrintList(my_d2link_t* p_list)
{
    if(p_list==NULL)
    {
        return -1;
    }
    if(p_list->list_item_num==0)
    {
        printf("\nMy_D2Link_PrintList():list already empty\n");
        return -2;
    }

    printf("\n\nMy_D2Link_PrintList---------------------------\n");
    #if MY_D2LINK_LIST_LIST_NAME_USED
    printf("list_name=%s\n", p_list->list_name);
    #endif
    printf("list_item_num=%d\n", p_list->list_item_num);
    printf("list_data_len=%dByte\n", p_list->list_data_len);
    printf("\n");

    my_d2link_item_t* p = p_list->first_item;
    for(int i=0; i<p_list->list_item_num; i++)
    {
        printf("p_list[%d].id=0x%x(%d)\n", i, p->id, p->id);
        #if MY_D2LINK_LIST_ITEM_ITEM_NAME_USED
        printf("p_list[%d].item_name=%s\n", i, p->item_name);
        #endif
        printf("p_list[%d].data_len=0x%x(%d)\n", i, p->data_len, p->data_len);
        printf("p_list[%d].data_type=0x%x(%d)\n", i, p->data_type, p->data_type);
        if(p->data_type==0)
        {
            printf("p_list[%d].data_uint64=0x%lx(%ld)\n", i, p->data_uint64, p->data_uint64);
        }
        else if(p->data_type==1)
        {
            printf("p_list[%d].*p_data_type=0x%x(%d)\n", i, p->p_data_type, p->p_data_type);
            printf("p_list[%d].*p_data(%p)=", i, p->p_data);
            char* p_data_byte = (char*)p->p_data;
            if(p->data_len<512)
            {
                for(int j=0; j<p->data_len; j++)
                {
                    printf("%02x ", *(p_data_byte+j));
                }
                printf("\n");
            }
            else
            {
                printf("...\n");
            }
        }
        printf("\n");
        
        p = p->next_item;
    }
    printf("\nMy_D2Link_PrintList---------------------------\n\n");

    return 0;
}

my_d2link_t* My_D2Link_Creat(char* list_name)
{
    my_d2link_t* new_d2link_list = calloc(1, sizeof(my_d2link_t));

    new_d2link_list->first_item = NULL;
    new_d2link_list->end_item = NULL;
    new_d2link_list->list_item_num = 0;
    new_d2link_list->list_data_len = 0;

    #if MY_D2LINK_LIST_LIST_NAME_USED
    if(list_name!=NULL)
    {
        if(strlen(list_name)<sizeof(new_d2link_list->list_name))
        {
            memcpy(new_d2link_list->list_name, list_name, strlen(list_name));
        }
        else
        {
            memcpy(new_d2link_list->list_name, list_name, sizeof(new_d2link_list->list_name)-1);
        }
    }
    else
    {

    }
    #endif
    

    return new_d2link_list;
}

测试

#include "my_ds.h"
#include "my_log.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void test_My_D2Link_Append_Item(void)
{
    my_d2link_t* link1 = My_D2Link_Creat("link1");

    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(0, 0, sizeof(int), ""));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(1, 1, sizeof(int), "name"));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(2, 2, sizeof(int), "abcdefghijklnmopqrstuvwxyz12345678"));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(3, 3, 0, NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(4, 4, 10, NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(5, 5, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(6, 6, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(7, 7, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(8, 8, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(9, 9, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(10, 10, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(11, 11, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(12, 12, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(13, 13, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(14, 14, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(15, 15, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(16, 16, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(17, 17, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(18, 18, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(19, 19, sizeof(int), NULL));

    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(19, 190, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(10, 100, sizeof(int), NULL));


    My_D2Link_PrintList(link1);

    printf("link1=%p\n", link1);

    My_D2Link_Delete(&link1);

    printf("link1=%p\n", link1);
}

void test_My_D2Link_Insert_Item(void)
{
    my_d2link_t* link1 = My_D2Link_Creat("link1");
    
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(10, 10, sizeof(int), NULL));

    My_D2Link_Insert_Item(link1, 0, 10, My_D2Link_Create_Item_int(7, 7, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 0, 10, My_D2Link_Create_Item_int(9, 9, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 0, 9, My_D2Link_Create_Item_int(8, 8, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 0, 7, My_D2Link_Create_Item_int(6, 6, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 0, 6, My_D2Link_Create_Item_int(5, 5, sizeof(int), NULL));

    My_D2Link_Insert_Item(link1, 1, 10, My_D2Link_Create_Item_int(13, 13, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 1, 10, My_D2Link_Create_Item_int(11, 11, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 1, 11, My_D2Link_Create_Item_int(12, 12, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 1, 13, My_D2Link_Create_Item_int(14, 14, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 1, 14, My_D2Link_Create_Item_int(15, 15, sizeof(int), NULL));


    My_D2Link_Insert_Item(link1, -1, 10, My_D2Link_Create_Item_int(4, 4, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, -1, 10, My_D2Link_Create_Item_int(2, 2, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 1, 2, My_D2Link_Create_Item_int(3, 3, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 0, 2, My_D2Link_Create_Item_int(1, 1, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, -1, 10, My_D2Link_Create_Item_int(0, 0, sizeof(int), NULL));

    My_D2Link_Insert_Item(link1, -2, 10, My_D2Link_Create_Item_int(16, 16, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, -2, 10, My_D2Link_Create_Item_int(18, 18, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 1, 16, My_D2Link_Create_Item_int(17, 17, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 1, 18, My_D2Link_Create_Item_int(19, 19, sizeof(int), NULL));

    My_D2Link_Insert_Item(link1, 1, 18, My_D2Link_Create_Item_int(19, 190, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 0, 10, My_D2Link_Create_Item_int(7, 70, sizeof(int), NULL));



    My_D2Link_PrintList(link1);

    My_D2Link_Delete(&link1);
}

void test_My_D2Link_Data_Sort_Data_accordingID(void)
{
    my_d2link_t* link1 = My_D2Link_Creat("link1");

    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(0, 0, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(1, 1, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(2, 2, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(3, 3, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(4, 4, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(5, 5, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(19, 19, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(17, 17, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(7, 7, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(14, 14, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(6, 6, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(13, 13, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(16, 16, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(18, 18, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(8, 8, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(10, 10, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(11, 11, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(12, 12, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(15, 15, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(9, 9, sizeof(int), NULL));

    My_D2Link_Data_Sort_Data_accordingID(link1, 0);

    My_D2Link_PrintList(link1);

    My_D2Link_Delete(&link1);

    //-----------
    link1 = My_D2Link_Creat("link1");

    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(100, 100, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(21, 21, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(2, 2, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(3, 3, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(4, 4, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(5, 5, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(19, 19, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(17, 17, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(7, 7, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(14, 14, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(6, 6, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(13, 13, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(16, 16, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(18, 18, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(8, 8, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(10, 10, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(11, 11, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(12, 12, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(1, 1, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(0, 0, sizeof(int), NULL));
    // My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(9, 9, sizeof(int), NULL));
    // My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(15, 15, sizeof(int), NULL));

    My_D2Link_Data_Sort_Data_accordingID(link1, 0);

    My_D2Link_PrintList(link1);

    My_D2Link_Delete(&link1);

    //--------------------------------
    link1 = My_D2Link_Creat("link1");

    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(0, 0, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(1, 1, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(2, 2, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(3, 3, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(4, 4, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(5, 5, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(19, 19, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(17, 17, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(7, 7, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(14, 14, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(6, 6, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(13, 13, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(16, 16, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(18, 18, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(8, 8, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(10, 10, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(11, 11, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(12, 12, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(15, 15, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(9, 9, sizeof(int), NULL));

    My_D2Link_Data_Sort_Data_accordingID(link1, 1);

    My_D2Link_PrintList(link1);

    My_D2Link_Delete(&link1);

    //-----------
    link1 = My_D2Link_Creat("link1");

    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(100, 100, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(21, 21, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(2, 2, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(3, 3, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(4, 4, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(5, 5, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(19, 19, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(17, 17, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(7, 7, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(14, 14, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(6, 6, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(13, 13, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(16, 16, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(18, 18, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(8, 8, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(10, 10, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(11, 11, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(12, 12, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(1, 1, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(0, 0, sizeof(int), NULL));
    // My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(9, 9, sizeof(int), NULL));
    // My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(15, 15, sizeof(int), NULL));

    My_D2Link_Data_Sort_Data_accordingID(link1, 1);

    My_D2Link_PrintList(link1);

    My_D2Link_Delete(&link1);
}

void test_My_D2Link_match_id_count_statistic(void)
{
    my_d2link_t* link1 = My_D2Link_Creat("link1");

    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(0, 0, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(1, 1, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(2, 2, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(3, 3, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(100, 100, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(5, 5, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(6, 6, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(50, 50, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(40, 40, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(9, 9, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(10, 10, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(11, 11, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(12, 12, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(13, 13, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(60, 60, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(61, 61, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(80, 80, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(17, 17, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(18, 18, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(25, 25, sizeof(int), NULL));

    My_D2Link_PrintList(link1);

    printf("0 - 100:        %d\n", My_D2Link_match_id_count_statistic(link1, 0, 100));
    printf("-1000 - 1000:   %d\n", My_D2Link_match_id_count_statistic(link1, -1000, 1000));
    printf("20 - 100:       %d\n", My_D2Link_match_id_count_statistic(link1, 20, 100));
    printf("20 - 80:        %d\n", My_D2Link_match_id_count_statistic(link1, 20, 80));
    printf("70 - 75:        %d\n", My_D2Link_match_id_count_statistic(link1, 70, 75));
    printf("50 - 50:        %d\n", My_D2Link_match_id_count_statistic(link1, 50, 50));
    printf("-1000 - -50:    %d\n", My_D2Link_match_id_count_statistic(link1, -1000, -50));
    printf("200 - 1000:     %d\n", My_D2Link_match_id_count_statistic(link1, 200, 1000));

    printf("\n");

    printf("100 - 0:        %d\n", My_D2Link_match_id_count_statistic(link1, 100, 0));
    printf("1000 - -1000:   %d\n", My_D2Link_match_id_count_statistic(link1, 1000, -1000));
    printf("100 - 20:       %d\n", My_D2Link_match_id_count_statistic(link1, 100, 20));
    printf("80 - 20:        %d\n", My_D2Link_match_id_count_statistic(link1, 80, 20));
    printf("75 - 70:        %d\n", My_D2Link_match_id_count_statistic(link1, 75, 70));
    printf("50 - 50:        %d\n", My_D2Link_match_id_count_statistic(link1, 50, 50));
    printf("-50 - -1000:    %d\n", My_D2Link_match_id_count_statistic(link1, -50, -1000));
    printf("1000 - 200:     %d\n", My_D2Link_match_id_count_statistic(link1, 1000, 200));

    My_D2Link_Delete(&link1);
}

void test_My_D2Link_GetItem_ContinousMaxId_next(void)
{
    my_d2link_t* link1 = My_D2Link_Creat("link1");

    // 11010011 11111111 10000011 01010101
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(0, 0, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(1, 1, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(3, 3, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(6, 6, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(7, 7, sizeof(int), NULL));

    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(8, 8, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(9, 9, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(10, 10, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(11, 11, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(12, 12, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(13, 13, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(14, 14, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(15, 15, sizeof(int), NULL));

    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(16, 16, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(22, 22, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(23, 23, sizeof(int), NULL));

    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(25, 25, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(27, 27, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(29, 29, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(31, 31, sizeof(int), NULL));

    My_D2Link_PrintList(link1);

    printf("11010011 11111111 10000011 01010101\n");
    printf("start_id=0:     %d\n", My_D2Link_GetItem_ContinousMaxId_next(link1, 0));
    printf("start_id=-1:    %d\n", My_D2Link_GetItem_ContinousMaxId_next(link1, -1));
    printf("start_id=100:   %d\n", My_D2Link_GetItem_ContinousMaxId_next(link1, 100));
    printf("start_id=7:     %d\n", My_D2Link_GetItem_ContinousMaxId_next(link1, 7));
    printf("start_id=8:     %d\n", My_D2Link_GetItem_ContinousMaxId_next(link1, 8));
    printf("start_id=18:    %d\n", My_D2Link_GetItem_ContinousMaxId_next(link1, 18));

    printf("ContinousDistribution: 0-100:   0x%X\n", My_D2Link_GetItem_ContinousDistribution_8_ByCurId(link1, 0, 100));
    printf("ContinousDistribution: -1-100:  0x%X\n", My_D2Link_GetItem_ContinousDistribution_8_ByCurId(link1, -1, 100));
    printf("ContinousDistribution: 0-3:     0x%X\n", My_D2Link_GetItem_ContinousDistribution_8_ByCurId(link1, 0, 3));
    printf("ContinousDistribution: 7-12:    0x%X\n", My_D2Link_GetItem_ContinousDistribution_8_ByCurId(link1, 7, 12));
    printf("ContinousDistribution: 8-15:    0x%X\n", My_D2Link_GetItem_ContinousDistribution_8_ByCurId(link1, 8, 15));
    printf("ContinousDistribution: 15-23:   0x%X\n", My_D2Link_GetItem_ContinousDistribution_8_ByCurId(link1, 15, 23));
    printf("ContinousDistribution: 15-24:   0x%X\n", My_D2Link_GetItem_ContinousDistribution_8_ByCurId(link1, 15, 24));
    printf("ContinousDistribution: 24-31:   0x%X\n", My_D2Link_GetItem_ContinousDistribution_8_ByCurId(link1, 24, 31));
    printf("ContinousDistribution: 28-31:   0x%X\n", My_D2Link_GetItem_ContinousDistribution_8_ByCurId(link1, 28, 31));
    printf("ContinousDistribution: 24-100:  0x%X\n", My_D2Link_GetItem_ContinousDistribution_8_ByCurId(link1, 24, 100));
    printf("ContinousDistribution: 28-28:   0x%X\n", My_D2Link_GetItem_ContinousDistribution_8_ByCurId(link1, 28, 28));
    printf("ContinousDistribution: 28-0:    0x%X\n", My_D2Link_GetItem_ContinousDistribution_8_ByCurId(link1, 28, 0));

    My_D2Link_Delete(&link1);
}

void test_My_D2Link_GetItem_MinMaxId(void)
{
    my_d2link_t* link1 = My_D2Link_Creat("link1");

    my_d2link_item_t* minid_item = My_D2Link_GetItem_MinId(link1);
    my_d2link_item_t* maxid_item = My_D2Link_GetItem_MaxId(link1);

    if(minid_item!=NULL)
    {
        printf("minid_item->id=%d\n", minid_item->id);
    }
    else
    {
        printf("minid_item!=NULL\n");
    }

    if(maxid_item!=NULL)
    {
        printf("maxid_item->id=%d\n", maxid_item->id);
    }
    else
    {
        printf("maxid_item!=NULL\n");
    }

    printf("append id 2-7\n");
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(2, 2, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(3, 3, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(4, 4, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(5, 5, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(6, 6, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(7, 7, sizeof(int), NULL));

    My_D2Link_PrintList(link1);

    minid_item = My_D2Link_GetItem_MinId(link1);
    if(minid_item!=NULL)
    {
        printf("minid_item->id=%d\n", minid_item->id);
    }
    else
    {
        printf("minid_item!=NULL\n");
    }

    maxid_item = My_D2Link_GetItem_MaxId(link1);
    if(maxid_item!=NULL)
    {
        printf("maxid_item->id=%d\n", maxid_item->id);
    }
    else
    {
        printf("maxid_item!=NULL\n");
    }

    printf("append id 0, 1\n");
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(0, 0, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(1, 1, sizeof(int), NULL));

    minid_item = My_D2Link_GetItem_MinId(link1);
    if(minid_item!=NULL)
    {
        printf("minid_item->id=%d\n", minid_item->id);
    }
    else
    {
        printf("minid_item!=NULL\n");
    }

    printf("insert id 8, 9\n");
    My_D2Link_Insert_Item(link1, 0, 5, My_D2Link_Create_Item_int(8, 8, sizeof(int), NULL));
    My_D2Link_Insert_Item(link1, 0, 5, My_D2Link_Create_Item_int(9, 9, sizeof(int), NULL));

    maxid_item = My_D2Link_GetItem_MaxId(link1);
    if(maxid_item!=NULL)
    {
        printf("maxid_item->id=%d\n", maxid_item->id);
    }
    else
    {
        printf("maxid_item!=NULL\n");
    }

    My_D2Link_PrintList(link1);

    My_D2Link_Delete(&link1);
}

void test_My_D2Link_GetItem_IdGreaterThan(void)
{
    my_d2link_t* link1 = My_D2Link_Creat("link1");

    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(5, 5, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(6, 6, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(9, 9, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(3, 3, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(4, 4, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(0, 0, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(1, 1, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(7, 7, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(8, 8, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(2, 2, sizeof(int), NULL));
    
    My_D2Link_PrintList(link1);

    my_d2link_item_t* next_max_item = My_D2Link_GetItem_MinId(link1);
    while(next_max_item!=NULL)
    {
        printf("next_max_item->id=%d\n", next_max_item->id);
        next_max_item = My_D2Link_GetItem_IdGreaterThan(link1, next_max_item);
    }

    My_D2Link_Delete(&link1);
}

void test_My_D2Link_Data_Packer_accordingID(void)
{
    my_d2link_t* link1 = My_D2Link_Creat("link1");

    char* test_data_1 = calloc(1, 32);
    memcpy(test_data_1, "012345", sizeof("012345"));

    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(5, 5, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(6, 6, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(9, 9, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_pt_ref(3, test_data_1, strlen(test_data_1), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(4, 4, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(0, 0, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(1, 1, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_CreateItem_pt_ent(7, test_data_1, strlen(test_data_1), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(8, 8, sizeof(int), NULL));
    My_D2Link_Append_Item(link1, My_D2Link_Create_Item_int(2, 2, sizeof(int), NULL));

    My_D2Link_PrintList(link1);

    char* saving = calloc(1, link1->list_data_len);
    My_D2Link_Data_Packer_accordingID(link1, saving, link1->list_data_len, 0);
    Log_Show_Memory(saving, link1->list_data_len, NULL);


    printf("change test_data_1\n");
    memcpy(test_data_1, "9876543210", sizeof("9876543210"));

    My_D2Link_PrintList(link1);

    memset(saving, 0, link1->list_data_len);
    My_D2Link_Data_Packer_accordingID(link1, saving, link1->list_data_len, 0);
    Log_Show_Memory(saving, link1->list_data_len, NULL);


    printf("free test_data_1\n");
    free(test_data_1);
    test_data_1 = NULL;
    My_D2Link_PrintList(link1);
    My_D2Link_Data_Packer_accordingID(link1, saving, link1->list_data_len, 0);
    Log_Show_Memory(saving, link1->list_data_len, NULL);

    free(saving);

    My_D2Link_Delete(&link1);
}

int main()
{
    test_My_D2Link_Data_Packer_accordingID();

    return 0;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
error: Content is protected !!