数据结构线性表C语言实现双向链表模板

本文详细介绍了一种使用C语言实现双向链表的方法,包括初始化、插入、删除、更新、查找、销毁和排序等核心操作,并附带了完整的测试代码及运行结果。

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

C语言双向链表模板

#include <stdio.h>
#include <stdlib.h>
/************************************************
 * C语言双向链表模板
 * 
 * 1.InitDLink(ElemType data) 初始化双向链表:动态分
 * 配一个头结点,让该结点的前驱和后驱都指向自己,并为头
 * 结点数据域赋值.
 * 
 * 2.DisplayDLink(DLink *head) 输出数据
 * 
 * 3.InsertDLink(DLink *head, ElemType data) 添加
 * 数据:保存头结点的上一个结点,动态分配一个新结点,让它
 * 的后驱指向头结点,前驱指向头结点的前驱,并让头结点的
 * 前驱的后驱指向新结点,最后让头结点的前驱指向新结点,并
 * 为新结点数据域赋值.
 * 
 * 4.DeleteDLink(DLink *head, ElemType deleteData)
 * 删除数据:把需要删除的结点从双向链表中删除,前驱的后驱
 * 指向后驱,后驱的前驱指向前驱,并释放该结点内存.
 * 
 * 5.UpdateDLink(DLink *head, ElemType deleteData,
 *  ElemType updateData) 更新数据:找到需要更新数据的
 * 结点对数据域进行更新.
 * 
 * 6.SelectDLink(DLink *head, ElemType data) 查找
 * 数据:找到需要的数据返回TRUE,没有找到输出没有找到并
 * 返回FALSE.
 * 
 * 7.DestoryDLink(DLink *head) 销毁双向链表:释放所有
 * 动态分配的内存.
 * 
 * 8.OrderDLink(DLink *head) 数据排序:复制一份双向链
 * 表,对复制的链表进行冒泡排序操作后,进行输出和销毁操
 * 作.
 * 
 * 作者:西瓜小羽毛
 * 日期:2020/7/22 
 ************************************************/
#define TRUE 1
#define FALSE 0
typedef bool BOOL;
typedef int ElemType;
typedef struct DLink
{
    DLink *prior;
    ElemType data;
    DLink *next;
} DLink;
/* 初始化双向链表 */
DLink *InitDLink(ElemType data)
{
    DLink *head = (DLink *)malloc(sizeof(DLink));
    head->data = data;
    head->next = head;
    head->prior = head;
    return head;
}
/* 输出数据 */
void DisplayDLink(DLink *head)
{
    if (head == NULL)
    {
        printf("双向链表未初始化\n");
        return;
    }
    DLink *pNode = head;
    while (pNode->next != head)
    {
        printf("%d ", pNode->data);
        pNode = pNode->next;
    }
    printf("%d \n", pNode->data);
}
/* 添加数据 */
void InsertDLink(DLink *head, ElemType data)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return;
    }
    DLink *node = (DLink *)malloc(sizeof(DLink));
    node->next = head;
    node->prior = head->prior;
    node->data = data;
    head->prior->next = node;
    head->prior = node;
}
/* 删除数据 */
void DeleteDLink(DLink *head, ElemType deleteData)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return;
    }
    DLink *pNode = head;
    if (deleteData == pNode->data)
    {
        DLink *qNode = pNode->next;
        pNode->data = qNode->data;
        pNode->next = qNode->next;
        pNode->next->prior = pNode;
        free(qNode);
        return;
    }
    pNode = pNode->next;
    while (pNode != head)
    {
        if (pNode->data == deleteData)
        {
            pNode->prior->next = pNode->next;
            pNode->next->prior = pNode->prior;
            free(pNode);
            break;
        }
        pNode = pNode->next;
    }
    if (pNode == head)
    {
        printf("没有找到需要删除的数据\n");
        return;
    }
    else
    {
        return;
    }
}
/* 更新数据 */
void UpdateDLink(DLink *head, ElemType deleteData, ElemType updateData)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return;
    }
    DLink *pNode = head;
    if (pNode->data == deleteData)
    {
        pNode->data = updateData;
        return;
    }
    pNode = pNode->next;
    while (pNode != head)
    {
        if (pNode->data == deleteData)
        {
            pNode->data = updateData;
            break;
        }
        pNode = pNode->next;
    }
    if (pNode == head)
    {
        printf("没有找到需要的数据\n");
        return;
    }
    else
    {
        return;
    }
}
/* 查询数据 */
ElemType SelectDLink(DLink *head, ElemType data)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return 0;
    }
    DLink *pNode = head;
    if (pNode->data == data)
    {
        return data;
    }
    pNode = pNode->next;
    while (pNode != head)
    {
        if (pNode->data == data)
        {
            break;
        }
        pNode = pNode->next;
    }
    if (pNode == head)
    {
        printf("没有找到需要的数据\n");
        return 0;
    }
    else
    {
        return data;
    }
}
/* 销毁双向链表 */
void DestoryDLink(DLink *head)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return;
    }
    DLink *node = head->prior;
    DLink *pNode = head;
    DLink *qNode = head;
    while (pNode != node)
    {
        qNode = pNode;
        pNode = pNode->next;
        free(qNode);
    }
    free(node);
}
/* 数据排序 */
void OrderDLink(DLink *head)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return;
    }
    /* 复制双向链表 */
    DLink *tHead = (DLink *)malloc(sizeof(DLink));
    tHead->data = head->data;
    DLink *pNode = tHead;
    DLink *qNode = head;
    DLink *nNode = NULL;
    while (qNode->next != head)
    {
        nNode = (DLink *)malloc(sizeof(DLink));
        nNode->data = qNode->next->data;
        pNode->next = nNode;
        nNode->prior = pNode;
        pNode = pNode->next;
        qNode = qNode->next;
        nNode = nNode->next;
    }
    pNode->next = tHead;
    tHead->prior = pNode;
    pNode = tHead;
    qNode = tHead;
    while (pNode->next != tHead)
    {
        qNode = tHead;
        while (qNode->next != tHead)
        {
            if (qNode->data > qNode->next->data)
            {
                ElemType tData = qNode->next->data;
                qNode->next->data = qNode->data;
                qNode->data = tData;
            }
            qNode = qNode->next;
        }
        pNode = pNode->next;
    }
    printf("排序后:");
    DisplayDLink(tHead);
    DestoryDLink(tHead);
}

测试代码

#include "DoubleLinkList.h"
int main()
{
    /* 双向链表测试代码 */
    DLink *head = InitDLink(30);
    InsertDLink(head, 10);
    InsertDLink(head, 16);
    InsertDLink(head, 30);
    InsertDLink(head, 20);
    DisplayDLink(head);
    UpdateDLink(head, 10, 22);
    printf("更新10:");
    DisplayDLink(head);
    DeleteDLink(head, 20);
    printf("删除20:");
    DisplayDLink(head);
    printf("查找数据:%d\n", SelectDLink(head, 5));
    OrderDLink(head);
}

运行结果

30 10 16 30 20
更新10:30 22 16 30 20
删除20:30 22 16 30
没有找到需要的数据
查找数据:0
排序后:16 22 30 30

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值