Linux C 数据结构(双向循环链表)

本文详细介绍了如何使用C语言实现链表,包括结构体定义、链表初始化、节点的创建、在链表前端和后端插入节点、移除节点、查找节点、遍历链表以及销毁链表,最后还展示了如何判断链表是否为空。
摘要由CSDN通过智能技术生成

1.  创建节点

typedef struct node
{
    int data;           //数据域
    struct node * next; //指向下一个节点
    struct node * prev; //指向上一个节点
}Node , *PList;

跟老王之前写的不一样的是 加上 两个 struct node *

2.  初始化链表

PList Init_list(void)
{
    PList head = malloc(sizeof(Node));

    head->next = head->prev = head;
    return head;
}

typedef定义了一个新的指针类型PList,指向Node类型的结构体。

PList是一个指向链表节点的指针。

3.   新建node(有数据)

PList Init_node(int data)
{
    PList head = malloc(sizeof(Node));

    head->data = data;
    head->next = head->prev = head;
    return head;
}

4.   插入节点

void Insert_node_front(PList node , PList new)
{
    new->next = node;
    new->prev = node->prev;

    node->prev->next = new;
    node->prev = new;
}
//后插
void Insert_node_back(PList node , PList new)
{
    //①
    new->next = node->next;
    new->prev = node;

    //②
    node->next->prev = new;
    node->next = new;
}

new先在左边 new再去右边

5.  移除节点

void rm_node(PList node)
{
    node->prev->next = node->next;
    node->next->prev = node->prev;

    node->next = node->prev = node;
}

node 下一个 的前一个 == node 的前一个

6.  查找节点

PList find_node(PList head , int data)
{
    if(NULL == head || Empty_list(head))
        return NULL;
    
    PList temp = head->next;//从头开始
    
    while (temp != head)
    {
        if(temp->data == data)
            return temp;
        
        temp = temp->next;//下移
    }
    return NULL;
}

7.  遍历

void show_list(PList head)
{
    if(NULL == head || Empty_list(head))
        return;

    PList temp = head->next;
    while (temp->next != head)
    {
        printf("%d->",temp->data);
        temp = temp->next;
    }
    printf("%d\n",temp->data);
}

 等于头节点 结束;

8.  销毁链表

void rm_list(PList head)
{
    if(NULL == head)
        return;
    
    PList temp = head->prev;
    PList prev = NULL;
    while (temp != head)
    {
        prev = temp->prev;
        rm_node(temp);
        free(temp);
        temp = prev;
    }
    free(head);
}

9.  判断链表是否为空

        head->next==head???

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值