QList.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:7k
源码类别:

DVD

开发平台:

C/C++

  1. #include <assert.h>
  2. #include "QList.h"
  3. #include <stdlib.h>
  4. #include "osp.h"
  5. QList NewQList()
  6. {
  7.    QList self;
  8.    self.Clear = QListClear;
  9.    self.Add = QListAdd;
  10.    self.Insert = QListInsert;
  11.    self.GetData = QListGetData;
  12.    self.MoveToHead = QListMoveToHead;
  13.    self.MoveToTail = QListMoveToTail;
  14.    self.MoveNext = QListMoveNext;
  15.    self.MovePrev = QListMovePrev;
  16.    self.IsEmpty = QListIsEmpty;
  17.    self.GetSize = QListGetSize;
  18.    self.PlaceAtHead = QListPlaceAtHead;
  19.    self.Remove = QListRemove;
  20.    
  21.    self.m_pHead = NULL;
  22.    self.m_pTail = NULL;
  23.    self.m_pCurrent = NULL;
  24.    self.m_nSize = 0;
  25.    return self;
  26. }
  27. QList *MallocQList()
  28. {
  29.    QList *self = (QList *)KB_OSPMalloc(sizeof(QList));
  30.    if(!self) return NULL;
  31.    self->Clear = QListClear;
  32.    self->Add = QListAdd;
  33.    self->Insert = QListInsert;
  34.    self->GetData = QListGetData;
  35.    self->MoveToHead = QListMoveToHead;
  36.    self->MoveToTail = QListMoveToTail;
  37.    self->MoveNext = QListMoveNext;
  38.    self->MovePrev = QListMovePrev;
  39.    self->IsEmpty = QListIsEmpty;
  40.    self->GetSize = QListGetSize;
  41.    self->PlaceAtHead = QListPlaceAtHead;
  42.    self->Remove = QListRemove;
  43.    self->m_pHead = NULL;
  44.    self->m_pTail = NULL;
  45.    self->m_pCurrent = NULL;
  46.    self->m_nSize = 0;
  47.    return self;
  48. }
  49. void QListClear(QList *self)
  50. {
  51.    List *pTemp;
  52.    List *p;
  53.    assert(self);
  54.    if (self->m_pHead == NULL)
  55.        return;
  56.    p = self->m_pTail;
  57.    while (p)
  58.    {
  59.       pTemp = p->pPrev;      
  60.       KB_OSPFree(p);
  61.       p = NULL;
  62.       p = pTemp;
  63.    }
  64.    self->m_pHead = self->m_pTail = self->m_pCurrent = NULL;
  65. }
  66. int QListAdd(QList *self,void* pData)
  67. {
  68.    List *p;
  69.    
  70.    assert(self);
  71.    if (self->m_pHead == NULL)
  72.       return self->PlaceAtHead(self,pData);
  73.    p = self->m_pTail;
  74.    p->pNext = (List*)KB_OSPMalloc(sizeof(List));
  75.    if (p->pNext==NULL)
  76.       return QLIST_OUT_MEMORY;
  77.    
  78.    p = p->pNext;
  79.    p->pPrev = self->m_pTail;
  80.    p->pData = pData;
  81.    p->pNext = NULL;
  82.    self->m_pTail = p;
  83.    self->m_nSize++;
  84.    return QLIST_OK;
  85. }
  86. int      QListInsert(QList *self,void* pData)
  87. {
  88.    List *p;
  89.    assert(self);
  90.    if (self->m_pHead == NULL)
  91.       return self->PlaceAtHead(self,pData);
  92.    
  93.    p = (List*)KB_OSPMalloc(sizeof(List));
  94.    if (p==NULL)
  95.       return QLIST_OUT_MEMORY;
  96.    if (self->m_pCurrent->pNext == NULL)
  97.    {
  98.       // append
  99.       self->m_pCurrent->pNext = p;
  100.       p->pPrev = self->m_pCurrent;
  101.       p->pNext = NULL;
  102.    }
  103.    else
  104.    {
  105.       // insert
  106.       p->pNext = self->m_pCurrent->pNext;
  107.       p->pPrev = self->m_pCurrent;
  108.       self->m_pCurrent->pNext->pPrev = p;
  109.       self->m_pCurrent->pNext = p;
  110.    }
  111.    return QLIST_OK;
  112. }
  113. void   *QListGetData(QList *self)
  114. {
  115.    assert(self);
  116.    if (self->m_pCurrent==NULL)
  117.       return NULL;
  118.    return self->m_pCurrent->pData;
  119. }
  120. int      QListMoveToHead(QList *self)
  121. {
  122.    assert(self);
  123.    if (self->m_pHead == NULL)
  124.    {
  125.       self->m_pCurrent = NULL;
  126.       return QLIST_EMPTY;
  127.    }
  128.    self->m_pCurrent = self->m_pHead;
  129.    return QLIST_OK;
  130. }
  131. int      QListMoveToTail(QList *self)
  132. {
  133.    assert(self);
  134.    if (self->m_pTail == NULL)
  135.    {
  136.       self->m_pCurrent = NULL;
  137.       return QLIST_EMPTY;
  138.    }
  139.    self->m_pCurrent = self->m_pTail;
  140.    return QLIST_OK;
  141. }
  142. int      QListMoveNext(QList *self)
  143. {
  144.    assert(self);
  145.    if (self->m_pHead == NULL)
  146.    {
  147.       self->m_pCurrent = NULL;
  148.       return QLIST_EMPTY;
  149.    }
  150.    if (self->m_pCurrent->pNext != NULL)
  151.    {
  152.       self->m_pCurrent = self->m_pCurrent->pNext;
  153.       return QLIST_OK;
  154.    }
  155.    self->m_pCurrent = NULL;
  156.    return QLIST_END;
  157. }
  158. int      QListMovePrev(QList *self)
  159. {
  160.    assert(self);
  161.    if (self->m_pHead == NULL)
  162.    {
  163.       self->m_pCurrent = NULL;
  164.       return QLIST_EMPTY;
  165.    }
  166.    if (self->m_pCurrent->pPrev != NULL)
  167.    {
  168.       self->m_pCurrent = self->m_pCurrent->pPrev;
  169.       return QLIST_OK;
  170.    }
  171.    self->m_pCurrent = NULL;
  172.    return QLIST_BEGIN;
  173. }
  174. int      QListIsEmpty(QList *self)
  175. {
  176.    assert(self);
  177.    return (self->m_pHead==NULL);
  178. }
  179. int      QListGetSize(QList *self)
  180. {
  181.    assert(self);
  182.    return (self->m_nSize);
  183. }
  184. int      QListPlaceAtHead(QList *self,void* pData)
  185. {
  186.    assert(self);
  187.    self->m_pHead = (List*)KB_OSPMalloc(sizeof(List));
  188.    if (self->m_pHead==NULL)
  189.       return QLIST_OUT_MEMORY;
  190.    self->m_pCurrent = self->m_pHead;
  191.    self->m_pCurrent->pData = pData;
  192.    self->m_pCurrent->pNext = NULL;
  193.    self->m_pCurrent->pPrev = NULL;
  194.    self->m_pTail = self->m_pCurrent;
  195.    self->m_nSize++;
  196.    return QLIST_OK;
  197. }
  198. int      QListRemove(QList *self)
  199. {
  200.       
  201.    List *p;
  202.    List *pPrev;
  203.    List *pNext;
  204.    assert(self);
  205.    if (self->m_pHead == NULL)
  206.       return QLIST_EMPTY;
  207.    p = self->m_pCurrent;
  208.    if(p == NULL) 
  209.       return QLIST_END;
  210.    pPrev = p->pPrev;
  211.    pNext = p->pNext;
  212.    if(pPrev == NULL)
  213.    {
  214.       self->m_pHead = pNext;
  215.       pNext->pPrev = NULL;
  216.    }
  217.    else
  218.    {
  219.       pPrev->pNext = pNext;
  220.       pNext->pPrev = pPrev;
  221.    }
  222.    self->m_pCurrent = pNext;
  223.    KB_OSPFree(p);
  224.    p = NULL;
  225.    self->m_nSize--;
  226.    return QLIST_OK;
  227. }
  228. QAutoList   NewQAutoList()
  229. {
  230.    QAutoList self;
  231.    self.list = NewQList();
  232.    self.Release = QAutoListRelease;
  233.    return self;
  234. }
  235. QAutoList   *MallocQAutoList()
  236. {
  237.    QAutoList *self = (QAutoList *) KB_OSPMalloc(sizeof(QAutoList));
  238.    if(!self) return NULL;
  239.    self->list = NewQList();
  240.    self->Release = QAutoListRelease;
  241.    return self;
  242. }
  243. void   QAutoListRelease(QAutoList *self)
  244. {
  245.    List *pTemp;
  246.    List *p;
  247.    assert(self);
  248.    if (self->list.m_pHead == NULL)
  249.       return;
  250.    p = self->list.m_pTail;
  251.    while (p)
  252.    {
  253.       pTemp = p->pPrev;
  254.       if(p->pData)
  255.       {
  256.          KB_OSPFree(p->pData);
  257.          p->pData = NULL;
  258.       }
  259.       p = pTemp;
  260.    }
  261.    self->list.Clear(&self->list);   
  262. }
  263. QInn   NewQInn()
  264. {
  265.    QInn self;
  266.    self.Push = QInnPush;
  267.         self.Pop = QInnPop;
  268.         self.Release = QInnRelease;
  269.    self.pHead = NULL;
  270.    self.pTail = NULL;
  271.    return self;
  272. }
  273. QInn   *MallocQInn()
  274. {
  275.    QInn *self = (QInn *)KB_OSPMalloc(sizeof(QInn));
  276.    if(self == NULL) return NULL;
  277.    self->Push = QInnPush;
  278.         self->Pop = QInnPop;
  279.         self->Release = QInnRelease;
  280.    self->pHead = NULL;
  281.    self->pTail = NULL;
  282.    return self;
  283. }
  284. void   QInnPush(QInn *self,void *data)
  285. {
  286.    Inn *p;
  287.    Inn *temp;
  288.    assert(self);
  289.    
  290.    if(data == NULL) return;
  291.    temp = (Inn *)KB_OSPMalloc(sizeof(Inn));
  292.    if(temp == NULL) return ;
  293.    
  294.    temp->data = data;
  295.    temp->pNext = NULL;
  296.    if(self->pHead)
  297.    {
  298.       p = self->pTail;
  299.       p->pNext = temp;
  300.       self->pTail = temp;
  301.    }
  302.    else
  303.    {
  304.       self->pHead = temp;
  305.       self->pTail = temp;
  306.    }
  307. }
  308. void   *QInnPop(QInn *self)
  309. {
  310.    Inn *p;
  311.    void *data;
  312.    assert(self);
  313.    p = self->pHead;
  314.    if(p)
  315.    {
  316.       self->pHead = p->pNext;
  317.       data  = p->data;
  318.       KB_OSPFree(p);
  319.       p = NULL;
  320.       return data;
  321.    }
  322.    return NULL;
  323. }
  324. void   QInnRelease(QInn *self)
  325. {
  326.    assert(self);
  327.    self->pHead = NULL;
  328.    self->pTail = NULL;
  329. }