# 手机号码查找算法（基数树）

typedef struct mctree_node      mctree_node;
struct mctree_node{
mctree_node     *child[10];     //节点内包含10个子节点
mctree_node     *parent;        //当前节点的父节点
dpl_uint8_t     level;          //当前节点深度
dpl_uint8_t     valid[10];      //每个子节点是否存在
//int           count[10];      //每个子节点计数器
};

typedef struct mctree_table      mctree_table;
struct mctree_table{
mctree_node     *root;
dpl_blkp_t      *blkp;
dpl_lock_t      lock;
};

dpl_status_t mcnode_find(mctree_node *root, char *id, mctree_node **valid, mctree_node **last)
{
mctree_node     *pt = NULL;
int             find = 0, i=0, j=0;

if(root == NULL || id == NULL || valid == NULL || last == NULL)
return EINVAL;
pt = *last =  root;

while(id[i] != '\0'){
j = id[i]-'0';
//若有效，则记录
if(pt->valid[j] == 1){
find  = 1;
*valid = pt;
}
//查找子节点
if(pt->child[j] != NULL){
pt = pt->child[j];
*last = pt;
}else{
break;
}
i++;
}

if(find == 1){
if((*valid)->level == strlen(id)-1)
return DPL_SUCCESS;
else
return DPL_ISCHILD;
}
return DPL_NOTFOUND;
}

dpl_status_t mcnode_add(mctree_table *mctree,char *id, mctree_node *last)
{
dpl_status_t    stat = DPL_SUCCESS;
mctree_node     *pt = NULL;
mctree_node     *pn = NULL;
int             i=0,j=0;

if(mctree == NULL || id == NULL)
return EINVAL;

if(last == NULL)
pt = mctree->root;
else
pt = last;

//查找待插入的子节点
while((id[i] != '\0') && (id[i+1] != '\0')){
j = id[i] - '0';
if(pt->child[j] == NULL){
stat = dpl_blkp_malloc(mctree->blkp, (void**)&pn);
if(DPL_SUCCESS != stat){
TRACE(dpl_blkp_malloc, stat);
return stat;
}
memset(pn, 0, sizeof(mctree_node));
pn->parent = pt; //新节点的父节点，此处用下标0
pn->level = pt->level + 1;
pt->child[j] = pn; //父节点子指向子节点
pt = pn;
}else{
pt = pt->child[j];
}
i++;
}
//插入
j = id[i] - '0';
if(pt->valid[j] == 1)
return DPL_EXIST;
pt->valid[j] = 1;
return DPL_SUCCESS;
}

• 本文已收录于以下专栏：

## 手机号码查找算法（基数树）

#define DIGITTREE_NODE_COUNT 111111 typedef struct digittree_node digittree_node; typedef struct ...
• lotus302
• 2012年02月08日 12:54
• 1344

## 【数据结构】基数树

• skyuppour
• 2015年05月19日 20:31
• 1029

## 《算法导论》第12章 二叉查找树 (3)基数树

• dc_726
• 2012年03月25日 13:38
• 6212

• taozhi20084525
• 2014年07月21日 15:32
• 1724

## 算法导论-12-2-基数树

• mishifangxiangdefeng
• 2012年07月05日 18:50
• 3957

## linux 基数树

• lonewolfxw
• 2012年09月07日 10:09
• 2402

• xiaofeng_yan
• 2017年11月22日 10:41
• 106

## (p171)基数树

• u010327109
• 2016年02月28日 18:28
• 134

## 经典查找算法 --- B+树

B+树       B+树是应文件系统所需而产生的一种B-树的变形树。一棵m 阶的B+树和m 阶的B- 树的差异在于： ⑴有n 棵子树的结点中含有n 个关键码； ⑵所有的叶子结点中包含了全部关键码的...
• sjyttkl
• 2017年04月16日 21:46
• 799

## Nginx学习笔记(十)：基数树

• fzy0201
• 2014年02月06日 18:51
• 2450

举报原因： 您举报文章：手机号码查找算法（基数树） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)