先说明一下,我的解答不一定是最好的,可以说是用最笨的办法实现了,如果哪位有好的算法,麻烦告诉我一下,谢谢了。这里上传文件有限制,示例代码传不上来,如果有谁需要的话,麻烦给我发邮件,,或者上C++交流群共享里面下载。
群号:23131919
题目:给定有规律的字符串,构造一棵树,例如
每个记录以“&”隔开,每个结点的字符串以"-"隔开。
音像制品-MTV-美丽的神话&
音像制品-MTV-完全的拥有&
音像制品-MTV-孤单一吻&
音像制品-MTV-你知道我的迷惘&
音像制品-MTV-无泪的遗憾
生成如下图所示的树型结构:
音像制品---MTV---美丽的神话
|---完全的拥有
|---孤单一吻
|---你知道我的迷惘
|---无泪的遗憾
我的思路如下:
1、扫描字符串,读出第一条记录,然后读第一个字符串“音像制品”,因为音像制品是根结点,是TVI_ROOT的子结点,所以先遍历TVI_ROOT句柄的子结点,如果发现没有音像制品结点呢,就利用音像制品这个单词生成一个结点,当做TVI_ROOT的子结点。然后把“音像制品”这个结点当成下一个结点,也就是MTV结点的根结点。如果发现“音像制品”这个结点已经找到了呢,就什么也不做。直到一条记录的字符串处理完为止。
2、再读一条记录,开始第一步。
我写的伪代码如下:
hRoot = TVI_ROOT;
while (*pr) //pr指向一条记录
{
strcpy(item, nextWord(&pr, '-'));
查找hRoot的子结点
if 子结点中有文本内容为item的结点
hRoot = 找到的结点的句柄
else
{
根据item的文本,生成一个新的结点,当作hRoot的子结点
hRoot = 刚插入的结点
}
}
具体的代码如下:
char record[300] = "\0";
char item[30] = "\0";
char *pr;
char *lpcszKey = "音像制品-MTV-美丽的神话&音像制品-MTV-完全的拥有&音像制品-MTV-孤单一吻&音像制品-MTV-你知道我的迷惘&音像制品-MTV-无泪的遗憾";
while (*lpcszKey)
{
strcpy(record, nextWord(&lpcszKey, '&'));
pr = record;
while (*pr)
{
strcpy(item, nextWord(&pr, '-')); //读取一个单词
hChild = m_TreeCtrl.GetNextItem(hRoot, TVGN_CHILD); //获取第一个子结点
while (hChild != NULL)
{
if (m_TreeCtrl.GetItemText(hChild) == item)
break;
hChild = m_TreeCtrl.GetNextItem(hChild, TVGN_NEXT);
}
if (hChild != NULL) //找到了结点
{
hRoot = hChild;
}
else //没有找到,就用item的文本构成一个结点接进去
{
//while (*pr)
//{
tvItem.mask = TVIF_TEXT | TVIF_PARAM; //结点掩码
tvItem.pszText = (LPTSTR)(LPCTSTR)item; //结点文本
tvItem.cchTextMax = 10; //文本大小
tvInsert.hParent = hRoot;
tvInsert.hInsertAfter = TVI_LAST;
tvInsert.item = tvItem;
hRoot = m_TreeCtrl.InsertItem(&tvInsert);
//strcpy(item, nextWord(&pr, '-'));
//}
}
}
hRoot = TVI_ROOT;
}
//扫描单词的函数
//根据ch的值扫描单词,比如说调用时ch为"&",那扫描的就是一条记录,如果是"-"就是记录的一个单词。
char *nextWord(char **pp, const char ch)
{
static char word[81];
while ((**pp == ch) && (**pp))
(*pp)++;
char *pw = word;
while (**pp && *(*pp) != ch)
*pw++ = *(*pp)++;
*pw = '\0';
while ((**pp == ch) && (**pp))
(*pp)++;
return word;
}
阅读(1960) | 评论(3) | 转发(0) |