王道数据结构代码:双向链表的操作

双向链表的操作,带头节点的

InitDLinkList(DLinkList &L):初始化 ,创建一个头节点 

Empty(DLinkList L){ // 判断链表是否为空

InsertNextDNode(DNode *p , DNode *s){ // 在p节点后面插入s节点 

DeleteNextDNode(DNode *p){// 删除P节点的后继节点

DestoryList(DLinkList &L){ // 销毁双链表

bianliList(DLinkList L){///遍历链表

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define ElemType int 
typedef struct DNode{
    ElemType data;
    struct DNode *prior , *next;
}DNode , *DLinkList;

bool InitDLinkList(DLinkList &L){ // 初始化 ,创建一个头节点 
    L = (DNode*)malloc(sizeof(DNode));
    L->next = NULL;
    L->prior = NULL;
    L->data = -1 ;
    return true;
}
bool Empty(DLinkList L){ // 判断链表是否为空 
    if(L->next == NULL)
        return true;
    else return false;
} 
bool InsertNextDNode(DNode *p , DNode *s){ // 在p节点后面插入s节点 
    
    if(p == NULL || s == NULL) // 
        return false;
    s->next = p->next ; 
    //如果p没有后继节点
    if(p->next != NULL) // 看一下有没有后继节点 
        p->next->prior = s;
    p->next = s ;
    s->prior = p;
    return true;    
} 
bool DeleteNextDNode(DNode *p){// 删除P节点的后继节点
    if(p == NULL)
        return false;
    DNode *s = p->next ; 
    if(s == NULL)
        return false;
    p->next = s->next;
    if(s->next != NULL) // 如果这里是指向头结点的话,也可以不要 
        s->next->prior = p;
    
    free(s);
    return true;    
} 
void DestoryList(DLinkList &L){ // 销毁双链表
    
    while(L->next != NULL){ // L 指向的是数据节点,数据节点销毁完了,就为NULL,只剩头节点了 
        DeleteNextDNode(L);
    } 
     // 销毁完数据节点后,还要销毁头节点 
    free(L);
    L = NULL;
}
void bianliList(DLinkList L){///遍历链表
// 双向链表可以双向遍历 , 这里是后向遍历 
    DNode *p = L ;
    p = p->next ; // 过掉头节点
    while(p != NULL){
        printf("%d " , p->data);
        p = p->next ; // 前向遍历用prior 
    } 
    printf("
");
} 

// 查找函数等,都是和单链表一样的
 

int main()
{
    /// 带头节点的 
    DLinkList L ;
    InitDLinkList(L); 
    DNode *p = L;
    printf("插入数据:
");
    DNode *s;
    for(int i = 1 ; i <= 5 ; i++){
        s = (DNode*)malloc(sizeof(DNode));
        s->data = i ;
        s->next = NULL;
        s->prior = NULL;
        InsertNextDNode(p , s); // 用的是头插法,每次都在 p(头节点) 后插入数据
        // 如果要后插的话,加上下面这句话,每次都移动p指针,指向最后一个节点的位置 
        //p = s ;
    } 
    bianliList(L);
    
    if(Empty(L)){
        printf("链表为空
");
    } 
    else
        printf("链表不为空
");
    
    printf("删除指定节点的后继节点(这里指定头节点)
");
    DNode *temp_Node = L;
    DeleteNextDNode(temp_Node);
    bianliList(L);
    printf("销毁链表
");
    DestoryList(L);
    if(L == NULL) printf("销毁链表成功
");
    else printf("销毁链表失败
"); 
    
        
    return 0;
} 
原文地址:https://www.cnblogs.com/Li-ningning/p/14635242.html