数据结构-双向循环链表

引用百度百科的概念:
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

特点:

  1. 每个数据结点中都有两个指针
  2. 直接后继(下一个节点的地址)
  3. 直接前驱(上一个节点的地址)

双向链表和单向链表的区别就在于一个有两个方向(即前、后),一个只有一个方向。在结构上也是类似的,所需要实现的功能也是增、删、改、查。

//双向链表节点
typedef struct double_list
{
    struct double_list *next;
    struct double_list *prev;
    int date;
}DOUBLE_LIST,*DOUBLE_LIST_P;
//新建头节点
DOUBLE_LIST_P Create_Head_Node()
{
    //申请头节点空间
    DOUBLE_LIST_P head = calloc(1, sizeof(DOUBLE_LIST));
    if (head == NULL)
    {
        perror("head memory request failed!\n");
        return NULL;
    }
    //初始化数据域
    head->date = 0;
    //初始化指针域
    head->next = head;
    head->prev = head;
    return head;
}
//新建节点
DOUBLE_LIST_P Create_New_Node(int date)
{
    DOUBLE_LIST_P New_node = calloc(1, sizeof(DOUBLE_LIST));
    if (New_node == NULL)
    {
        perror("New_node memory request failed!\n");
        return NULL;
    }
    //初始化数据域
    New_node->date = date;
    //初始化指针域
    New_node->next = New_node;
    New_node->prev = New_node;

    return New_node;
}
//尾插法
bool Tail_insert(DOUBLE_LIST_P head, DOUBLE_LIST_P new_node)
{
    //判断接收的头节点和新节点是否为空
    if (new_node == NULL)
    {
        perror("New_node memory receive failed!\n");
        return false;
    }
    if (head == NULL)
    {
        perror("head memory receive failed!\n");
        return false;
    }
    new_node->prev = head->prev;
	new_node->next = head;
	head->prev->next = new_node;
	head->prev = new_node; 
    return true;
}

这里要注意的是插入数据时要确保节点地址不丢失,如图
在这里插入图片描述

//查找数据
DOUBLE_LIST_P Find_Date(DOUBLE_LIST_P head, int date)
{
    if (head == NULL)
    {
        perror("head memory receive failed!\n");
        return false;
    }
    DOUBLE_LIST_P p = NULL;
    for (p = head->next; p != NULL; p = p->next)
    {
        if(p->date == date)
        {
            return p;
        }
    }
    return NULL;
}
//遍历链表
bool Show_List(DOUBLE_LIST_P head)
{
    //判断接收的头节点是否为空
    if (head == NULL)
    {
        perror("head memory receive failed!\n");
        return false;
    }
    DOUBLE_LIST_P p = NULL;
    for (p = head->next; p != head; p = p->next)
    {
        printf("%d\t", p->date);
    }
    printf("\n");
    return true;
}
//删除数据
bool Delete_Date(DOUBLE_LIST_P node)
{
    if (node == NULL)
    {
        perror("node memory receive failed!\n");
        return false;
    }
    DOUBLE_LIST_P p = node->prev;
    p->next = node->next;
    node->next->prev = p;
    node->next = NULL;
    node->prev = NULL;
    free(node);
    return true;
}
//修改数据
bool Change_Date(DOUBLE_LIST_P node,int date)
{
    if (node == NULL)
    {
        perror("node memory receive failed!\n");
        return false;
    }
    node->date = date;
    return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值