数据结构:双链表

发布时间 2023-12-13 17:18:35作者: 想成为编程高手的阿曼

由于双链表中大部分操作其实和单链表操作类似,所以这里只挑关键的一些函数
1、定义与初始化

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

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

2、在某结点添加和删除后继结点

bool InsertNextDNode(DNode *p,DNode *s){//在p结点添加后继结点
    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;
}

bool DeletNextDNode(DNode *p){//删除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;
    
}

3、摧毁整个双链表

oid DestroyDLinkList(DLinkList &L){
    while (L->next!=NULL)
    {
        DeletNextDNode(L);
    }
    free(L);
    L=NULL;
}

4、打印链表,包括打印整个链表,和从某个结点开始前向或者后向打印

void print(DLinkList &L){
    DNode *p = L->next;
    while(p->next!=NULL){
        printf("%d",p->data);
        p=p->next;
    }
}

void print_next(DNode *p){
    while(p->next!=NULL){
        printf("%d",p->data);
        p=p->next;
    }
}

void print_prior(DNode *p){
    while(p->prior!=NULL){
        printf("%d",p->data);
        p=p->prior;
    }
}