链表具有头部节点,省的总处理头节点麻烦
提出api
typedef void CALLBACK onDataCbk(int Id, char* data);
typedef struct linklist
{
char* data;
struct linklist* next;
}list, * plist;
extern plist create_list();
extern void print_list(plist head, onDataCbk Cbk);
extern bool delete_node(plist head, char* DataP);
extern bool insert_node(plist head, char* DataP, int DataLen, int Inx);
extern int len_list(plist head);
extern bool clear_list(plist head);
extern bool delete_next_node(plist preNode);
//在回调中做特定处理,indata是判断条件,由回调中用
int delete_node_with_cbk(plist head,char*InData,onDataCbk Cbk);
/*创建链表*/
plist create_list()
{
plist phead = (plist)malloc(sizeof(list));
phead->data = NULL;
phead->next = NULL;
return phead;
}
/*打印输出*/
void print_list(plist head, onDataCbk Cbk)
{
head = head->next;
while (head)
{
Cbk(0,head->data);
head = head->next;
}
}
/*按序号查找结点值 从1开始计算*/
plist get_elem(plist head, int inx)
{
//本算法取出单链表L(带头结点)中第i个位置的结点指针
int j = 1; //计数,初始为1
plist pHd = head; //头结点指针赋给p
while ((pHd->next) && j < inx) {
pHd = pHd->next;
j++;
}
return pHd;
}
/*插入结点*/
bool insert_node(plist head, char* DataP,int DataLen,int Inx)
{
plist DesNode = get_elem(head, Inx);
plist pNew = (plist)malloc(sizeof(list));
pNew->data = (char*)malloc(DataLen+1);
ZeroMemory(pNew->data, DataLen + 1);
memcpy(pNew->data, DataP, DataLen);
pNew->next = DesNode->next;
DesNode->next = pNew;
return true;
}
int len_list(plist head)
{
int Len = 0;
while (head) {
head = head->next;
Len++;
}
return Len-1;
}
void base_free(char*msg)
{
if(msg != NULL){
free(msg);
}
}
bool clear_list(plist head)
{
plist pTemp = head;
while (head) {
pTemp = head;
head = head->next;
base_free(pTemp->data);/*释放被删除的data占用的空间*/
base_free((char*)pTemp);/*释放被删除的结点占用的空间*/
}
return true;
}
/*删除下一结点*/
bool delete_next_node(plist preNode)
{
plist pTemp = preNode->next;
preNode->next = pTemp->next;
base_free(pTemp->data);/*释放被删除的data占用的空间*/
base_free((char*)pTemp);/*释放被删除的结点占用的空间*/
return true;
}
/*删除结点,采用回调函数*/
int delete_node_with_cbk(plist head,char*InData,onDataCbk Cbk)
{
int Count = -1;
if (head == NULL) {
win_log(LOG_WARN, "-----head is null-----------");
return Count;
}
plist PreNode = head;
plist CuNode = head->next;
Count = 0;
while (CuNode)
{
if (Cbk(1, InData, CuNode->data) == true) {
PreNode->next = CuNode->next; /*elem前一个结点的next指向elem元素后一个结点*/
base_free(CuNode->data);/*释放被删除的data占用的空间*/
base_free((char*)CuNode);/*释放被删除的结点占用的空间*/
CuNode = PreNode;
Count++;
}
PreNode = CuNode;
CuNode = CuNode->next;
}
return Count;
}