数据结构界的幻神(First)----链表

简介: 数据结构界的幻神(First)----链表

一.链表的概念

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的结构类似于一条链子,因此得名。

 

相比于传统的数组,链表具有以下特点:

1. 动态增长:

链表的节点可以在运行时动态地添加或删除,而不需要像数组那样预先分配固定的内存空间。

2. 高效插入和删除:

在链表中插入或删除节点只需要修改相邻节点的指针,不需要像数组那样进行大量的数据移动。

3. 不支持随机访问:

由于链表中的节点是通过指针链接起来的,所以无法像数组那样通过索引直接访问特定位置的元素。

 

根据指针的方向,链表可以分为单向链表、双向链表和循环链表等。其中,单向链表的指针只指向后一个节点,而双向链表的节点同时包含指向前一个和后一个节点的指针。循环链表则将最后一个节点的指针指向第一个节点,形成一个环状结构。

 

链表在很多编程场景中都有广泛应用,比如实现链表数据结构、哈希表、栈和队列等。它的灵活性和高效性使其在处理动态数据和需要频繁插入、删除操作的情况下具有优势。

二.链表中的常见问题

在链表中进行插入和删除操作时,有几个关键问题需要注意

1. 指针的正确更新:在插入和删除节点时,需要确保相关节点的指针正确地更新,以维护链表的完整性。特别是在双向链表中,需要同时更新前向和后向指针。

2. 空指针的处理:如果要删除链表中的最后一个节点,需要特别注意处理空指针,以避免后续操作出现错误。

3. 检查边界条件:在进行插入和删除操作之前,需要检查相关的边界条件,例如链表是否为空、要插入或删除的位置是否合法等。

4. 内存管理:在动态分配和释放节点内存时,需要注意内存泄漏和内存重复释放等问题,确保正确地管理内存资源。

5. 考虑特殊情况:例如,在插入节点时,如果要插入的位置是链表的头部,可能需要特殊处理。

6. 代码的可读性和可维护性:编写清晰、简洁的代码,并添加必要的注释,以提高代码的可读性和可维护性。

三.链表的优势

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的结构类似于一条链子,因此得名。

 

相比于传统的数组,链表具有以下特点:

 

1. 动态增长:链表的节点可以在运行时动态地添加或删除,而不需要像数组那样预先分配固定的内存空间。

2. 高效插入和删除:在链表中插入或删除节点只需要修改相邻节点的指针,不需要像数组那样进行大量的数据移动。

3. 不支持随机访问:由于链表中的节点是通过指针链接起来的,所以无法像数组那样通过索引直接访问特定位置的元素。

 

根据指针的方向,链表可以分为单向链表、双向链表和循环链表等。其中,单向链表的指针只指向后一个节点,而双向链表的节点同时包含指向前一个和后一个节点的指针。循环链表则将最后一个节点的指针指向第一个节点,形成一个环状结构。

 

链表在很多编程场景中都有广泛应用,比如实现链表数据结构、哈希表、栈和队列等。它的灵活性和高效性使其在处理动态数据和需要频繁插入、删除操作的情况下具有优势。

四.手撕链表

typedef struct ListNode
{
  Stu student;
  struct ListNode* next;
}ListNode;
//创建头节点
ListNode* createHead()
{
  ListNode* Head = (ListNode*)malloc(sizeof(ListNode));
  if (Head == NULL)
    return NULL;
  Head->next = NULL;
  return Head;
}
//创建节点
ListNode* createNode(Stu student)
{
  ListNode* pcur = (ListNode*)malloc(sizeof(ListNode));
  if (pcur == NULL)
    return NULL;
  pcur->student = student;
  pcur->next = NULL;
  return pcur;
}
//插入节点
void insertNode(ListNode* head, Stu student)
{
  ListNode* pcur = createNode(student);
  pcur->next = head->next;
  head->next = pcur;
}
//删除节点
void deleteNode(ListNode* head, char* num, FILE* pf)
{
  ListNode* prev = head;
  ListNode* pcur = head->next;
  while (pcur && strcmp(pcur->student.num, num))
  {
    if (!strcmp(pcur->student.num, num))
    {
      prev->next = pcur->next;
      free(pcur);
      return;
    }
    prev = prev->next;
    pcur = pcur->next;
  }
  if (!pcur)
  {
    printf("数据不存在,删除失败\n");
  }
  else
  {
    prev->next = pcur->next;
    free(pcur);
  }
}
//打印链表
void printList(ListNode* head)
{
  ListNode* pcur = head->next;
  printf("编号\t姓名\t成绩\n");
  while (pcur)
  {
    printf("%s\t%s\t%d\n", pcur->student.num, pcur->student.name, pcur->student.grade);
    pcur = pcur->next;
  }
}
//查找节点
void seekNode(ListNode* head, char* num)
{
  ListNode* pcur = head->next;
  while (pcur && strcmp(pcur->student.num, num))
  {
    pcur = pcur->next;
  }
  if (pcur == NULL)
    printf("数据不存在\n");
  else
  {
    printf("编号姓名成绩\n");
    printf("%s\t%s\t%d\n", pcur->student.num, pcur->student.name, pcur->student.grade);
  }
}
//修改节点
void modifyNode(ListNode* head, char* num, Stu student)
{
  ListNode* pcur = head->next;
  while (pcur && strcmp(pcur->student.num, num))
  {
    pcur = pcur->next;
  }
  if (pcur == NULL)
    printf("要修改的数据不存在\n");
  else
  {
    pcur->student = student;
  }
}
相关文章
|
1月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
55 4
|
24天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
45 5
|
1月前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
86 4
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
48 0
|
2月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
29 7
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
28 3
|
2月前
|
算法 Java
数据结构与算法学习五:双链表的增、删、改、查
双链表的增、删、改、查操作及其Java实现,并通过实例演示了双向链表的优势和应用。
21 0
数据结构与算法学习五:双链表的增、删、改、查
【数据结构】——双向链表详细理解和实现
【数据结构】——双向链表详细理解和实现