双向链表

来源:互联网 发布:阿里云smtp服务器地址 编辑:程序博客网 时间:2024/05/22 14:14

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

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:水平有限,供参考使用。请大家批评指正,互相学习进步

0 0
原创粉丝点击