Chinaunix首页 | 论坛 | 博客
  • 博客访问: 561732
  • 博文数量: 97
  • 博客积分: 5090
  • 博客等级: 大校
  • 技术积分: 969
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-01 14:56
文章分类

全部博文(97)

文章存档

2011年(1)

2009年(1)

2008年(14)

2007年(37)

2006年(44)

我的朋友

分类: WINDOWS

2006-05-04 22:36:32

先说明一下,我的解答不一定是最好的,可以说是用最笨的办法实现了,如果哪位有好的算法,麻烦告诉我一下,谢谢了。这里上传文件有限制,示例代码传不上来,如果有谁需要的话,麻烦给我发邮件,,或者上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;
}
 
阅读(1927) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~