双向链表
1.创建并初始化链表
/*****************************************************************************
* 函数名称: DoubleLList_Create
* 函数功能: 创建空链表并完成初始化
* 函数参数: NONE
* 返回结果: 指向头节点的指针
* 注意事项: NONE
* 函数作者: c7355608bs@136.com
* 创建日期: 2024.4.27
* 修改历史: 2024/4
* 函数版本: 1.0
*
*****************************************************************************/
//创建一个空双向链表,空链表应该有一个头结点,对链表进行初始化
DoubleLList_t * DoubleLList_Create(void)
{
//1.创建一个头结点并对头结点申请内存
DoubleLList_t *Head = (DoubleLList_t *)calloc(1,sizeof(DoubleLList_t));
if (NULL == Head)
{
perror("Calloc memory for Head is Failed");
exit(-1);
}
//2.对头结点进行初始化,头结点是不存储数据域,指针域指向NULL
Head->prev = NULL;
Head->next = NULL;
//3.把头结点的地址返回即可
return Head;
}
2.创建新元素并初始化
/*****************************************************************************
* 函数名称: DoubleLList_NewNode
* 函数功能: 新建元素
* 函数参数:
* @data 新建元素的值
* 返回结果: 指向新结点的地址
* 注意事项: NONE
* 函数作者: c7355608bs@136.com
* 创建日期: 2024.4.27
* 修改历史: 2024/4
* 函数版本: 1.0
*
*****************************************************************************/
//创建新的结点,并对新结点进行初始化(数据域 + 指针域)
DoubleLList_t * DoubleLList_NewNode(DataType_t data)
{
//1.创建一个新结点并对新结点申请内存
DoubleLList_t *New = (DoubleLList_t *)calloc(1,sizeof(DoubleLList_t));
if (NULL == New)
{
perror("Calloc memory for NewNode is Failed");
return NULL;
}
//2.对新结点的数据域和指针域(2个)进行初始化
New->data = data;
New->prev = NULL;
New->next = NULL;
return New;
}
3.遍历链表
/*****************************************************************************
* 函数名称: ShowDoubList
* 函数功能: 遍历链表
* 函数参数:
* @Head 头节点地址
* 返回结果: 布尔型
* 注意事项: NONE
* 函数作者: c7355608bs@136.com
* 创建日期: 2024.4.27
* 修改历史: 2024/4
* 函数版本: 1.0
*
*****************************************************************************/
//遍历
bool ShowDoubList(DoubleLList_t *Head)
{
DoubleLList_t *Phead = Head;
//判断链表是否为空
if( NULL == Head->next){
printf("该链表为空\n");
return false;
}
//链表不为空
//首结点
while(Phead->next){
//把头的直接后继作为新的头结点
Phead = Phead->next;
//输出头结点的直接后继的数据域
printf("data = %d\n",Phead->data);
}
}
4.头部插入元素
/*****************************************************************************
* 函数名称: HeadAdd
* 函数功能: 头部插入元素
* 函数参数:
@Head 操作元素
@data 输入的元素的值
* 返回结果: 布尔型
* 注意事项: NONE
* 函数作者: c7355608bs@136.com
* 创建日期: 2024.4.27
* 修改历史: 2024/4
* 函数版本: 1.0
*
*****************************************************************************/
//头插
bool HeadAdd(DoubleLList_t *Head,DataType_t data)
{
DoubleLList_t *New = DoubleLList_NewNode( data);
//对New进行错误判断
if (NULL == New)
{
printf("can not insert new node\n");
return false;
}
//判断链表是否为空
if( NULL == Head->next){
Head->next = New;
return true;
}
//如果链表为非空,则把新结点插入到链表的头部
New->next = Head->next;
Head->next->prev = New;
Head->next = New;
return true;
}
5.尾部插入元素
/*****************************************************************************
* 函数名称: EndAdd
* 函数功能: 尾部插入元素
* 函数参数:
* @Head 操作的链表
* @data 插入的数值
* 返回结果: 布尔型
* 注意事项: NONE
* 函数作者: c7355608bs@136.com
* 创建日期: 2024.4.27
* 修改历史: 2024/4
* 函数版本: 1.0
*
*****************************************************************************/
//尾插
bool EndAdd(DoubleLList_t *Head,DataType_t data)
{
DoubleLList_t *New = DoubleLList_NewNode( data);
DoubleLList_t *Phead = Head;
//1.对New进行错误判断
if (NULL == New)
{
printf("can not insert new node\n");
return false;
}
//2.判断链表是否为空
if( NULL == Head->next){
Head->next = New;
return true;
}
//3.如果链表为非空,则把新结点插入到链表的尾部
//遍历链表
while(Phead->next){
//把头的直接后继作为新的头结点
Phead = Phead->next;
}
//插入
Phead->next = New;
New->prev = Phead;
return true;
}
6.中间插入
/*****************************************************************************
* 函数名称: InstallAdd
* 函数功能: 向链表的某个元素后面插入一个元素
* 函数参数:
* @Head 操作的链表
* @dets 插入在哪一个元素的后面
* @data
* 返回结果: 布尔型
* 注意事项: NONE
* 函数作者: c7355608bs@136.com
* 创建日期: 2024.4.27
* 修改历史: 2024/4
* 函数版本: 1.0
*
*****************************************************************************/
//中间插入
bool InstallAdd(DoubleLList_t *Head,DataType_t dets,DataType_t data)
{
DoubleLList_t *New = DoubleLList_NewNode( data);
DoubleLList_t *Phead = Head;
//1.对New进行错误判断
if (NULL == New)
{
printf("can not insert new node\n");
return false;
}
//2.判断链表是否为空
if( NULL == Head->next){
Head->next = New;
return true;
}
//3.遍历链表
while(Phead->next){
//把头的直接后继作为新的头结点
Phead = Phead->next;
if(Phead->data == dets && Phead->next != NULL){
New->next = Phead->next;
Phead->next->prev = New;
New->prev = Phead;
Phead->next = New;
return true;
}
}
//刚好到最后一个
if(Phead->data == dets){
Phead->next = New;
New->prev = Phead;
return true;
}
else{
printf("链表插入失败\n");
return false;
}
}
7.尾部删除
/*****************************************************************************
* 函数名称: EndDel
* 函数功能: 在函数的尾部删除元素
* 函数参数:
* @Head 操作的链表
* 返回结果: 布尔型
* 注意事项: NONE
* 函数作者: c7355608bs@136.com
* 创建日期: 2024.4.27
* 修改历史: 2024/4
* 函数版本: 1.0
*
*****************************************************************************/
//尾删
bool EndDel(DoubleLList_t *Head)
{
DoubleLList_t *Pend = Head->next; //用来记录尾结点的地址
//1.判断链表是否为空
if( NULL == Head->next){
printf("链表为空,删除失败\n");
return false;
}
//2.遍历链表
while(Pend->next){
Pend = Pend->next;
}
//3.删除
Pend->prev->next = NULL;
Pend->prev = NULL;
free(Pend);
return true;
}
8.中间删除
/*****************************************************************************
* 函数名称: InstallDel
* 函数功能: 删除链表中某一个元素
* 函数参数:
* @Head 操作的链表
* @data 删除的元素的值
* 返回结果:
* 注意事项:
* 函数作者: c7355608bs@136.com
* 创建日期: 2024.4.27
* 修改历史: 2024/4
* 函数版本: 1.0
*
*****************************************************************************/
bool InstallDel(DoubleLList_t *Head,DataType_t data)
{
DoubleLList_t *Phead = Head->next; //用来记录尾结点的地址
//1.判断链表是否为空
if( NULL == Head->next){
printf("链表为空,删除失败\n");
return false;
}
//2.刚好是第一个元素
if(Phead->data == data){
Head->next = Phead->next;
Phead->next->prev = NULL;
Phead->next = NULL;
free(Phead);
return true;
}
//2.遍历链表
while(Phead->next){
//把头的直接后继作为新的头结点
Phead = Phead->next;
if(Phead->data == data && Phead->next != NULL){
Phead->prev->next = Phead->next;
Phead->next->prev = Phead->prev;
Phead->next = NULL;
Phead->prev = NULL;
return true;
}
}
//3.刚好是最后一个
if(Phead->data == data){
Phead->prev->next = NULL;
Phead->prev = NULL;
free(Phead);
return true;
}
else
{
printf("链表中没有该元素,删除失败\n");
return false;
}
}
标签:Head,DoubleLList,next,链表,Phead,New,Doublelist
From: https://www.cnblogs.com/waibibabu-/p/18162066