首页 > 其他分享 >双向循环链表的一些基础操作

双向循环链表的一些基础操作

时间:2024-04-24 09:00:24浏览次数:26  
标签:Head Phead DoubleLList next 链表 循环 双向 New

/**********************************************
*file name: DoubleList.c
*function:设计双向链表
*author:[email protected]
*date:2024/4/23
*note:None
*CopyRight (c) 2023-2024 邮箱 All Right Reseverd
***********************************************/

//指的是单向链表中的结点有效数据类型,用户可以根据需要进行修改
typedef int DataType_t;
//构造链表的节点,节点链表中所有的数据类型都一样
typedef struct LinkedList
{
DataType_t data; //节点的数据域
struct DoubleLinkedList * next;
struct DoubleLinkedList * prev;
}DoubleLList_t;

//创建1个空的双链表
//创建一个空双向链表,头链表里应该有一个头节点,对链表进行初始化
DoubleLList_t * LList_Create(void)
{
//1.创建1个头节点并为头节点申请内存
DoubleLList_t * Head= (DoubleLList_t *)calloc(1,sizeof(DoubleLList_t));
if(NULL == Head)
{
perror("calloc memory for Head is failed");
exit(-1);
}
//2.对头节点进行初始化,头节点是不存储有效内容!!!
Head->next = NULL;
//3.把头节点的地址返回即可
return Head;
}
//创建双向链表的新结点,
DoubleLList_t *DoubleLList_Newnode(DataType_t data)
{
//1.创建1个新的结点并对新结点申请内存
DoubleLList_t * New = (DoubleLList_t *)calloc(1,sizeof(DoubleLList_t));
if(NULL == New)
{
perror("calloc memory for NewNode is failed!");
return NULL;
}
//2.对新节点的数据域和指针域进行初始化
New->data = data;
New->next = NULL;
New->prev = NULL;
return New;
}
//插入新结点
//1判断链表是否为空
if(Head->next == NULL)
Head->next = New;
//头插法
DoubleLList_t * DoubleLList_HeadInsert(DoubleLList_t *Head)
{
New->next= Head->next;
Head->next->prev = New;
Head->next = New;
return New;
}
//尾插
bool DoubleLList_LastInsert(DoubleLList_t *Head)
{//遍历
DoubleLList_t *Phead = Head
while(Phead->next)
{
Phead = Phead->next;
}
Phead->next = New;
New->prev = Phead;
printf("nenode Insert success!");
return true;
}
//指定位置插入
DoubleLList_LastInsert(DoubleLList_t *Head,DataType_t destval,DataType_t data )
{
//判断是否为空
if(Head->next == NULL)
Head->next = New;
//非空
DoubleLList_t *Phead = Head;
while(Phead->next)
{
Phead = Phead->next;
if(Phead->data == destval)
{
break;
}
}
New->next = Phead->next;
Phead->next->prve = New;
New->prev = Phead->next;
Phead->next =New;
printf("newnode Insert success!");
return true;
}

//双向链表的删除
bool DoubleLList_LastInsert(DoubleLList_t *Head)
{
//头删
//1先判断是否为空链表
if(Head->next == NULL)
printf("当前链表为空");
return false;
//2非空则进行链接
Head->next = Head->next->next;
Head->next->prve = NULL;
Head->next->next = NULL;
free(Head->next)
}
//尾删
bool DoubleLList_LastInsert(DoubleLList_t *Head)
{
DoubleLList_t *Phead = Head;
//1判断是否为空
if(Head->next == NULL)
Head->next = New;
//2遍历链表找到链表的尾节点
while(Phead->next)
{
Phead = Phead->next;
if(Phead->next == Head->next)
{
break;
}
}
//3 将尾结点的直接前驱指向NULL
Phead->prve = NULL;
//4 将尾结点的直接后继指向NULL
Phead->next->prve = NULL;
free(Phead);
}
//指定位置删结点
bool DoubleLList_LastInsert(DoubleLList_t *Head,DataType_t destval,DataType_t data)
{
//1先判断是否为空链表
if(Head->next == NULL)
printf("当前链表为空");
return false;
//1 遍历链表,找到待删除结点
while(Phead->next)
{
Phead = Phead->next;
if(Phead->data == destval)
{
break;
}
}
Phead->prve->next = Phead->next;
Phead->next->prve = Phead->prve;
free(Phead);
return true;
}

标签:Head,Phead,DoubleLList,next,链表,循环,双向,New
From: https://www.cnblogs.com/LvYaoNan/p/18154294

相关文章

  • 数据结构笔试题——基于C语言的链表功能函数实现
    题目1题目要求如下:/***@functionname:LList_CntdmFind*@brief查找链表中,倒数第k个位置上的节点*@param:​ @Head:链表头节点​ @k :倒数第k个位置*@retval:int型返回值;返回-1时即为失败,返回0时表示成功;*@date:2024/04/23*@version1.0*@n......
  • 单向与双向循环链表
    单向循环链表/********************************************************************* 函数名称: *函数功能:设计单向循环链表的接口*函数参数:* ​*返回结果:*注意事项:None*函数作者:zcx982795194@[email protected]*创建......
  • C语言单向循环链表的增删操作
    /***********************************************************************************************************设计双向链表的接口****Copyright(c) 2023-2024 [email protected] AllrightReserved****************************************......
  • 单向循环链表和双向链表程序编程
    链表学习记录设计单向循环链表的接口/***********************************************************************************************************设计单向循环链表的接口****Copyright(c)[email protected]*************......
  • 双向链表的接口的接口程序
    双向链表的接口的接口程序/********************************************************************* filename: 双向链表的接口的接口程序* author :[email protected]* date :2024-4-23* function:* note :None** CopyRight(c)20241764757......
  • 链表(考研算法)
    数据结构链表练习题:1.已知,一个带有头结点的单链表,结点结构为:假设该链表只给出了头指针head。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k(k为正整数)个位置上的结点。若查找成功,算法输出该结点的data值,并返回1;否则,只返回0。/**************************......
  • 双向循环链表
    小白感觉双向链表和单向链表的区别并不大,就是地址的交接有点繁琐,需要清晰的逻辑,简单理解就是俩条平行线,无线延伸,但是俩个线不交叉,但都是在一张纸上开始延展,头结点就像这张纸,理解的可能有点抽象,但我感觉这就是个抽象的概念,所以特编写初级的代码如下:/*****************************......
  • 单向循环链表的初体验
    单向循环链表经过小白今天一天的学习,感觉就是在单向链表的尾结点加了一个首结点的地址,不再指向NULL,个人理解就像一群孩子围成了一个圆,头尾相连,同时多少个孩子就是多少个结点,如击鼓传花一般一个个将手上的手绢传递给下一个人,一遍下来就像是单向循环的遍历,想要到谁的手上,就像是指定......
  • 单向循环链表
    //头插boolCircLList_HeadInsert(CircLList_t*Head,DataType_tdata){ //创建一个新节点 CircLList_t*New=CircLList_NewNode(data); //对单向循环链表的头结点的地址进行备份 CircLList_t*Phead=Head; //判断当前链表是否为空,就直接插入 if(Head->next==He......
  • 单向循环链表的接口程序
    自定义单向循环链表的增删改查接口函数/********************************************************************文件名称: 01单向循环链表的接口程序文件作者:[email protected]创建日期:2024/04/23文件功能:对单向循环链表的增删改查功能的定义注意事项:......