双链表

111 阅读1分钟

双链表的初始化

typedef struct DNode{
    ElemType data;d
    struct DNode *prior,*next;//前驱结点,后继结点
}

bool InitDLinkList(DLinkList &L){
    L=(DNode *)malloc(sizeof(DNode));
    if(L==NULL)//内存分配失败
        return false;
    L->prior=NULL;
    L->next=NULL;
    return true;
}

void testDLinkList(){
    DLinkLine L;
    InitDLinkList(L);
}

双链表的插入操作(尾插法)

将s的新结点插入p结点之后

Case 1:p结点的next不为NULL

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

Case 2:p结点的next为NULL(也适用于Case1)

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;
    s->prior=p;
    p->next=s;
    return true;
}

双链表的删除操作

删除p结点的后继结点

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

双链表的遍历

//后向遍历
while(p!=NULL){
    p=p->next;
}

//前向遍历
while(p!=NULL){
    p=p->prior;
}

由于双链表的按值查找和按位查找与单链表的情况相同,且双链表不可随机存取。故时间复杂度为O(n)

销毁双链表

void DestoryList(DLinkList &L){
    //循环释放各个结点数据
    while(L->next!=NULL)
        DeleteNextDNode(L);
    free(L);//释放头结点
    L=NULL;
}

引用于王道《数据结构》