双链表

45 阅读1分钟

结构体

typedef struct DNode
{
    Elemtype data;
    struct DNode *prior, *next;
}DNode, *DLinkList;

初始化

bool InitDLinkList(DLinkList &L)
{
    L = (DLinkList)malloc(sizeof(DNode));
    if(L == NULL)
        return false;
    L->next = NULL;
    L->prior = NULL;
    return true;
}

判空

bool Empty(DLinkList L)
{
    if(L->next == NULL)
        return true;
    return false;
}

插入

在结点p后插入结点s,若想在结点p前插入结点s,调用InsertNextNode(p->prior, s)即可

bool InsertNextDNode(DNode *p, DNode *s)
{
    if(p == NULL || s == NULL)
        return false;
    s->next = p->next;
    if(p->next != NULL)
        p->next->prior = s;
    p->next = s;
    s->prior = p;
    return true;
}

删除

删除结点p后的结点,若想删除结点p,调用DeleteNextNode(p->prior)即可

bool DeleteNextNode(DNode *p)
{
    if(p == NULL || p->next == NULL)
        return false;
    DNode *q = p->next;
    if(q->next != NULL)
        q->next->prior = p;
    p->next = q->next;
    free(q);
    return true;
}

释放整个链表

void DestoryList(DLinkList &L)
{
    while(L->next != NULL)
        DeleteNextNode(L);
    free(L);
    L = NULL;
}

遍历

后向遍历
while(p != NULL)
{
    //对结点进行操作
    p = p->next;
}
前向遍历
while(p != NULL)
{
    //对结点进行操作
    p = p->prior;
}
前向遍历(跳过头结点)
while(p->prior != NULL)
{
    //对结点进行操作
    p = p->prior;
}