DynamicArray.cpp
上传用户:sunyong76
上传日期:2021-10-03
资源大小:2236k
文件大小:10k
源码类别:

多国语言处理

开发平台:

Java

  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.    /*----Added By huangjin@ict.ac.cn 2006-7-23----*/
  201.    //赋值运算符必须加入对自身的判断
  202.    if (this == &array)
  203.    return *this;
  204.    /*---------------------------------------------*/
  205.    
  206.    SetEmpty();
  207.    m_nCol=array.m_nCol;
  208.    m_nRow=array.m_nRow;
  209.    pCur=array.m_pHead;
  210.    while(pCur!=NULL)
  211.    {
  212.    pAdd=(PARRAY_CHAIN)malloc(sizeof(ARRAY_CHAIN));//malloc a new node
  213.    pAdd->col=pCur->col;//get the value
  214.    pAdd->row=pCur->row;
  215.    pAdd->value=pCur->value;
  216.    pAdd->nPOS=pCur->nPOS;
  217.    pAdd->next=NULL;
  218.        pAdd->sWord=NULL;
  219.    /* 
  220. * ----- commented by huangjin@ict.ac.cn 2006-5-29 ------ 
  221. *  if(pCur->nWordLen>=0)
  222. */
  223.    /*----Added By huangjin@ict.ac.cn 2006-5-29----*/
  224.    pAdd->nWordLen=0;
  225.    if(pCur->nWordLen>0)
  226.    /*-----------------------------------------------*/
  227.    {
  228.    pAdd->nWordLen=pCur->nWordLen;
  229.    pAdd->sWord=new char[pAdd->nWordLen+1];    
  230.    strcpy(pAdd->sWord,pCur->sWord);
  231.    }    
  232.    if(pTail==NULL)
  233.    m_pHead=pAdd;//The head element
  234.    else
  235.            pTail->next=pAdd;
  236.        pTail=pAdd;
  237.    pCur=pCur->next;
  238.    }
  239.    return *this;
  240. }
  241. void CDynamicArray::SetEmpty()
  242. {
  243.    PARRAY_CHAIN pCur=m_pHead,pTemp;
  244.    while(pCur!=NULL)//delete the node 
  245.    {
  246.    pTemp=pCur->next;
  247.      if(pCur->nWordLen>0)
  248. delete [] pCur->sWord;
  249.        free(pCur); 
  250.    pCur=pTemp;
  251.    }
  252.    m_pHead=NULL;
  253.    m_nCol=0;
  254.    m_nRow=0;
  255. }
  256. bool CDynamicArray::operator ==(const CDynamicArray &array)
  257. {
  258.    PARRAY_CHAIN pFirst,pSecond;//The pointer of array chain
  259.    if(m_nCol!=array.m_nCol||m_nRow!=array.m_nRow)//Row or Col not equal
  260.    return false;
  261.    
  262.    pFirst=array.m_pHead;
  263.    pSecond=m_pHead;
  264.    while(pFirst!=NULL&&pSecond!=NULL&&pFirst->row==pSecond->row&&pFirst->col==pSecond->col&&pFirst->value==pSecond->value)
  265.    {
  266.    pFirst=pFirst->next;
  267.    pSecond=pSecond->next;
  268.    }
  269.    if(pFirst==NULL&&pSecond==NULL)
  270.         return true;
  271.    return false;
  272. }
  273. /*********************************************************************
  274.  *
  275.  *  Func Name  : GetElement
  276.  *
  277.  *  Description:  Get the element value
  278.  *              
  279.  *
  280.  *  Parameters : nRow: the row number
  281.  *               nCol: the Column number
  282.  *    
  283.  *  Returns    : the element value if found,else Infinite value
  284.  *  Author     : Kevin Zhang  
  285.  *  History    : 
  286.  *              1.create 2002-4-22
  287.  *********************************************************************/
  288. bool CDynamicArray::GetElement(int nRow, int nCol, ELEMENT_TYPE *pRetValue, int *pRetPOS,char *sRetWord)
  289. {
  290.     PARRAY_CHAIN pCur=m_pHead;
  291. *pRetValue=INFINITE_VALUE;
  292. *pRetPOS=0;
  293.    if(nRow>(int)m_nRow||nCol>(int)m_nCol)//Judge if the row and col is overflow
  294.    return false;
  295. /*
  296. #if ROW_FIRST==1
  297.    while(pCur!=NULL&&(nRow!=-1&&(int)pCur->row<nRow||(nCol!=-1&&(int)pCur->row==nRow&&(int)pCur->col<nCol)))
  298. #else
  299.    while(pCur!=NULL&&(nCol!=-1&&(int)pCur->col<nCol||((int)pCur->col==nCol&&nRow!=-1&&(int)pCur->row<nRow)))
  300. #endif
  301.    {
  302.    pCur=pCur->next;
  303.    }
  304. */
  305.    if(m_bRowFirst)
  306.    {
  307.    while(pCur!=NULL&&(nRow!=-1&&(int)pCur->row<nRow||(nCol!=-1&&(int)pCur->row==nRow&&(int)pCur->col<nCol)))
  308.    {
  309.    pCur=pCur->next;
  310.    }
  311.    }
  312.    else
  313.    {
  314.    while(pCur!=NULL&&(nCol!=-1&&(int)pCur->col<nCol||((int)pCur->col==nCol&&nRow!=-1&&(int)pCur->row<nRow)))
  315.    {
  316.    pCur=pCur->next;
  317.    }
  318.    }
  319.    if(pCur!=NULL&&((int)pCur->row==nRow||nRow==-1)&&((int)pCur->col==nCol||nCol==-1))//Find the same position
  320.    {//Find it and return the value
  321. *pRetValue=pCur->value;
  322. if(pRetPOS)
  323. *pRetPOS=pCur->nPOS;
  324.     if(sRetWord)//sWord is not empty
  325. {
  326.    strcpy(sRetWord,pCur->sWord);
  327. }
  328.    }
  329. return true;
  330. }
  331. PARRAY_CHAIN CDynamicArray::GetHead()
  332. {
  333. return m_pHead;
  334. }
  335. //Get the tail Element buffer and return the count of elements
  336. unsigned int CDynamicArray::GetTail(PARRAY_CHAIN *pTailRet)
  337. {
  338.     PARRAY_CHAIN pCur=m_pHead,pPrev=NULL;
  339. //pCur: current node;pPrev:previous node
  340. unsigned int nCount=0;
  341. while(pCur!=NULL)
  342. {
  343. nCount+=1;
  344. pPrev=pCur;
  345. pCur=pCur->next;
  346. }
  347. *pTailRet=pPrev;
  348. return nCount;
  349. }
  350. bool CDynamicArray::SetRowFirst(bool RowFirst)
  351. {
  352. m_bRowFirst=RowFirst;
  353. return true;
  354. }