// ННГУ, ВМК, Курс "Методы программирования-2", С++, ООП // // datlist.cpp - Copyright (c) Гергель В.П. 09.08.2000 // // Списки #include "datlist.h" TDatList :: TDatList() { pFirst = pLast = pStop = NULL; ListLen = 0; Reset(); } /*---------------------------------------------*/ PTDatLink TDatList :: GetLink ( PTDatValue pVal, PTDatLink pLink ) { PTDatLink temp = new TDatLink(pVal, pLink); // выделение звена if ( temp == NULL ) SetRetCode(ListNoMem); else SetRetCode(ListOK); return temp; } /*---------------------------------------------*/ void TDatList :: DelLink ( PTDatLink pLink ) { // удаление звена if ( pLink != NULL ) { if ( pLink->pValue != NULL ) delete pLink->pValue; delete pLink; } SetRetCode(ListOK); } /*---------------------------------------------*/ // методы доступа PTDatValue TDatList :: GetDatValue ( TLinkPos mode ) const { // значение PTDatLink temp; switch ( mode ) { case FIRST: temp = pFirst; break; case LAST: temp = pLast; break; default: temp = pCurrLink; break; } return (temp==NULL) ? NULL : temp->pValue; } /*---------------------------------------------*/ // методы навигации int TDatList :: SetCurrentPos ( int pos ) { // установить текущее звено Reset(); for ( int i=0; i < pos; i++, GoNext() ) SetRetCode(ListOK); return RetCode; } /*---------------------------------------------*/ int TDatList :: GetCurrentPos ( void ) const { // получить номер текущего звена return CurrPos; } /*---------------------------------------------*/ int TDatList :: Reset ( void ) { // установить на начало списка pPrevLink = pStop; if (IsEmpty()) { pCurrLink = pStop; CurrPos =-1; SetRetCode(ListEmpty); } else { pCurrLink = pFirst; CurrPos = 0; SetRetCode(ListOK); } return RetCode; } /*---------------------------------------------*/ int TDatList :: GoNext ( void ) { // сдвиг вправо текущего звена if ( pCurrLink == pStop ) SetRetCode(ListNoPos); else { SetRetCode(ListOK); pPrevLink = pCurrLink; pCurrLink = pCurrLink->GetNextDatLink(); CurrPos++; } return RetCode; } /*---------------------------------------------*/ int TDatList :: IsListEnded ( void ) const { // список завершен ? // (=1 после применения GoNext для последнего звена списка) return pCurrLink == pStop; } /*---------------------------------------------*/ // методы вставки звеньев void TDatList :: InsFirst ( PTDatValue pVal ) { // вставить перед первым PTDatLink temp = GetLink(pVal,pFirst); if ( temp == NULL ) SetRetCode(ListNoMem); else { pFirst = temp; ListLen++; // проверка пустоты списка перед вставкой if ( ListLen == 1 ) { pLast = temp; Reset(); } // корректировка текущей позиции - отличие обработки для начала списка else if ( CurrPos == 0 ) pCurrLink = temp; else CurrPos++; SetRetCode(ListOK); } } /*---------------------------------------------*/ void TDatList :: InsLast ( PTDatValue pVal ) { // вставить последним Skipped... } /*---------------------------------------------*/ void TDatList :: InsCurrent ( PTDatValue pVal ) { // вставить перед текущим Skipped... } /*---------------------------------------------*/ // методы удаления звеньев void TDatList :: DelFirst ( void ) { // удалить первое звено Skipped... } /*---------------------------------------------*/ void TDatList :: DelCurrent ( void ) { // удалить текущее звено Skipped... } /*---------------------------------------------*/ void TDatList :: DelList ( void ) { // удалить весь список while ( !IsEmpty() ) DelFirst(); pFirst = pLast = pPrevLink = pCurrLink = pStop; CurrPos = -1; }