DS-7-双链表的初始化,插入,删除与遍历

初始化:

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

//初始化双链表 
bool InitDLinkList(DLinklist &L) {
    L = (DNode *)malloc(sizeof(DNode));  //分配一个头结点 
    if (L == NULL) //内存不足,分配失败 
        return fatse;
    L->prior = NULL; //头结点之后暂时还没有节点
    L->next = NULL; //头结点的 prior 永远指向 NULL  
    return true;
}

//判断双链表是否为空(带头结点) 
bool Empty(DLink list L) {
    if (L->next == NULL)
        return true;
    else
        return false;
}

后插操作:

//在p结点之后插入s结点 
bool InsertNextDNode(DNode *p, DNode *s) {
    if (p == NULL Il s == NULL) //非法参数
        return false;
    s->next = p->next;
    if (p->next != NULL) //如果p结点有后继结点
        p->next->prior = s;
    s->prior = p;  
    p->next = s;
    return true;
}

有了后插操作,类似的按位序插入与前插操作也是很容易实现

删除与销毁:

//删除p结点的后继结点 
bool DelLeteNextbNode(DNode *p) 
    if (p == NULL) 
        return false;
    DNode *q = p->next; //找到p的后继结点q 
    if (q == NULL)
        return false;   //p没有后继
    p->next = q->next; 
    if(q->next!=NULL)   //q结点不是最后一个结点 
        q->next->prior=p;  
    free(q);    //释放结点空间
    return true;
}

//销毁双链表L
void DestoryList(DLinklist &L){
    //循环释放各个数据结点 
    while (L->next != NULL) 
        DeleteNextDNode(L); 
    free(L); //释放头结点 
    L=NULL;  //头指针指向NULL 
}

遍历:

//后向遍历
while (p != NULL) { 
    // 对 结点 p 做相应处理,如打印 
    p = p->next; 
}

//前向遍历
while (p != NULL) { 
    // 对结点 p 做相应处理 
    p = p->prior; 
}

//前向遍历(跳过头结点)
while (p->prior != NULL) { 
    // 对结点 p 做相应处理 
    p= p->prior; 
}

双链表不可随机存取,按位查找、按值查找操作都只能用遍历的方式实现

原文地址:https://www.cnblogs.com/swefii/p/13158701.html