DynamicArray.cpp
上传用户:yxl0916
上传日期:2007-05-25
资源大小:2245k
文件大小:10k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. //ICTCLAS简介:计算所汉语词法分析系统ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System),
  3. //             功能有:中文分词;词性标注;未登录词识别。
  4. //             分词正确率高达97.58%(973专家评测结果),
  5. //             未登录词识别召回率均高于90%,其中中国人名的识别召回率接近98%;
  6. //             处理速度为31.5Kbytes/s。
  7. //著作权:  Copyright?2002-2005中科院计算所 职务著作权人:张华平 刘群
  8. //遵循协议:自然语言处理开放资源许可证1.0
  9. //Email: zhanghp@software.ict.ac.cn
  10. //Homepage:www.nlp.org.cn;mtgroup.ict.ac.cn
  11. /****************************************************************************
  12.  *
  13.  * Copyright (c) 2000, 2001 
  14.  *     Machine Group
  15.  *     Software Research Lab.
  16.  *     Institute of Computing Tech.
  17.  *     Chinese Academy of Sciences
  18.  *     All rights reserved.
  19.  *
  20.  * This file is the confidential and proprietary property of 
  21.  * Institute of Computing Tech. and the posession or use of this file requires 
  22.  * a written license from the author.
  23.  *
  24.  * Abstract:
  25.  *           Dynamic array, and the array is generally great and sparse.
  26.  *           Dynamic Array Implement
  27.  * Author: Kevin Chang (zhanghp@software.ict.ac.cn)
  28.  *
  29.  * Notes:
  30.  *                
  31.  * 
  32.  ****************************************************************************/
  33. // DynamicArray.cpp: implementation of the CDynamicArray class.
  34. //
  35. //////////////////////////////////////////////////////////////////////
  36. #include "stdafx.h"
  37. #include "DynamicArray.h"
  38. #include <stdlib.h>
  39. #include <malloc.h>
  40. #include <string.h>
  41. //////////////////////////////////////////////////////////////////////
  42. // Construction/Destruction
  43. //////////////////////////////////////////////////////////////////////
  44. CDynamicArray::CDynamicArray(bool bRowFirst)
  45. {
  46.    m_pHead=NULL;
  47.    m_nRow=0;
  48.    m_nCol=0;
  49.    m_bRowFirst=bRowFirst;
  50. }
  51. CDynamicArray::~CDynamicArray()
  52. {
  53.    PARRAY_CHAIN pCur=m_pHead,pTemp;//The pointer of array chain
  54.    while(pCur!=NULL)
  55.    {
  56.    pTemp=pCur->next;
  57.        if(pCur->sWord)
  58. delete [] pCur->sWord;
  59.    free(pCur); 
  60.    pCur=pTemp;
  61.    }
  62. }
  63. /*********************************************************************
  64.  *
  65.  *  Func Name  : GetElement
  66.  *
  67.  *  Description:  Get the element value
  68.  *              
  69.  *
  70.  *  Parameters : nRow: the row number
  71.  *               nCol: the Column number
  72.  *    
  73.  *  Returns    : the element value if found,else Infinite value
  74.  *  Author     : Kevin Zhang  
  75.  *  History    : 
  76.  *              1.create 2001-11-7
  77.  *********************************************************************/
  78. ELEMENT_TYPE CDynamicArray::GetElement(int nRow, int nCol,PARRAY_CHAIN pStart,PARRAY_CHAIN *pRet)
  79. {
  80.    PARRAY_CHAIN pCur=pStart;
  81.    if(pStart==0)
  82.     pCur=m_pHead;
  83.    if(pRet!=0)
  84.    *pRet=NULL;
  85.    if(nRow>(int)m_nRow||nCol>(int)m_nCol)//Judge if the row and col is overflow
  86.    return INFINITE_VALUE;
  87.   if(m_bRowFirst)
  88.    {
  89.    while(pCur!=NULL&&(nRow!=-1&&(int)pCur->row<nRow||(nCol!=-1&&(int)pCur->row==nRow&&(int)pCur->col<nCol)))
  90.    {
  91.    if(pRet!=0)
  92.    *pRet=pCur;
  93.    pCur=pCur->next;
  94.    }
  95.    }
  96.    else
  97.    {
  98.    while(pCur!=NULL&&(nCol!=-1&&(int)pCur->col<nCol||((int)pCur->col==nCol&&nRow!=-1&&(int)pCur->row<nRow)))
  99.    {
  100.    if(pRet!=0)
  101.    *pRet=pCur;
  102.    pCur=pCur->next;
  103.    }
  104.    }
  105.    if(pCur!=NULL&&((int)pCur->row==nRow||nRow==-1)&&((int)pCur->col==nCol||nCol==-1))//Find the same position
  106.    {//Find it and return the value
  107.    if(pRet!=0)
  108.    *pRet=pCur;
  109.    return pCur->value;
  110.    }
  111. return INFINITE_VALUE;
  112. }
  113. /*********************************************************************
  114.  *
  115.  *  Func Name  : SetElement
  116.  *
  117.  *  Description:  Set the element value
  118.  *              
  119.  *
  120.  *  Parameters : nRow: the row number
  121.  *               nCol: the Column number
  122.  *               fValue: the value to be set
  123.  *  Returns    : the element value if found,else Infinite value
  124.  *  Author     : Kevin Zhang  
  125.  *  History    : 
  126.  *              1.create 2001-11-7
  127.  *********************************************************************/
  128. int CDynamicArray::SetElement(unsigned int nRow, unsigned int nCol, ELEMENT_TYPE fValue,int nPOS,char *sWord)
  129. {
  130.    PARRAY_CHAIN pCur=m_pHead,pPre=NULL,pAdd;//The pointer of array chain
  131.    if(nRow>m_nRow)//Set the array row
  132.    m_nRow=nRow;
  133.    if(nCol>m_nCol)//Set the array col
  134.    m_nCol=nCol;
  135.    if(m_bRowFirst)
  136.    {
  137.    while(pCur!=NULL&&(pCur->row<nRow||(pCur->row==nRow&&pCur->col<nCol)))
  138.    {
  139.    pPre=pCur;
  140.    pCur=pCur->next;
  141.    }
  142.    }
  143.    else
  144.    {
  145.    while(pCur!=NULL&&(pCur->col<nCol||(pCur->col==nCol&&pCur->row<nRow)))
  146.    {
  147.    pPre=pCur;
  148.    pCur=pCur->next;
  149.    }
  150.    }
  151.    if(pCur!=NULL&&pCur->row==nRow&&pCur->col==nCol)//Find the same position
  152.    {
  153.    pCur->value=fValue;//Set the value
  154.    pCur->nPOS=nPOS;//Set the possible POS
  155.    }
  156.    else
  157.    {
  158.        pAdd=(PARRAY_CHAIN)malloc(sizeof(ARRAY_CHAIN));//malloc a new node
  159.    pAdd->col=nCol;//get the value
  160.    pAdd->row=nRow;
  161.    pAdd->value=fValue;
  162.    pAdd->nPOS=nPOS;
  163.    if(sWord)//sWord is not empty
  164.    {
  165.    pAdd->nWordLen=strlen(sWord);
  166.    pAdd->sWord=new char[pAdd->nWordLen+1];
  167.    strcpy(pAdd->sWord,sWord);
  168.    }
  169.    else//sWord is Empty
  170.    {
  171.    pAdd->nWordLen=0;
  172.    pAdd->sWord=NULL;
  173.    }
  174.    pAdd->next=pCur;
  175.    if(pPre==NULL)//link pAdd after the pPre
  176.    m_pHead=pAdd;
  177.    else
  178.    pPre->next=pAdd;
  179.    }
  180.    return 0;
  181. }
  182. /*********************************************************************
  183.  *
  184.  *  Func Name  : operator =
  185.  *
  186.  *  Description:  operator =
  187.  *              
  188.  *
  189.  *  Parameters : 
  190.  *               
  191.  *    
  192.  *  Returns    : 
  193.  *  Author     : Kevin Chang  
  194.  *  History    : 
  195.  *              1.create 2001-11-7
  196.  *********************************************************************/
  197. const CDynamicArray & CDynamicArray::operator =(const CDynamicArray &array)
  198. {
  199.    PARRAY_CHAIN pCur,pAdd,pTail=NULL;//The pointer of array chain
  200.    SetEmpty();
  201.    m_nCol=array.m_nCol;
  202.    m_nRow=array.m_nRow;
  203.    pCur=array.m_pHead;
  204.    while(pCur!=NULL)
  205.    {
  206.    pAdd=(PARRAY_CHAIN)malloc(sizeof(ARRAY_CHAIN));//malloc a new node
  207.    pAdd->col=pCur->col;//get the value
  208.    pAdd->row=pCur->row;
  209.    pAdd->value=pCur->value;
  210.    pAdd->nPOS=pCur->nPOS;
  211.    pAdd->next=NULL;
  212.        pAdd->sWord=NULL;
  213.    if(pCur->nWordLen>=0)
  214.    {
  215.    pAdd->nWordLen=pCur->nWordLen;
  216.    pAdd->sWord=new char[pAdd->nWordLen+1];
  217.    strcpy(pAdd->sWord,pCur->sWord);
  218.    }
  219.    if(pTail==NULL)
  220.    m_pHead=pAdd;//The head element
  221.    else
  222.            pTail->next=pAdd;
  223.        pTail=pAdd;
  224.    pCur=pCur->next;
  225.    }
  226.    return *this;
  227. }
  228. void CDynamicArray::SetEmpty()
  229. {
  230.    PARRAY_CHAIN pCur=m_pHead,pTemp;
  231.    while(pCur!=NULL)//delete the node 
  232.    {
  233.    pTemp=pCur->next;
  234.      if(pCur->nWordLen>0)
  235. delete [] pCur->sWord;
  236.        free(pCur); 
  237.    pCur=pTemp;
  238.    }
  239.    m_pHead=NULL;
  240.    m_nCol=0;
  241.    m_nRow=0;
  242. }
  243. bool CDynamicArray::operator ==(const CDynamicArray &array)
  244. {
  245.    PARRAY_CHAIN pFirst,pSecond;//The pointer of array chain
  246.    if(m_nCol!=array.m_nCol||m_nRow!=array.m_nRow)//Row or Col not equal
  247.    return false;
  248.    
  249.    pFirst=array.m_pHead;
  250.    pSecond=m_pHead;
  251.    while(pFirst!=NULL&&pSecond!=NULL&&pFirst->row==pSecond->row&&pFirst->col==pSecond->col&&pFirst->value==pSecond->value)
  252.    {
  253.    pFirst=pFirst->next;
  254.    pSecond=pSecond->next;
  255.    }
  256.    if(pFirst==NULL&&pSecond==NULL)
  257.         return true;
  258.    return false;
  259. }
  260. /*********************************************************************
  261.  *
  262.  *  Func Name  : GetElement
  263.  *
  264.  *  Description:  Get the element value
  265.  *              
  266.  *
  267.  *  Parameters : nRow: the row number
  268.  *               nCol: the Column number
  269.  *    
  270.  *  Returns    : the element value if found,else Infinite value
  271.  *  Author     : Kevin Zhang  
  272.  *  History    : 
  273.  *              1.create 2002-4-22
  274.  *********************************************************************/
  275. bool CDynamicArray::GetElement(int nRow, int nCol, ELEMENT_TYPE *pRetValue, int *pRetPOS,char *sRetWord)
  276. {
  277.     PARRAY_CHAIN pCur=m_pHead;
  278. *pRetValue=INFINITE_VALUE;
  279. *pRetPOS=0;
  280.    if(nRow>(int)m_nRow||nCol>(int)m_nCol)//Judge if the row and col is overflow
  281.    return false;
  282. /*
  283. #if ROW_FIRST==1
  284.    while(pCur!=NULL&&(nRow!=-1&&(int)pCur->row<nRow||(nCol!=-1&&(int)pCur->row==nRow&&(int)pCur->col<nCol)))
  285. #else
  286.    while(pCur!=NULL&&(nCol!=-1&&(int)pCur->col<nCol||((int)pCur->col==nCol&&nRow!=-1&&(int)pCur->row<nRow)))
  287. #endif
  288.    {
  289.    pCur=pCur->next;
  290.    }
  291. */
  292.    if(m_bRowFirst)
  293.    {
  294.    while(pCur!=NULL&&(nRow!=-1&&(int)pCur->row<nRow||(nCol!=-1&&(int)pCur->row==nRow&&(int)pCur->col<nCol)))
  295.    {
  296.    pCur=pCur->next;
  297.    }
  298.    }
  299.    else
  300.    {
  301.    while(pCur!=NULL&&(nCol!=-1&&(int)pCur->col<nCol||((int)pCur->col==nCol&&nRow!=-1&&(int)pCur->row<nRow)))
  302.    {
  303.    pCur=pCur->next;
  304.    }
  305.    }
  306.    if(pCur!=NULL&&((int)pCur->row==nRow||nRow==-1)&&((int)pCur->col==nCol||nCol==-1))//Find the same position
  307.    {//Find it and return the value
  308. *pRetValue=pCur->value;
  309. if(pRetPOS)
  310. *pRetPOS=pCur->nPOS;
  311.     if(sRetWord)//sWord is not empty
  312. {
  313.    strcpy(sRetWord,pCur->sWord);
  314. }
  315.    }
  316. return true;
  317. }
  318. PARRAY_CHAIN CDynamicArray::GetHead()
  319. {
  320. return m_pHead;
  321. }
  322. //Get the tail Element buffer and return the count of elements
  323. unsigned int CDynamicArray::GetTail(PARRAY_CHAIN *pTailRet)
  324. {
  325.     PARRAY_CHAIN pCur=m_pHead,pPrev=NULL;
  326. //pCur: current node;pPrev:previous node
  327. unsigned int nCount=0;
  328. while(pCur!=NULL)
  329. {
  330. nCount+=1;
  331. pPrev=pCur;
  332. pCur=pCur->next;
  333. }
  334. *pTailRet=pPrev;
  335. return nCount;
  336. }
  337. bool CDynamicArray::SetRowFirst(bool RowFirst)
  338. {
  339. m_bRowFirst=RowFirst;
  340. return true;
  341. }