双链表-纯C语言(代码以及详细解释)下

简介: 双链表-纯C语言(代码以及详细解释)

6、尾删数据


       代码:


void DListPopBack(DListNode* head)  //尾删数据
{
  assert(head);    //首先要判定一下传入的head 是不是空指针
  if (head->next == head)  // 判断是不是空链表
  {
  printf("DEL error :Empty linked lists cannot be deleted");//如果是空链表则不能删除
  return;
  }
  DListNode* Headprove = head->prove;  //尾删数据
  DListNode* proveProve = Headprove->prove;//改变指针的方向
  proveProve->next = head;
  head->prove = proveProve;

代码解释:


  1. 要想删除肯定要确保链表里面有东西可以删除,所以先判断一下是不是空链表,如果空链表的话就提示用户不能删除。
  2. 尾删数据的时候,最关键的还是找尾部节点(这个步骤跟上面的尾插一样的)
  3. 找到尾部节点以后进行删除。

7、查找数组(返回查找数据的地址)


代码:


DListNode* DListFind(DListNode* head, DLTDateType x)   //查找链表中的X值,返回该节点的地址
{
  DListNode* cup = head->next;  //利用局部变量来记录链表的表头,方便后面的遍历
  while (cup != head)     //遍历链表
  {
  //cup = cup->next;
  if (cup->data == x)
  {
    return cup;
  }
  cup = cup->next;   //局部变量自增
  }
  printf("Not found\n");
  return NULL;
}

8、在链表X数据之后插入y


代码:


void DListInsertAfter(DListNode* head, DLTDateType x, DLTDateType y)   //X位置之后插入y
{
  DListNode* pos = DListFind(head, x);
  DListNode* newnode = BuyDListNode(x);
  newnode->data = y;
  DListNode* next = pos->next;
  next->prove = newnode;
  newnode->next = next;
  newnode->prove = pos;
  pos->next = newnode;
}

9、在链表X数据之前插入y


代码:


void DListInsertBefor(DListNode* head, DLTDateType x, DLTDateType y)   //X位置之前插入y
{
  DListNode* pos = DListFind(head, x);
  DListNode* newnode = BuyDListNode(x);
  newnode->data = y;
  DListNode* prove = pos->prove;
  prove->next = newnode;
  newnode->prove = prove;
  newnode->next = pos;
  pos->prove = newnode;
}

10、把链表中的X值修改为y


代码;


DListChange(DListNode* head, DLTDateType x, DLTDateType y)   修改在X位置的值
{
  DListNode* pos = DListFind(head, x);
  assert(pos);
  pos->data = y;  
}

11、把链表中X值所在的结点删除


void DListErase(DListNode* head, DLTDateType x)  // 链表删除pos位置的值
{
  DListNode* pos = DListFind(head, x);
  assert(pos);
  DListNode* prove = pos->prove;
  DListNode* next = pos->next;
  prove->next = next;
  next->prove = prove;
}


12、把链表中X值之前的一个结点删除


void DListEraseBefore(DListNode* head, DLTDateType x)  // 链表删除pos位置之前的值
{
  DListNode* pos = DListFind(head, x);
  assert(pos);
  DListErase(head, pos->prove->data);
}

13、把链表中X值之后的一个结点删除


void DListEraseAfter(DListNode* head, DLTDateType x)  // 链表删除pos位置之后的值
{
  DListNode* pos = DListFind(head, x);
  assert(pos);
  DListErase(head, pos->next->data);
}

14、链表的销毁

void DListDestroy(DListNode* head)  // 链表的销毁
{
  DListNode* cup = head->next;
  while (cup != head)
  {
  DListNode* pos = cup;
  cup = cup->next;
  free(pos);
  pos = NULL;
  }
}

目录
相关文章
|
1月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
55 4
|
25天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
1月前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
26天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
58 1
|
1月前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
95 4
|
2月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
2月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
2月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
2月前
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
36 0
|
2月前
|
测试技术 C语言
单链表之无头链表(C语言版)
本文详细介绍了使用C语言实现无头单链表的方法,包括节点和链表结构的定义、链表的创建与销毁、节点的插入与删除,以及链表的打印等功能。文章通过具体的代码示例,展示了如何在无头链表中进行头插法、尾插法、自定义位置插入和删除,以及如何清空和销毁链表。
49 0
单链表之无头链表(C语言版)