ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

语音识别的大规模汉语树形词典,搜索速度快如闪电

2021-04-25 21:01:35  阅读:105  来源: 互联网

标签:Temp temp 节点 树形 快如闪电 CTreeNode NULL 词典 storedPinyin


   语音识别的大规模汉语树形词典,搜索速度快如闪电    

  1.  #include "stdafx.h"    
  2. #include "YuyinTree.h"    
  3. #include "YuyinTreeDlg.h"    
  4.    
  5. #ifdef _DEBUG    
  6. #define new DEBUG_NEW    
  7. #undef THIS_FILE    
  8. static char THIS_FILE[] = __FILE__;   
  9. #endif    
  10.    
  11. /////////////////////////////////////////////////////////////////////////////    
  12. // CAboutDlg dialog used for App About    
  13. CStoredPinyin* m_storedPinyin[30000];   
  14. CWordTree* curTree=new CWordTree;      //指向词语树指针    
  15. CString MaxLenghci='/'';                  //存储该单词包括的最大子词    
  16. CString Tempci;                       //临时词    
  17. int StoredNum=0;       //已存入查询数组中拼音个数    
  18. class CAboutDlg : public CDialog   
  19. {   
  20. public:   
  21.     CAboutDlg();   
  22.    
  23. // Dialog Data    
  24.     //{{AFX_DATA(CAboutDlg)    
  25.     enum { IDD = IDD_ABOUTBOX };   
  26.     //}}AFX_DATA    
  27.    
  28.     // ClassWizard generated virtual function overrides    
  29.     //{{AFX_VIRTUAL(CAboutDlg)    
  30.     protected:   
  31.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support    
  32.     //}}AFX_VIRTUAL    
  33.    
  34. // Implementation    
  35. protected:   
  36.     //{{AFX_MSG(CAboutDlg)    
  37.     //}}AFX_MSG    
  38.     DECLARE_MESSAGE_MAP()   
  39. };   
  40.    
  41. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)   
  42. {   
  43.     //{{AFX_DATA_INIT(CAboutDlg)    
  44.     //}}AFX_DATA_INIT    
  45. }   
  46.    
  47. void CAboutDlg::DoDataExchange(CDataExchange* pDX)   
  48. {   
  49.     CDialog::DoDataExchange(pDX);   
  50.     //{{AFX_DATA_MAP(CAboutDlg)    
  51.     //}}AFX_DATA_MAP    
  52. }   
  53.    
  54. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)   
  55.     //{{AFX_MSG_MAP(CAboutDlg)    
  56.         // No message handlers    
  57.     //}}AFX_MSG_MAP    
  58. END_MESSAGE_MAP()   
  59.    
  60. /////////////////////////////////////////////////////////////////////////////    
  61. // CYuyinTreeDlg dialog    
  62.    
  63. CYuyinTreeDlg::CYuyinTreeDlg(CWnd* pParent /*=NULL*/)   
  64.     : CDialog(CYuyinTreeDlg::IDD, pParent)   
  65. {   
  66.     //{{AFX_DATA_INIT(CYuyinTreeDlg)    
  67.     m_inputTongyin = _T("");   
  68.     //}}AFX_DATA_INIT    
  69.     // Note that LoadIcon does not require a subsequent DestroyIcon in Win32    
  70.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);   
  71. }   
  72.    
  73. void CYuyinTreeDlg::DoDataExchange(CDataExchange* pDX)   
  74. {   
  75.     CDialog::DoDataExchange(pDX);   
  76.     //{{AFX_DATA_MAP(CYuyinTreeDlg)    
  77.     DDX_Text(pDX, IDC_PINYIN_EQUAL, m_inputTongyin);   
  78.     //}}AFX_DATA_MAP    
  79. }   
  80.    
  81. BEGIN_MESSAGE_MAP(CYuyinTreeDlg, CDialog)   
  82.     //{{AFX_MSG_MAP(CYuyinTreeDlg)    
  83.     ON_WM_SYSCOMMAND()   
  84.     ON_WM_PAINT()   
  85.     ON_WM_QUERYDRAGICON()   
  86.     ON_BN_CLICKED(IDC_BTN_READFILE, OnBtnReadfile)   
  87.     ON_BN_CLICKED(IDC_BTN_TEST_PANDCHI, OnBtnTestPandchi)   
  88.     ON_BN_CLICKED(IDC_BTN_TEST_TONGYINCI, OnBtnTestTongyinci)   
  89.     ON_BN_CLICKED(IDC_YUYIN_QUERY, OnTongyinQuery)   
  90.     ON_NOTIFY(TVN_SELCHANGED, IDC_YUYIN_TREE, OnSelchangedYuyinTree)   
  91.     //}}AFX_MSG_MAP    
  92. END_MESSAGE_MAP()   
  93.    
  94. /////////////////////////////////////////////////////////////////////////////    
  95. // CYuyinTreeDlg message handlers    
  96.    
  97. BOOL CYuyinTreeDlg::OnInitDialog()   
  98. {   
  99.     CDialog::OnInitDialog();   
  100.    
  101.     // Add "About..." menu item to system menu.    
  102.    
  103.     // IDM_ABOUTBOX must be in the system command range.    
  104.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);   
  105.     ASSERT(IDM_ABOUTBOX < 0xF000);   
  106.    
  107.     CMenu* pSysMenu = GetSystemMenu(FALSE);   
  108.     if (pSysMenu != NULL)   
  109.     {   
  110.         CString strAboutMenu;   
  111.         strAboutMenu.LoadString(IDS_ABOUTBOX);   
  112.         if (!strAboutMenu.IsEmpty())   
  113.         {   
  114.             pSysMenu->AppendMenu(MF_SEPARATOR);   
  115.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   
  116.         }   
  117.     }   
  118.    
  119.     // Set the icon for this dialog.  The framework does this automatically    
  120.     //  when the application's main window is not a dialog    
  121.     SetIcon(m_hIcon, TRUE);         // Set big icon    
  122.     SetIcon(m_hIcon, FALSE);        // Set small icon    
  123.        
  124.     // TODO: Add extra initialization here    
  125.        
  126.     //程序添加的代码:    
  127.     //初始化已读单词数组    
  128.     for(int i=0;i<30000;i++)   
  129.     {   
  130.         m_storedPinyin[i]=NULL;   
  131.     }   
  132.     FILE *InputFile=NULL;   //读取文件指针    
  133.     CTreeNode* CurNode=NULL;  //当前节点    
  134.     CTreeNode* FatherNode=NULL; //当前节点的父节点    
  135.     TCHAR NodeItem[100];   //节点的全部数据     
  136.     TCHAR NodePinyin[51];  //节点的拼音    
  137.     TCHAR NodeHanzi[50];   //节点汉字    
  138.     int ZiMuNum,j,k;   
  139.     int WordNum=0;         //统计词的数目    
  140.     BOOL IsFirst=TRUE;      //标志是否是根节点的第一个孩子节点    
  141.     CTreeNode* TempfatherNode=NULL;             //临时父节点    
  142.     CTreeNode* TempfatherNode1=NULL;             //临时父节点    
  143.     InputFile=fopen("LexiconTree.txt","r");   
  144.    
  145.     while(!feof(InputFile))   
  146.     {   
  147.         WordNum++;   
  148.         fscanf(InputFile,"%s",NodeItem);   
  149.         ZiMuNum=0;        //ZiMuNum为读取字母个数    
  150.         while(NodeItem[ZiMuNum]!=',')//读取汉字    
  151.         {   
  152.             NodeHanzi[ZiMuNum]=NodeItem[ZiMuNum];   
  153.             ZiMuNum++;   
  154.         }   
  155.         NodeHanzi[ZiMuNum]='/0';// 此时NodeHanzi存储了汉字    
  156.         ZiMuNum++;   
  157.            
  158.            
  159.         while(NodeItem[ZiMuNum]!=',')//读取词号    
  160.         {   
  161.             ZiMuNum++;   
  162.         }   
  163.         ZiMuNum++;   
  164.         j=ZiMuNum;   
  165.         k=0;   
  166.         while(NodeItem[j]!='/0')  //读拼音    
  167.         {   
  168.             NodePinyin[k]=NodeItem[j];   
  169.             k++;   
  170.             j++;   
  171.         }   
  172.         NodePinyin[k-1]='/0'; //此时NodePinyin存储了拼音    
  173.         CString TempString;  //暂时存储拼音    
  174.         TempString=NodePinyin;   
  175.            
  176.         CurNode=new CTreeNode;   
  177.         CurNode->m_Pinyin=TempString;   
  178.         CurNode->m_Word=NodeHanzi;   
  179.         CurNode->m_pParent=NULL;   
  180.         CurNode->m_pchild=NULL;   
  181.         CurNode->m_pneighbour=NULL;   
  182.         CurNode->m_pchar=NULL;   
  183.         CurNode->m_CurNum=0;   
  184.         BOOL Fviewed=FALSE;     //是否查到的标志,默认为没查到    
  185.         BOOL FParent=FALSE;     //接点是否有父节点的标志,如a,;a,ba,;a,ba,hao,    
  186.         BOOL FEqual=FALSE;       //相同发音词标志,如a,啊,阿,呵    
  187.         for(int temp=0;temp<30000;temp++) //temp为迭代次数,先检查看看是否已经插入了词    
  188.         {   
  189.             if(m_storedPinyin[temp]!=NULL)       //看当前查看的数据项是否有值,若有进入循环,否则跳过    
  190.             {   
  191.                 int t=-1;   
  192.                 t=TempString.Find(m_storedPinyin[temp]->m_StoredPinyin);       //find 的意思是找到整个匹配串    
  193.                 if(t>=0)         //若有重叠项,进入语句,插数据项    
  194.                 {   
  195.                        
  196.                     if(TempString==m_storedPinyin[temp]->m_StoredPinyin)  //若两者拼音完全相同,把汉字插入树节点项的相似字数组中    
  197.                     {   
  198.                         Fviewed=TRUE;       //查到    
  199.                         FEqual=TRUE;        //相同词标记TRUE    
  200.                         int TempCurNum=(m_storedPinyin[temp]->m_pcurPosition)->m_CurNum;   
  201.                           
  202.                         CTongyinci* temp1=new CTongyinci;   
  203.                         temp1->next=NULL;   
  204.                         temp1->m_data=new char[50];   
  205.                         strcpy(temp1->m_data,NodeHanzi);   
  206.                            
  207.                         CTongyinci* temp2=(m_storedPinyin[temp]->m_pcurPosition)->m_pchar;   
  208.                         CTongyinci* pre;   
  209.                         while(temp2!=NULL)   
  210.                         {   
  211.                             pre=temp2;   
  212.                             temp2=temp2->next;   
  213.                         }   
  214.                         pre->next=temp1;   
  215.        
  216.                         (m_storedPinyin[temp]->m_pcurPosition)->m_CurNum=(m_storedPinyin[temp]->m_pcurPosition)->m_CurNum+1;   
  217.                         break;   
  218.                     }   
  219.                     else if(t==0)         //否则,插入树节点项的子节点中,必需保证从第一个字对齐并且在待检查接点中重叠部分后一位为",",检查    
  220.                     {                     //比如a和an不能是父子节点关系;la和a不能是父子节点关系    
  221.                            
  222.                            
  223.                         Tempci=m_storedPinyin[temp]->m_StoredPinyin;   
  224.                         int Strsize=Tempci.GetLength();     //问题    
  225.    
  226.                         if(TempString.GetAt(Strsize)==',')   //若满足重叠部分后一位为","    
  227.                         {   
  228.                             FParent=TRUE;         //有父亲节点    
  229.                             if(Strsize>=MaxLenghci.GetLength())   
  230.                             {   
  231.                                MaxLenghci=Tempci;           //注意    
  232.                                TempfatherNode1=m_storedPinyin[temp]->m_pcurPosition;  //注意    
  233.                             }   
  234.                                
  235.                         Fviewed=TRUE;       //查到    
  236.                         }   
  237.                            
  238.                     }   
  239.                        
  240.                 }   
  241.             }   
  242.             else     
  243.                 continue;   
  244.         }   
  245.         if(FParent&&!FEqual)   
  246.         {   
  247.                        CurNode->m_CurNum++;                                      //当前同音字数加1    
  248.        
  249. /*                      char** pTempChar=new char*[50];                                   //开辟一个而维数组,临时值向同音字的指针  
  250.                         for(int l=0;l<50;l++)  
  251.                         {  
  252.                             pTempChar[l]=new char[50];  
  253.                             pTempChar[l][0]='/0';  
  254.                         }  
  255.                         */   
  256.                         CTongyinci* temp=new CTongyinci;   
  257.                         temp->next=NULL;   
  258.    
  259.                         temp->m_data=new char[50];   
  260.                         strcpy(temp->m_data,NodeHanzi);   
  261.                         CurNode->m_pchar=temp;   
  262.                            
  263.                         curTree->InsertNode(&CurNode,&TempfatherNode1);   //在查到的节点处插入子节点    
  264.    
  265.                         CStoredPinyin* TempStorPinyin1=new CStoredPinyin;                      //创建临时待查询对象    
  266.                           
  267.                         TempStorPinyin1->m_pcurPosition=CurNode;   
  268.                         TempStorPinyin1->m_StoredPinyin=TempString;   
  269.                         TempStorPinyin1->m_pchar=temp;   
  270.                         m_storedPinyin[StoredNum++]=TempStorPinyin1;     //将产生节点存放已访问数组中    
  271.         }   
  272.         MaxLenghci='/0';        //恢复用到的两个变量到初值    
  273.         TempfatherNode1=NULL;   
  274.    
  275.         if(!Fviewed)        //如果在已存词表中找不到该词则在根节点插入新词,并存放在已访问数组中    
  276.         {   
  277.                
  278.                
  279.             if(IsFirst==TRUE)   
  280.             {   
  281.               TempfatherNode=curTree->m_Root;                    
  282.             }     
  283.    
  284.             CurNode->m_CurNum++;                                      //当前同音字数加1    
  285.    
  286.                
  287.                
  288. /*          char** pTempChar=new char*[50];                                   //开辟一个而维数组,临时值向同音字的指针,存100个词  
  289.             for(int l=0;l<50;l++)  
  290.             {  
  291.                 pTempChar[l]=new char[10];  
  292.                 pTempChar[l][0]='/0';  
  293.             }  
  294.               
  295.   
  296.             CurNode->m_pchar=pTempChar;  
  297.             strcpy(CurNode->m_pchar[0],NodeHanzi);*/   
  298.             CTongyinci* temp=new CTongyinci;   
  299.             temp->next=NULL;   
  300.             temp->m_data=new char[50];   
  301.             strcpy(temp->m_data,NodeHanzi);   
  302.             CurNode->m_pchar=temp;   
  303.                
  304.             TempfatherNode=curTree->InsertFirstNode(&CurNode,&TempfatherNode);   //在根节点插入新词    
  305.             IsFirst=FALSE;                                                       //以后插入的点全不是第一个节点    
  306.    
  307.             CStoredPinyin* TempStorPinyin;  //创建临时待查询对象    
  308.             TempStorPinyin=new CStoredPinyin;   
  309.                
  310.             TempStorPinyin->m_pcurPosition=CurNode;   
  311.             TempStorPinyin->m_StoredPinyin=NodePinyin;   
  312.             TempStorPinyin->m_pchar=temp;   
  313.                
  314.             //排错flag   pass 10月21号    
  315.             m_storedPinyin[StoredNum]=TempStorPinyin;     //将产生节点存放已访问数组中    
  316.             StoredNum++;   
  317.         }   
  318.              
  319.     }   
  320.     char buffer[50];   
  321.     sprintf(buffer,"已读取单词: %d",WordNum);   
  322.        
  323.         AfxMessageBox(buffer);   
  324.         BrowseYuyin();   
  325.    
  326.     return TRUE;  // return TRUE  unless you set the focus to a control    
  327. }   
  328.    
  329. void CYuyinTreeDlg::OnSysCommand(UINT nID, LPARAM lParam)   
  330. {   
  331.     if ((nID & 0xFFF0) == IDM_ABOUTBOX)   
  332.     {   
  333.         CAboutDlg dlgAbout;   
  334.         dlgAbout.DoModal();   
  335.     }   
  336.     else   
  337.     {   
  338.         CDialog::OnSysCommand(nID, lParam);   
  339.     }   
  340. }   
  341.    
  342. // If you add a minimize button to your dialog, you will need the code below    
  343. //  to draw the icon.  For MFC applications using the document/view model,    
  344. //  this is automatically done for you by the framework.    
  345.    
  346. void CYuyinTreeDlg::OnPaint()    
  347. {   
  348.     if (IsIconic())   
  349.     {   
  350.         CPaintDC dc(this); // device context for painting    
  351.    
  352.         SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);   
  353.    
  354.         // Center icon in client rectangle    
  355.         int cxIcon = GetSystemMetrics(SM_CXICON);   
  356.         int cyIcon = GetSystemMetrics(SM_CYICON);   
  357.         CRect rect;   
  358.         GetClientRect(&rect);   
  359.         int x = (rect.Width() - cxIcon + 1) / 2;   
  360.         int y = (rect.Height() - cyIcon + 1) / 2;   
  361.    
  362.         // Draw the icon    
  363.         dc.DrawIcon(x, y, m_hIcon);   
  364.     }   
  365.     else   
  366.     {   
  367.         CDialog::OnPaint();   
  368.     }   
  369. }   
  370.    
  371. // The system calls this to obtain the cursor to display while the user drags    
  372. //  the minimized window.    
  373. HCURSOR CYuyinTreeDlg::OnQueryDragIcon()   
  374. {   
  375.     return (HCURSOR) m_hIcon;   
  376. }   
  377.    
  378.    
  379. // 添加的主要代码    
  380. void CYuyinTreeDlg::OnBtnReadfile()          //测试树第一层节点    
  381. {   
  382.      //检验第一层节点插入是否正确,结果正确    
  383.      CTreeNode* root=curTree->m_Root;   
  384.      CTreeNode* Temp=root->m_pchild;   
  385.      while(Temp!=NULL)   
  386.      {   
  387.        AfxMessageBox(Temp->m_Pinyin);   
  388.        Temp=Temp->m_pneighbour;   
  389.      }   
  390. }   
  391.    
  392.    
  393.    
  394. CWordTree::CWordTree()   //树的初始化    
  395. {   
  396.     m_Root=new CTreeNode;   
  397.     m_Root->m_Pinyin="";   
  398.     m_Root->m_pParent=NULL;   
  399.     m_Root->m_pchild=NULL;   
  400.     m_Root->m_pneighbour=NULL;   
  401.     m_Root->m_CurNum=0;   
  402.     m_Root->m_Word="";   
  403.     m_Root->m_pchar=NULL;   
  404. }   
  405.    
  406. void CWordTree::CreateTree()   
  407. {   
  408.        
  409. }   
  410. CTreeNode* CWordTree::InsertFirstNode(CTreeNode** newNode,CTreeNode** parent)       //插入第一层节点    
  411. {   
  412.        
  413.     CTreeNode* WilladNode=*newNode;   
  414.     CTreeNode* FatherNode=*parent;   
  415.     if(FatherNode==curTree->m_Root)   
  416.     {   
  417.         FatherNode->m_pchild=WilladNode;   
  418.         WilladNode->m_pParent=curTree->m_Root;   
  419.     }   
  420.     else   
  421.     {   
  422.         FatherNode->m_pneighbour=WilladNode;   
  423.         WilladNode->m_pParent=curTree->m_Root;   
  424.     }   
  425.        
  426.     return WilladNode;   
  427. }   
  428. void CWordTree::InsertNode(CTreeNode** newNode,CTreeNode** parent)       //插入某层节点的孩子节点    
  429. {   
  430.        
  431.     CTreeNode* WilladNode=*newNode;   
  432.     CTreeNode* FatherNode=*parent;   
  433.     CTreeNode*  Temp=NULL;   
  434.        
  435.     if(FatherNode->m_pchild==NULL)   
  436.     {   
  437.       FatherNode->m_pchild=WilladNode;   
  438.       WilladNode->m_pParent=FatherNode;   
  439.     }   
  440.     else   
  441.     {   
  442.         Temp=FatherNode->m_pchild;   
  443.         while(Temp->m_pneighbour!=NULL)   
  444.         {   
  445.             Temp=Temp->m_pneighbour;   
  446.         }   
  447.         Temp->m_pneighbour=WilladNode;   
  448.         WilladNode->m_pParent=FatherNode;   
  449.     }   
  450.    
  451. }   
  452.    
  453. void CYuyinTreeDlg::OnBtnTestPandchi()         //测试树的相邻层接点    
  454. {   
  455.         CTreeNode* root=curTree->m_Root;   
  456.         CTreeNode* Temp=root->m_pchild;   
  457.         AfxMessageBox(Temp->m_Pinyin);   
  458.         Temp=Temp->m_pchild;   
  459.         while(Temp!=NULL)   
  460.         {   
  461.             AfxMessageBox(Temp->m_Pinyin);   
  462.             Temp=Temp->m_pneighbour;   
  463.         }   
  464. }      
  465.    
  466. void CYuyinTreeDlg::OnBtnTestTongyinci()  //测试发音为'a'的同音词    
  467. {   
  468.     CTreeNode* NodeA=curTree->m_Root->m_pchild;   
  469.   CTongyinci* temp=NodeA->m_pchar;      
  470.   while(temp!=NULL)   
  471.   {   
  472.       AfxMessageBox(temp->m_data);   
  473.       temp=temp->next;   
  474.   }   
  475.    
  476. }   
  477. void CYuyinTreeDlg::BrowseYuyin()    //遍历4层语音树    
  478. {   
  479.     CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_YUYIN_TREE);   
  480.     ASSERT(pCtrl != NULL);   
  481.    
  482.     TVINSERTSTRUCT tvInsert;   
  483.     tvInsert.hParent = NULL;   
  484.     tvInsert.hInsertAfter = NULL;   
  485.     tvInsert.item.mask = TVIF_TEXT;   
  486.     tvInsert.item.pszText = _T("词拼音");   
  487.    
  488.     HTREEITEM hRoot = pCtrl->InsertItem(&tvInsert);   
  489.    
  490.      CTreeNode* root=curTree->m_Root;   
  491.      CTreeNode* Temp=root->m_pchild;   
  492.    
  493.      HTREEITEM hPA=NULL;   
  494.      HTREEITEM hPB=NULL;   
  495.      HTREEITEM hPC=NULL;   
  496.      while(Temp!=NULL)   
  497.      {   
  498.        hPA=pCtrl->InsertItem(TVIF_TEXT,   
  499.        _T(Temp->m_Pinyin), 0, 0, 0, 0, 0, hRoot, NULL);   
  500.        CTreeNode* TempNode1=Temp->m_pchild;   
  501.        while(TempNode1!=NULL)   
  502.        {   
  503.         hPB=pCtrl->InsertItem(TVIF_TEXT,   
  504.          _T(TempNode1->m_Pinyin), 0, 0, 0, 0, 0, hPA, NULL);   
  505.         CTreeNode* TempNode2=TempNode1->m_pchild;   
  506.         while(TempNode2!=NULL)   
  507.         {   
  508.             hPC=pCtrl->InsertItem(TVIF_TEXT,   
  509.             _T(TempNode2->m_Pinyin), 0, 0, 0, 0, 0, hPB, NULL);   
  510.             CTreeNode* TempNode3=TempNode2->m_pchild;   
  511.             while(TempNode3!=NULL)   
  512.             {   
  513.             pCtrl->InsertItem(TVIF_TEXT,   
  514.             _T(TempNode3->m_Pinyin), 0, 0, 0, 0, 0, hPC, NULL);   
  515.             TempNode3=TempNode3->m_pneighbour;   
  516.             }   
  517.             TempNode2=TempNode2->m_pneighbour;   
  518.         }   
  519.         TempNode1=TempNode1->m_pneighbour;   
  520.        }   
  521.        Temp=Temp->m_pneighbour;   
  522.      }   
  523.    
  524. }   
  525.    
  526. void CYuyinTreeDlg::OnTongyinQuery() //查询拼音的同音字,放入Combox中    
  527. {   
  528.     // TODO: Add your control notification handler code here    
  529.        
  530.     UpdateData(TRUE);   
  531.     CString StringWilqury=m_inputTongyin;   
  532.     CString Tempci;   
  533.     BOOL FExit=FALSE;     //该拼音在树中是否存在标志    
  534.     int TempNum;   
  535.     CComboBox* tongyinc=(CComboBox*)GetDlgItem(IDC_PINYIN_RESULT);   
  536.     ASSERT(tongyinc != NULL);   
  537.     tongyinc->ResetContent();   
  538.    ASSERT(tongyinc->GetCount() == 0);   
  539.    
  540.    
  541.     for(int temp=0;temp<30000;temp++)   
  542.     {   
  543.         if(m_storedPinyin[temp]!=NULL&&m_storedPinyin[temp]->m_StoredPinyin==StringWilqury)   
  544.         {   
  545.             TempNum=m_storedPinyin[temp]->m_pcurPosition->m_CurNum;   
  546.                
  547.     //      for(int i=0;i  
  548.                    
  549.     //      }    
  550.             CTongyinci* temp1=m_storedPinyin[temp]->m_pcurPosition->m_pchar;     
  551.             while(temp1!=NULL)   
  552.             {   
  553.             Tempci=temp1->m_data;   
  554.             temp1=temp1->next;   
  555.             tongyinc->AddString(Tempci);   
  556.             }   
  557.    
  558.    
  559.             tongyinc->SetWindowText(m_storedPinyin[temp]->m_pcurPosition->m_pchar->m_data);   
  560.             FExit=TRUE;   
  561.         }   
  562.     }   
  563.     if(!FExit)   
  564.         tongyinc->SetWindowText("该拼音在树中不存在!");   
  565.        
  566. }   
  567.    
  568.    
  569.    
  570. void CYuyinTreeDlg::OnSelchangedYuyinTree(NMHDR* pNMHDR, LRESULT* pResult) //当单击鼠标时响应函数    
  571. {   
  572.     NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;   
  573.     // TODO: Add your control notification handler code here    
  574.        
  575.     TV_ITEM item=pNMTreeView->itemNew;   
  576.     HTREEITEM hItem=item.hItem;   
  577.     CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_YUYIN_TREE);   
  578.     ASSERT(pCtrl != NULL);   
  579.     CString Tempci=pCtrl->GetItemText(hItem);   
  580.     if(Tempci=="词拼音")   
  581.         return;   
  582.        
  583.    
  584.     BOOL FExit=FALSE;     //该拼音在树中是否存在标志    
  585.     int TempNum;   
  586.     CComboBox* tongyinc=(CComboBox*)GetDlgItem(IDC_PINYIN_RESULT);   
  587.     ASSERT(tongyinc != NULL);   
  588.     tongyinc->ResetContent();   
  589.     ASSERT(tongyinc->GetCount() == 0);   
  590.    
  591.    
  592.     for(int temp=0;temp<30000;temp++)   
  593.     {   
  594.         if(m_storedPinyin[temp]!=NULL&&m_storedPinyin[temp]->m_StoredPinyin==Tempci)   
  595.         {   
  596.             TempNum=m_storedPinyin[temp]->m_pcurPosition->m_CurNum;   
  597. /*          for(int i=0;i 
  598.                 tongyinc->AddString(Tempci);  
  599.             }  
  600. */   
  601.             CTongyinci* temp1=m_storedPinyin[temp]->m_pcurPosition->m_pchar;     
  602.             while(temp1!=NULL)   
  603.             {   
  604.             Tempci=temp1->m_data;   
  605.             temp1=temp1->next;   
  606.             tongyinc->AddString(Tempci);   
  607.             }   
  608.    
  609.             tongyinc->SetWindowText(m_storedPinyin[temp]->m_pcurPosition->m_pchar->m_data);   
  610.             FExit=TRUE;   
  611.         }   
  612.     }   
  613.     if(!FExit)   
  614.         tongyinc->SetWindowText("该拼音在树中不存在!");   
  615.     *pResult = 0;   
  616. }   


标签:Temp,temp,节点,树形,快如闪电,CTreeNode,NULL,词典,storedPinyin
来源: https://blog.51cto.com/u_9634496/2732717

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有