双向循环链表相关操作思想总结

  1. 定义节点结构体

节点结构体分为数据域、前指针域和后指针域,其中指针域的类型为当前结构体指针,前指针域指向前一个节点的地址,后指针域保存后一个节点的地址

将节点结构体取别名,方便后续编写程序

  1. 创建一个空的双向循环链表

定义一个结构体变量,在堆区用malloc开辟空间,注意进行数据类型转换

头结点的前指针域指向头结点

头结点的后指针域指向头结点

返回头节点

  1. 插入数据

定义一个指针变量1,用malloc在堆区开辟空间,注意要进行数据类型转换

给指针变量的数据域赋值

再定义一个指针变量2指向Head的下一个

指针1的下一个指向指针2

指针2的上一个指向指针1

指针1的上一个指向Head

Head的下一个指向指针1

  1. 遍历链表

定义一个指针变量指向Head

当指针的下一个不为Head时(即进行第一次向后循环遍历)

双向循环链表从Head开始一个个向后偏移

并且打印每一个节点的数据域

当指针的上一个不为Head时(即进行第一次向前循环遍历)

双向循环链表从Head开始一个个向后偏移

并且打印每一个节点的数据域

打印每一个节点的数据域

并且双向循环链表从Head开始一个个向后偏移

  1. 删除数据

首先判断Head的下一个是不是本身(即判断双向循环链表是否为空)

如果是,打印链表为空的提示信息

返回-1

定义指针变量保存要删除的节点的地址(即Head的下一个)

Head的下一个指向要删除的节点的下一个

要删除的节点的下一个的上一个指向Head

定义一个变量保存要删除的变量的指针域

释放定义的指针变量

将释放的指针变量指向空

返回删除的节点的数据域的数据

  1. 源码

为方便对照,贴出源码

doublelist.h

#ifndef _DOUBLELIST_H_
#define _DOUBLELIST_H_

#include <stdio.h>
#include <stdlib.h>

//定义数据类型
typedef int DataType;

//定义结点结构体
typedef struct node{
    DataType data;
    struct node *front; //保存前一个结点的地址
    struct node *next; //保存后一个结点的地址
}doublelist;

//创建一个空的双向循环链表
doublelist *DoublelistCreate();
//插入数据
void DoulelistInsert(doublelist *Head, DataType value);
//遍历链表
void DoublelistPrint(doublelist *Head);

#endif

doublelist.c

#include "doublelist.h"

//创建一个空的双向循环链表
doublelist *DoublelistCreate()
{
    //在堆区开辟空间
    doublelist *Head = (doublelist *)malloc(sizeof(doublelist));

    //让头结点的两个指针保存头结点的地址
    Head->front = Head;
    Head->next = Head;

    return Head;
}

//插入数据
void DoulelistInsert(doublelist *Head, DataType value)
{
    doublelist *temp = (doublelist *)malloc(sizeof(doublelist));
    temp->data = value;

    doublelist *pnew = Head->next;

    temp->next = pnew;
    pnew->front = temp;
    
    temp->front = Head;
    Head->next = temp;
}

//遍历链表
void DoublelistPrint(doublelist *Head)
{
    doublelist *p = Head;
    while(Head->next != p)
    {
        Head = Head->next;
        printf("%d ", Head->data);
    }
    putchar(10);

    while(Head->front != p)
    {
        printf("%d ", Head->data);
        Head = Head->front;
    }
    printf("%d ", Head->data);
    putchar(10);
}

main.c

#include "doublelist.h"

int main(int argc, char const *argv[])
{
    doublelist *h = DoublelistCreate();
    DoulelistInsert(h, 100);
    DoulelistInsert(h, 200);
    DoulelistInsert(h, 300);
    DoulelistInsert(h, 400);
    DoulelistInsert(h, 500);
    DoulelistInsert(h, 600);
    DoublelistPrint(h);
    
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小徐的记事本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值