C++封裝的用于存放內(nèi)存塊的雙向循環(huán)列表

字號:


    C++有許多已經(jīng)封裝好的數(shù)據(jù)結(jié)構(gòu),但是當(dāng)數(shù)據(jù)不是標(biāo)準(zhǔn)數(shù)據(jù)時(shí),存在很大麻煩,如內(nèi)存塊時(shí)。
    直接進(jìn)入話題吧:
    如題:
    結(jié)構(gòu)頭文件
    #include <stdio.h>
    #include <stdlib.h>
    #define uint unsigned int
    typedef struct databuf
    {
    char *Addr ;
    unsigned int Len ;
    databuf *next;
    databuf *previous;
    }databuf,*pdatabuf ;
    class NetData
    {
    public:
    pdatabuf Data ;
    bool Lock ;
    NetData();
    ~NetData();
    void Lockdata();
    void UnLockdata();
    void WaitUnLock() ;
    void Entity_entity(pdatabuf Node,char *Addr,uint Len);
    /* first is messy print */
    void Entity_print(pdatabuf Node);
    void PrintList(pdatabuf phead);
    /* Length 1 no data only head */
    int GetLength(pdatabuf phead);
    pdatabuf Before_Null_Node(pdatabuf phead);
    /* Create,return Node add */
    pdatabuf CreateNode(pdatabuf previous,char *Addr,uint Len);
    pdatabuf CreateNode_Head();
    /* Add Node between */
    void AddNode(pdatabuf pNode,pdatabuf pNode2,char *Addr ,uint Len);
    /* Delete next Node */
    bool DeleteNode(pdatabuf pNode);
    private:
    protected:
    };
    結(jié)構(gòu)CPP文件
    NetData::NetData()
    :Lock(0)
    {
    }
    NetData::~NetData()
    {
    }
    void NetData::Lockdata()
    {
    printf("Lockedn");
    this->Lock = 1 ;
    }
    void NetData::UnLockdata()
    {
    printf("UnLockedn");
    this->Lock = 0 ;
    }
    void NetData::WaitUnLock()
    {
    while(this->Lock==1)
    {
    usleep(200000);
    }
    printf("UnLockedn");
    }
    void NetData::Entity_entity(pdatabuf Node,char *Addr,uint Len)
    {
    Node->Addr = Addr ;
    Node->Len = Len ;
    }
    pdatabuf NetData::CreateNode_Head()
    {
    pdatabuf pNode = (pdatabuf)malloc(sizeof(databuf));
    assert(pNode!=NULL);
    pNode->next = NULL ;
    pNode->previous = pNode;
    return pNode ;
    }
    /* first is messy print */
    void NetData::Entity_print(pdatabuf Node)
    {
    }
    void NetData::PrintList(pdatabuf phead)
    {
    pdatabuf p = phead ;
    while(p!=NULL)
    {
    Entity_print(p);
    p = p->next ;
    }
    }
    /* Length 1 no data only head */
    int NetData::GetLength(pdatabuf phead)
    {
    pdatabuf p = phead ; int Length=0 ;
    while(p!=NULL)
    {
    Length ++ ;
    p = p->next ;
    }
    return Length ;
    }
    pdatabuf NetData::Before_Null_Node(pdatabuf phead)
    {
    pdatabuf p = phead ;
    while(p->next!=NULL)
    {
    p=p->next ;
    }
    return p ;
    }
    /* Create,return Node add */
    pdatabuf NetData::CreateNode(pdatabuf previous,char *Addr ,uint Len)
    {
    pdatabuf pNode = (pdatabuf)malloc(sizeof(databuf));
    assert(pNode!=NULL);
    pNode->next = NULL ;
    pNode->previous = previous ;
    Entity_entity(pNode,Addr,Len);
    return pNode ;
    }
    /* Add Node between */
    void NetData::AddNode(pdatabuf pNode,pdatabuf pNode2,char *Addr,uint Len)
    {
    pdatabuf pNew = CreateNode(pNode,Addr,Len);
    pNode->next = pNew ;
    pNew->next = pNode2 ;
    //pNew->previous = pNode ;
    }
    /* Delete next Node */
    bool NetData::DeleteNode(pdatabuf pNode)
    {
    pdatabuf pDel = pNode->next ;
    if(pDel==NULL)
    {
    printf(" No Node to Delete ");
    return 0 ;
    }
    pNode->next = pDel->next ;
    pDel->next->previous = pNode ;
    pDel->previous = NULL ;
    pDel->next = NULL ;
    free(pDel->Addr);
    free(pDel);
    return 1 ;
    }