双链表的简单实现(C语言)

本文详细介绍了如何使用C语言实现双链表的各种操作,包括结点的插入(后插、按位插入、尾插法、头插法)、删除(结点后删、按位删除)、查找(按位查找、按值查找)以及双链表的初始化、销毁、求表长、表判空和输出。提供完整代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插入

结点后插

// 后插结点 p结点后插入s结点
bool InsertNextNode(DLNode *p, DLNode *s){
   
    if(p->prior == NULL && s->data == NULL)      // 非法传参
        return false;
    s->next = p->next;        // s指向p的原后继结点
    if(p->next != NULL){
             // 判断p是否为最后一个结点
        (p->next)->prior = s;           // 令p的原后继结点的前继结点指向s
    }
    s->prior = p;                 // 令p成为s的前继结点
    p->next = s;                  // 令p后继结点为s
    return true;
}

图示:
在这里插入图片描述

按位插入

// 按位插入元素
bool ListInsert(DLinkList *L, int pos, ElemType e){
   
    if(L == NULL || pos < 0)    // 数据合法性判断
        return false;
    DLNode *p = *L;          // p记录插入结点的前继结点位置
    DLNode *s = (DLNode *)malloc(sizeof(DLNode));   // s为插入结点
    int i = 0;
    while(i < pos-1){
                // 定位到插入位置结点
        p = p->next;
        i++;
    }
    s->data = e;                // 数据暂存
    if(InsertNextNode(p, s)){
      // 结点后插
        return true;
    }else
        return false;
}

尾插法

// 尾插法正序创建双链表
DLinkList List_TailInsert(DLinkList L){
   
    DLNode *p = L;
    ElemType e;
    scanf("%d", &e);
    while(e != 9999){
              // 输入9999停止输入数据
        while(p->next != NULL){
    // 定位至表尾
            p = p->next;
        }
        DLNode *s = (DLNode*)malloc(sizeof(DLNode));
        s->data = e;            // 创建个结点存入数据用于插入
        s->next = NULL;
        s->prior = NULL;
        InsertNextNode(p, s);   // 调用结点后插函数
        scanf("%d", &e);
    }
    return L;
}

头插法

// 头插法逆序创建链表   
DLinkList List_HeadInsert(DLinkList L){
       
    ElemType e;
    scanf("%d", &e);    
    while(e != 9999){
              // 输入9999停止输入数据
        DLNode *s = (DLNode*)malloc(sizeof(DLNode));
        s->data = e;
        if(L->next == NULL){
       // 第一个结点要特殊处理             
            L->next = s;
            s->prior = L;
            s->next = NULL;                       
        }else{
                     // 在头指针和第一个结点之间插入结点
            L->next->prior = s; // 后继结点指向s
            s->next = L->next;  // s指向后继结点
            L->next = s;        // 前继结点指向s
            s->prior = L;       // s指向前继结点                     
        }   
        scanf("%d", &e);     
    }
    return L;
}

删除

结点后删

// 删除p结点的后继结点
bool DeleteNextNode(DLNode *p){
   
    if(p == NULL)
        return false;
    DLNode *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;
}

按位删除

// 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值