简单的单链表 接口

it2024-04-19  50

链表具有头部节点,省的总处理头节点麻烦

提出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; }

 

最新回复(0)