- 阅读权限
- 50
- UID
- 43
- 帖子
- 33
- 精华
- 0
- 注册时间
- 2013-2-27
- 在线时间
- 8 小时
- UID
- 43
- 帖子
- 33
- 精华
- 0
- 注册时间
- 2013-2-27
- 在线时间
- 8 小时
|
本帖最后由 avrbase_lei 于 2013-4-12 18:38 编辑
再贴点儿工作用到的代码。单向链表。- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <assert.h>
- typedef unsigned char snl_u8;
- typedef signed char snl_s8;
- typedef unsigned short int snl_u16;
- typedef signed short int snl_s16;
- typedef unsigned int snl_u32;
- typedef signed int snl_s32;
- typedef char snl_char;
- typedef unsigned short snl_wchar;
- typedef enum {snl_false, snl_true} snl_bool;
- typedef struct single_node_list{
- struct single_node_list *next;
- void *vp;
- }SingleNodeList_t;
复制代码 在定义些函数接口,方便调试。- #define snl_trace printf
- #define snl_malloc malloc
- #define snl_mfree free
- #define snl_assert assert
- #define snl_memset memset
- #define snl_memcpy memcpy
- #define snl_memcmp memcmp
复制代码 接着就是源代码了。- /*******************************************************************************
- ** 函数: snl_alloc_new
- ** 功能: 申请一个新的节点内存
- ** 作者: avrbase_lei
- *******/
- static SingleNodeList_t *snl_alloc_new(void)
- {
- SingleNodeList_t *newnode = NULL;
- newnode = (SingleNodeList_t*)snl_malloc(sizeof(SingleNodeList_t));
- snl_assert(NULL != newnode);
- snl_memset((void*)newnode, 0, sizeof(SingleNodeList_t));
- return newnode;
- }
复制代码- /*******************************************************************************
- ** 函数: snl_delete
- ** 功能: 删除链表上snl_compare匹配到的指定的节点
- ** 如果比较函数为空则执行全部删除功能.
- ** 入参: rootpp 根节点
- ** com_node_data_p 用于参与匹配的数据
- ** traval_del 是否遍历删除链表中的节点. 否则删除离根节点最近的节点
- ** private_compare 数据匹配函数, 其返回值用于决定是否删除
- ** private_delete 数据删除函数, 本参数必须非空, 否则无法删除任何数据
- ** 返回: 返回删除的节点个数
- ** 作者: avrbase_lei
- *******/
- static snl_u32 snl_delete(
- SingleNodeList_t **rootpp,
- void *cmp_node_data_p,
- snl_bool travel_del,
- snl_bool (*private_compare)(void *, void *),
- void (*private_delete)(void *))
- {
- snl_u32 deleted_ct = 0;
- snl_bool is_del_root = snl_true;
- SingleNodeList_t *currnode = NULL, *prevnode = NULL, *delnode = NULL;
- do{
- if(NULL == rootpp)
- break;
- if(NULL == private_delete)
- break;
- if(NULL == private_compare)
- {
- currnode = *rootpp;
- while(NULL != currnode)
- {
- delnode = currnode;
- currnode = currnode->next;
- private_delete(delnode->vp);
- snl_mfree(delnode);
- deleted_ct ++;
- }
- *rootpp = NULL;
- break;
- }
- if(NULL == cmp_node_data_p)
- break;
- currnode = *rootpp;
- is_del_root = snl_true;
- while(NULL != currnode)
- {
- if(private_compare(currnode->vp, cmp_node_data_p))
- {
- //如果是根节点匹配到了, 则根节点要指向下一个节点
- if(is_del_root)
- {
- *rootpp = prevnode = currnode->next;
- }
- else
- {
- prevnode->next = currnode->next;
- is_del_root = snl_false;
- }
- //当前节点指向下一个节点
- delnode = currnode;
- currnode = currnode->next;
- //删除节点
- private_delete(delnode->vp);
- snl_mfree(delnode);
- deleted_ct ++;
- //非遍历删除则中断循环
- if(!travel_del)
- break;
- }
- else
- {
- prevnode = currnode;
- currnode = currnode->next;
- is_del_root = snl_false;
- }
- }
- }while(0);
- return deleted_ct;
- }
复制代码 估计排版很恶心。
|
|