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; 
}
复制代码

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

 

posted @   swefii  阅读(239)  评论(0编辑  收藏  举报
编辑推荐:
· MySQL 优化利器 SHOW PROFILE 的实现原理
· 在.NET Core中使用异步多线程高效率的处理大量数据
· 聊一聊 C#前台线程 如何阻塞程序退出
· 几种数据库优化技巧
· 聊一聊坑人的 C# MySql.Data SDK
阅读排行:
· 干掉EasyExcel!FastExcel初体验
· 跟着 8.6k Star 的开源数据库,搞 RAG!
· .NET 阻止系统睡眠/息屏
· 快手后端面试,被面试官秒挂了!
· .NET 9 中的 多级缓存 HybridCache
点击右上角即可分享
微信分享提示