双向链表

双向链表是指链表中的每个节点都有两个指针域,一个指向直接前驱节点,一个指向直接后继节点,定义如下:

typedef struct DoubleNode  
{
    int data;
    struct DoubleNode* pre;
    struct DoubleNode* next;
}DbleList;

下面分别讲解对双向链表的创建,插入和删除操作
1.创建
创建链表就是创建一个空的链表,首先明确任务为创建一个链表,我们需要做的是,创建一个头结点head,并将头结点的next和pre设置为NULL
如下:
//创建双向链表

DbleList* CreateListNode()
{
    DbleList* pHeader = new DbleList();
    pHeader->data = -1;
    pHeader->pre = NULL;
    pHeader->next = NULL;

    return pHeader;
}

2.插入
链表的插入操作是在链表中插入一个节点,这里有两个方式,第一种方式,直接在链表末尾插入节点,第二种方式在指定位置插入节点
第一种方式:需要做的是,找到链表的末尾节点,将末尾的节点的next指向我们需要插入的节点pInsert,然后将pInsert的next设置为NULL,将pInsert的pre指向末尾节点
//在链表末尾插入一个节点

int InsertListNode(DbleList* pHeader, DbleList* pInsert)
{
    if(!pHeader || !pInsert)
        return -1;

    //找到尾部节点
    DbleList* pTmp = pHeader;
    while (pTmp->next)
    {
        pTmp = pTmp->next;
    }

    pTmp->next = pInsert;//末尾的节点的next指向我们需要插入的节点pInsert
    pInsert->pre = pTmp;//pInsert的pre指向末尾节点
    pInsert->next = NULL;//pInsert的next设置为NULL

    return 0;
}

第二种方式:需要做的工作是,找到插入点i的位置节点ptmp,然后将ptmp的next赋值给pInsert的next,ptmp的next的pre赋值为pInsert,pInsert的pre赋值为ptmp,ptmp的next赋值为pInsert
如下:
//在指定位置插入一个节点

int InsertListNode(DbleList* pHeader, DbleList* pInsert, int iPos)
{
    if (!pHeader || !pInsert)
    {
        return -1;
    }
    DbleList* pTmp = pHeader;
    int i = 0;
    while (i++ < iPos && pTmp->next) //找到插入点i的位置节点ptmp
    {
        pTmp = pTmp->next;
    }
    pInsert->next = pTmp->next; //将ptmp的next赋值给pInsert的next
    pInsert->pre = pTmp; //pInsert的pre赋值为ptmp
    pTmp->next->pre = pInsert; //ptmpnext的pre赋值为pInsert
    pTmp->next = pInsert; //ptmpnext赋值为pInsert
    return 0;
}

3.删除
链表的删除操作为删除指定的元素,我们需要知道被删除节点的位置或者被删除节点的内容,可以通过节点内容找到对应的节点位置,故只给出删除对应位置节点的操作
如下:
//删除指定位置的节点

int DelListNode(DbleList* pHeader, int iPos)
{
    if (!pHeader)
    {
        return -1;
    }
    int i = 0;
    DbleList* pTmp = pHeader;
    while (i++ < iPos && pTmp->next)//找到对应ipos的节点
    {
        pTmp = pTmp->next;
    }

    pTmp->pre->next = pTmp->next; //将pTmp的pre的next指针域赋值为ptmp->next
    pTmp->next->pre = pTmp->pre;  //将pTmp的next的pre指针域赋值为pTmp->pre
    delete pTmp; //释放内存
    pTmp = NULL;

    return 0;
}

ps:水平有限,供参考使用。请大家批评指正,互相学习进步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章