功能特性
- 可存储任意格式数据
- 基础类型数据使用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;
}