简单分析一下:
这是简单的key,value问题,简单称之为kv问题
1、判断一个单词是否正确
结构体构建:
typedef char* keyType;
typedef struct BSTreeNode
{
struct BSTreeNode* _left;
struct BSTreeNode* _right;
keyType _key;
}BSTreeNode;
BSTreeNode* BSTreeBuyNode(keyType key)
{
BSTreeNode* node=(BSTreeNode* )malloc(sizeof(BSTreeNode));
node->_key=key;
node->_left=NULL;
node->_right=NULL;
return node;
}
插入:
int BSTreeInsertR(BSTreeNode**pptree,keyType key)//插入
{
assert(pptree);
if(NULL==*pptree)
{
*pptree=BSTreeBuyNode(key);
}
if(strcmp((*pptree)->_key,key)>0)//字符串比较
return BSTreeInsertR(&(*pptree)->_left,key);
else if(strcmp((*pptree)->_key,key)<0)
return BSTreeInsertR(&(*pptree)->_right,key);
else
return -1;//插入失败
}
test.c
void test()
{
BSTreeNode* tree = NULL;
BSTreeNode* ret;
BSTreeInsertR(&tree, "tree");
BSTreeInsertR(&tree, "binary");
BSTreeInsertR(&tree, "return");
BSTreeInsertR(&tree, "hash");
BSTreeInsertR(&tree, "list");
printf("%s\n ",BSTreeFindR(tree,"tree")->_key);
printf("%s\n ",BSTreeFindR(tree,"binary")->_key);
printf("%s\n",BSTreeFindR(tree,"return")->_key);
printf("%s\n",BSTreeFindR(tree,"hash")->_key);
printf("%s\n",BSTreeFindR(tree,"list")->_key);
printf("%p\n",BSTreeFindR(tree,"tre"));
}
2、字典的简单实现:
结构体构建:
#pragma once
typedef char* KeyType;
typedef char* ValueType;
typedef struct BSTreeNode
{
struct BSTreeNode* _left;
struct BSTreeNode* _right;
KeyType _key;
ValueType _value;
}BSTreeNode;
BSTreeNode* BuyBSTreeNode(KeyType key, ValueType value)
{
BSTreeNode* node=(BSTreeNode* )malloc(sizeof(BSTreeNode));
node->_key=key;
node->_value=value;
node->_left=NULL;
node->_right=NULL;
return node;
}
插入:
int BSTreeInsertR(BSTreeNode** pptree, KeyType key, ValueType value)//插入
{
assert(pptree);
if(NULL==*pptree)
{
*pptree=BuyBSTreeNode(key,value);
}
if(strcmp((*pptree)->_key,key)>0)
return BSTreeInsertR(&(*pptree)->_left,key,value);
else if(strcmp((*pptree)->_key,key)<0)
return BSTreeInsertR(&(*pptree)->_right,key,value);
else
return -1;
}
测试:
void TestBSTree()
{
BSTreeNode* tree = NULL;
BSTreeInsertR(&tree, "tree", "树");
BSTreeInsertR(&tree, "sort", "排序");
BSTreeInsertR(&tree, "binary", "二分");
BSTreeInsertR(&tree, "return", "返回");
BSTreeInsertR(&tree, "hash", "哈希");
BSTreeInsertR(&tree, "list", "链表");
printf("%s\n", BSTreeFindR(tree, "tree")->_value);
printf("%s\n", BSTreeFindR(tree, "return")->_value);
printf("%s\n", BSTreeFindR(tree, "hash")->_value);
printf("%s\n", BSTreeFindR(tree, "list")->_value);
printf("%p\n", BSTreeFindR(tree, "lis"));
}
3、结构体创建:
#pragma once
typedef char* KeyType;
typedef int ValueType;
typedef struct BSTreeNode
{
struct BSTreeNode* _left;
struct BSTreeNode* _right;
KeyType _key;
ValueType _value; //记录出现的次数
}BSTreeNode;
BSTreeNode* BuyBSTreeNode(KeyType key, ValueType value)//创建一个节点
{
BSTreeNode* node=(BSTreeNode* )malloc(sizeof(BSTreeNode));
node->_key=key;
node->_value=0;
node->_left=NULL;
node->_right=NULL;
return node;
}
2、插入:
int BSTreeInsertR(BSTreeNode** pptree, KeyType key, ValueType value)//插入
{
assert(pptree);
if(NULL==*pptree)
{
*pptree=BuyBSTreeNode(key,value);
(*pptree)->_value++;//统计出现次数
return 0;
}
if(strcmp((*pptree)->_key,key)>0)
return BSTreeInsertR(&(*pptree)->_left,key,value);
else if(strcmp((*pptree)->_key,key)<0)
return BSTreeInsertR(&(*pptree)->_right,key,value);
else
{
(*pptree)->_value++;//统计出现次数
return -1;
}
return 0;
}
测试:
void TestBSTree()
{
BSTreeNode* tree=NULL;
BSTreeNode* ret;
BSTreeInsertR(&tree,"123.12.1",0);
BSTreeInsertR(&tree,"124.34.2",0);
BSTreeInsertR(&tree,"123.12.1",0);
printf("%d\n",BSTreeFindR(&tree,"123.12.1")->_value);
printf("%d\n",BSTreeFindR(&tree,"124.34.2")->_value);
ret=BSTreeFindR(&tree,"124.34.0");
if(ret==-1)
{
printf("没找到\n");
}
else
{
ret->_value;
}
}