DynamicArray.cpp
上传用户:chen_dj
上传日期:2013-04-22
资源大小:111k
文件大小:8k
源码类别:

多国语言处理

开发平台:

C/C++

  1. /****************************************************************************
  2.  *
  3.  * Copyright (c) 2000, 2001 
  4.  *     Machine Group
  5.  *     Software Research Lab.
  6.  *     Institute of Computing Tech.
  7.  *     Chinese Academy of Sciences
  8.  *     All rights reserved.
  9.  *
  10.  * This file is the confidential and proprietary property of 
  11.  * Institute of Computing Tech. and the posession or use of this file requires 
  12.  * a written license from the author.
  13.  *
  14.  * Abstract:
  15.  *           Dynamic array, and the array is generally great and sparse.
  16.  *           Dynamic Array Implement
  17.  * Author: Kevin Chang (zhanghp@software.ict.ac.cn)
  18.  *
  19.  * Notes:
  20.  *                
  21.  * 
  22.  ****************************************************************************/
  23. // DynamicArray.cpp: implementation of the CDynamicArray class.
  24. //
  25. //////////////////////////////////////////////////////////////////////
  26. #include "stdafx.h"
  27. #include "DynamicArray.h"
  28. #include <stdlib.h>
  29. #include <malloc.h>
  30. //////////////////////////////////////////////////////////////////////
  31. // Construction/Destruction
  32. //////////////////////////////////////////////////////////////////////
  33. CDynamicArray::CDynamicArray()
  34. {
  35.    m_pHead=NULL;
  36.    m_nRow=0;
  37.    m_nCol=0;
  38. }
  39. CDynamicArray::~CDynamicArray()
  40. {
  41.    PARRAY_CHAIN pCur=m_pHead,pTemp;//The pointer of array chain
  42.    while(pCur!=NULL)
  43.    {
  44.    pTemp=pCur->next;
  45.        if(pCur->sWord)
  46. delete [] pCur->sWord;
  47.    free(pCur); 
  48.    pCur=pTemp;
  49.    }
  50. }
  51. /*********************************************************************
  52.  *
  53.  *  Func Name  : GetElement
  54.  *
  55.  *  Description:  Get the element value
  56.  *              
  57.  *
  58.  *  Parameters : nRow: the row number
  59.  *               nCol: the Column number
  60.  *    
  61.  *  Returns    : the element value if found,else Infinite value
  62.  *  Author     : Kevin Zhang  
  63.  *  History    : 
  64.  *              1.create 2001-11-7
  65.  *********************************************************************/
  66. ELEMENT_TYPE CDynamicArray::GetElement(int nRow, int nCol,PARRAY_CHAIN pStart,PARRAY_CHAIN *pRet)
  67. {
  68.    PARRAY_CHAIN pCur=pStart;
  69.    if(pStart==0)
  70.     pCur=m_pHead;
  71.    if(pRet!=0)
  72.    *pRet=NULL;
  73.    if(nRow>(int)m_nRow||nCol>(int)m_nCol)//Judge if the row and col is overflow
  74.    return INFINITE_VALUE;
  75. #if ROW_FIRST==1
  76.    while(pCur!=NULL&&(nRow!=-1&&(int)pCur->row<nRow||(nCol!=-1&&(int)pCur->row==nRow&&(int)pCur->col<nCol)))
  77. #else
  78.    while(pCur!=NULL&&(nCol!=-1&&(int)pCur->col<nCol||((int)pCur->col==nCol&&nRow!=-1&&(int)pCur->row<nRow)))
  79. #endif
  80.    {
  81.    if(pRet!=0)
  82.    *pRet=pCur;
  83.    pCur=pCur->next;
  84.    }
  85.    if(pCur!=NULL&&((int)pCur->row==nRow||nRow==-1)&&((int)pCur->col==nCol||nCol==-1))//Find the same position
  86.    {//Find it and return the value
  87.    if(pRet!=0)
  88.    *pRet=pCur;
  89.    return pCur->value;
  90.    }
  91. return INFINITE_VALUE;
  92. }
  93. /*********************************************************************
  94.  *
  95.  *  Func Name  : SetElement
  96.  *
  97.  *  Description:  Set the element value
  98.  *              
  99.  *
  100.  *  Parameters : nRow: the row number
  101.  *               nCol: the Column number
  102.  *               fValue: the value to be set
  103.  *  Returns    : the element value if found,else Infinite value
  104.  *  Author     : Kevin Zhang  
  105.  *  History    : 
  106.  *              1.create 2001-11-7
  107.  *********************************************************************/
  108. int CDynamicArray::SetElement(unsigned int nRow, unsigned int nCol, ELEMENT_TYPE fValue,int nPOS,char *sWord)
  109. {
  110.    PARRAY_CHAIN pCur=m_pHead,pPre=NULL,pAdd;//The pointer of array chain
  111.    if(nRow>m_nRow)//Set the array row
  112.    m_nRow=nRow;
  113.    if(nCol>m_nCol)//Set the array col
  114.    m_nCol=nCol;
  115. #if ROW_FIRST==1
  116.    while(pCur!=NULL&&(pCur->row<nRow||(pCur->row==nRow&&pCur->col<nCol)))
  117. #else
  118.    while(pCur!=NULL&&(pCur->col<nCol||(pCur->col==nCol&&pCur->row<nRow)))
  119. #endif
  120.    {
  121.    pPre=pCur;
  122.    pCur=pCur->next;
  123.    }
  124.    if(pCur!=NULL&&pCur->row==nRow&&pCur->col==nCol)//Find the same position
  125.    {
  126.    pCur->value=fValue;//Set the value
  127.    pCur->nPOS=nPOS;//Set the possible POS
  128.    }
  129.    else
  130.    {
  131.        pAdd=(PARRAY_CHAIN)malloc(sizeof(ARRAY_CHAIN));//malloc a new node
  132.    pAdd->col=nCol;//get the value
  133.    pAdd->row=nRow;
  134.    pAdd->value=fValue;
  135.    pAdd->nPOS=nPOS;
  136.    if(sWord)//sWord is not empty
  137.    {
  138.    pAdd->nWordLen=strlen(sWord);
  139.    pAdd->sWord=new char[pAdd->nWordLen+1];
  140.    strcpy(pAdd->sWord,sWord);
  141.    }
  142.    else//sWord is Empty
  143.    {
  144.    pAdd->nWordLen=0;
  145.    pAdd->sWord=NULL;
  146.    }
  147.    pAdd->next=pCur;
  148.    if(pPre==NULL)//link pAdd after the pPre
  149.    m_pHead=pAdd;
  150.    else
  151.    pPre->next=pAdd;
  152.    }
  153.    return 0;
  154. }
  155. /*********************************************************************
  156.  *
  157.  *  Func Name  : operator =
  158.  *
  159.  *  Description:  operator =
  160.  *              
  161.  *
  162.  *  Parameters : 
  163.  *               
  164.  *    
  165.  *  Returns    : 
  166.  *  Author     : Kevin Chang  
  167.  *  History    : 
  168.  *              1.create 2001-11-7
  169.  *********************************************************************/
  170. const CDynamicArray & CDynamicArray::operator =(const CDynamicArray &array)
  171. {
  172.    PARRAY_CHAIN pCur,pAdd,pTail=NULL;//The pointer of array chain
  173.    SetEmpty();
  174.    m_nCol=array.m_nCol;
  175.    m_nRow=array.m_nRow;
  176.    pCur=array.m_pHead;
  177.    while(pCur!=NULL)
  178.    {
  179.    pAdd=(PARRAY_CHAIN)malloc(sizeof(ARRAY_CHAIN));//malloc a new node
  180.    pAdd->col=pCur->col;//get the value
  181.    pAdd->row=pCur->row;
  182.    pAdd->value=pCur->value;
  183.    pAdd->nPOS=pCur->nPOS;
  184.    pAdd->next=NULL;
  185.        
  186.    if(pTail==NULL)
  187.    m_pHead=pAdd;//The head element
  188.    else
  189.            pTail->next=pAdd;
  190.        pTail=pAdd;
  191.    pCur=pCur->next;
  192.    }
  193.    return *this;
  194. }
  195. void CDynamicArray::SetEmpty()
  196. {
  197.    PARRAY_CHAIN pCur=m_pHead,pTemp;
  198.    while(pCur!=NULL)//delete the node 
  199.    {
  200.    pTemp=pCur->next;
  201.      if(pCur->nWordLen>0)
  202. delete [] pCur->sWord;
  203.        free(pCur); 
  204.    pCur=pTemp;
  205.    }
  206.    m_pHead=NULL;
  207.    m_nCol=0;
  208.    m_nRow=0;
  209. }
  210. bool CDynamicArray::operator ==(const CDynamicArray &array)
  211. {
  212.    PARRAY_CHAIN pFirst,pSecond;//The pointer of array chain
  213.    if(m_nCol!=array.m_nCol||m_nRow!=array.m_nRow)//Row or Col not equal
  214.    return false;
  215.    
  216.    pFirst=array.m_pHead;
  217.    pSecond=m_pHead;
  218.    while(pFirst!=NULL&&pSecond!=NULL&&pFirst->row==pSecond->row&&pFirst->col==pSecond->col&&pFirst->value==pSecond->value)
  219.    {
  220.    pFirst=pFirst->next;
  221.    pSecond=pSecond->next;
  222.    }
  223.    if(pFirst==NULL&&pSecond==NULL)
  224.         return true;
  225.    return false;
  226. }
  227. /*********************************************************************
  228.  *
  229.  *  Func Name  : GetElement
  230.  *
  231.  *  Description:  Get the element value
  232.  *              
  233.  *
  234.  *  Parameters : nRow: the row number
  235.  *               nCol: the Column number
  236.  *    
  237.  *  Returns    : the element value if found,else Infinite value
  238.  *  Author     : Kevin Zhang  
  239.  *  History    : 
  240.  *              1.create 2002-4-22
  241.  *********************************************************************/
  242. bool CDynamicArray::GetElement(int nRow, int nCol, ELEMENT_TYPE *pRetValue, int *pRetPOS,char *sRetWord)
  243. {
  244.     PARRAY_CHAIN pCur=m_pHead;
  245. *pRetValue=INFINITE_VALUE;
  246. *pRetPOS=0;
  247.    if(nRow>(int)m_nRow||nCol>(int)m_nCol)//Judge if the row and col is overflow
  248.    return false;
  249. #if ROW_FIRST==1
  250.    while(pCur!=NULL&&(nRow!=-1&&(int)pCur->row<nRow||(nCol!=-1&&(int)pCur->row==nRow&&(int)pCur->col<nCol)))
  251. #else
  252.    while(pCur!=NULL&&(nCol!=-1&&(int)pCur->col<nCol||((int)pCur->col==nCol&&nRow!=-1&&(int)pCur->row<nRow)))
  253. #endif
  254.    {
  255.    pCur=pCur->next;
  256.    }
  257.    if(pCur!=NULL&&((int)pCur->row==nRow||nRow==-1)&&((int)pCur->col==nCol||nCol==-1))//Find the same position
  258.    {//Find it and return the value
  259. *pRetValue=pCur->value;
  260. if(pRetPOS)
  261. *pRetPOS=pCur->nPOS;
  262.     if(sRetWord)//sWord is not empty
  263. {
  264.    strcpy(sRetWord,pCur->sWord);
  265. }
  266.    }
  267. return true;
  268. }