当前位置: 首页 > wzjs >正文

吴江和城乡建设局网站龙岗召开企业服务大会

吴江和城乡建设局网站,龙岗召开企业服务大会,浙江省建设厅继续教育网站,网站开发技术选型目录 一、为什么需要链表? 二、链表与数组的对比 三、链表节点定义 四、链表基本操作 1. 创建链表 2. 插入节点 头插法(时间复杂度O(1)) 尾插法(时间复杂度O(n)) 3. 删除节点 4. 遍历链表 五、进阶操作 1. 反…

目录

一、为什么需要链表?

二、链表与数组的对比

三、链表节点定义

四、链表基本操作

1. 创建链表

2. 插入节点

头插法(时间复杂度O(1))

尾插法(时间复杂度O(n))

3. 删除节点

4. 遍历链表

五、进阶操作

1. 反转链表(迭代法)

2. 检测环(快慢指针法)

六、内存管理要点

七、常见错误排查

八、链表变体

十、完整示例代码

总结

路过的佬们点点关注哦~

你们的鼓励是我前进的动力~


一、为什么需要链表?

在C语言程序设计中,数组是最基础的数据结构,但它存在明显的局限性:

  • 固定长度,无法动态扩展

  • 插入/删除元素需要大量数据移动

  • 内存空间要求连续

链表(Linked List)通过动态内存分配指针连接完美解决了这些问题。每个元素(节点)包含:

  1. 数据域 - 存储实际数据

  2. 指针域 - 存储下一个节点的地址

二、链表与数组的对比

三、链表节点定义

typedef struct Node {int data;           // 数据域struct Node *next;  // 指针域
} Node;

四、链表基本操作

1. 创建链表

Node* createList(int data) {Node* head = (Node*)malloc(sizeof(Node));if (head == NULL) {printf("内存分配失败!");exit(1);}head->data = data;head->next = NULL;return head;
}

2. 插入节点

头插法(时间复杂度O(1))
void insertAtHead(Node** head, int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = *head;*head = newNode;
}
尾插法(时间复杂度O(n))
void insertAtTail(Node* head, int data) {Node* current = head;while (current->next != NULL) {current = current->next;}Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;current->next = newNode;
}

3. 删除节点

void deleteNode(Node** head, int key) {Node *temp = *head, *prev;// 删除头节点if (temp != NULL && temp->data == key) {*head = temp->next;free(temp);return;}// 查找待删除节点while (temp != NULL && temp->data != key) {prev = temp;temp = temp->next;}if (temp == NULL) return;// 解除链接并释放内存prev->next = temp->next;free(temp);
}

4. 遍历链表

void printList(Node* head) {Node* current = head;while (current != NULL) {printf("%d -> ", current->data);current = current->next;}printf("NULL\n");
}

五、进阶操作

1. 反转链表(迭代法)

void reverseList(Node** head) {Node *prev = NULL;Node *current = *head;Node *next = NULL;while (current != NULL) {next = current->next;  // 保存下一个节点current->next = prev;  // 反转指针prev = current;        // 前移prevcurrent = next;        // 前移current}*head = prev;
}

2. 检测环(快慢指针法)

int hasCycle(Node *head) {Node *slow = head, *fast = head;while (fast != NULL && fast->next != NULL) {slow = slow->next;fast = fast->next->next;if (slow == fast) {return 1;  // 存在环}}return 0;  // 无环
}

六、内存管理要点

必须检查malloc返回值

Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {// 处理内存分配失败
}

及时释放内存

void freeList(Node* head) {Node* temp;while (head != NULL) {temp = head;head = head->next;free(temp);}
}

避免野指针

free(temp);
temp = NULL;  // 释放后立即置空

七、常见错误排查

  1. 段错误(Segmentation Fault)

    • 访问已释放的内存

    • 指针未初始化就使用

  2. 内存泄漏

    • 使用valgrind工具检测

    • 确保每个malloc都有对应的free

  3. 逻辑错误

    • 忘记更新头指针

    • 指针操作顺序错误

八、链表变体

双向链表

typedef struct DNode {int data;struct DNode *prev;struct DNode *next;
} DNode;

循环链表

// 尾节点指向头节点
head->next = head;

带头节点的链表

  • 统一操作逻辑

  • 简化边界条件处理

九、应用场景

  1. 实现栈/队列

  2. 多项式运算

  3. 文件系统目录结构

  4. 图结构的邻接表

  5. 内存管理系统

十、完整示例代码

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node;// [此处插入上述各个函数实现]int main() {Node* list = createList(5);insertAtHead(&list, 2);insertAtTail(list, 8);printf("原始链表: ");printList(list);  // 输出: 2 -> 5 -> 8 -> NULLreverseList(&list);printf("反转后: ");printList(list);  // 输出: 8 -> 5 -> 2 -> NULLdeleteNode(&list, 5);printf("删除后: ");printList(list);  // 输出: 8 -> 2 -> NULLfreeList(list);return 0;
}

总结

链表是C语言中最基础也最重要的数据结构之一,掌握链表需要理解:

  • 指针的操作原理

  • 动态内存管理机制

  • 数据结构与算法的关系

建议通过以下方式巩固学习:

  1. 手写实现所有链表操作

  2. 使用调试工具观察内存变化

  3. 尝试实现双向链表等变体

  4. 解决LeetCode链表相关题目(如206反转链表、141环形链表)

掌握链表将为学习更复杂的数据结构(树、图等)打下坚实基础。

路过的佬们点点关注哦~

你们的鼓励是我前进的动力~


文章转载自:

http://nqvTJVdu.Lmxzw.cn
http://BSMa4KPg.Lmxzw.cn
http://1FA6uhc7.Lmxzw.cn
http://zL6jj1jd.Lmxzw.cn
http://i0Z3rxld.Lmxzw.cn
http://gFckvt49.Lmxzw.cn
http://TQYi9oPC.Lmxzw.cn
http://IkhNsXUz.Lmxzw.cn
http://lATh3hp2.Lmxzw.cn
http://0XVqzbZ5.Lmxzw.cn
http://QQstoJPl.Lmxzw.cn
http://KzU4ufmK.Lmxzw.cn
http://phCt1g3r.Lmxzw.cn
http://uPYav0sv.Lmxzw.cn
http://Eomz9Ffn.Lmxzw.cn
http://zsjqsK8y.Lmxzw.cn
http://F8FYfs3o.Lmxzw.cn
http://aqbzV8F3.Lmxzw.cn
http://dj4vWs7G.Lmxzw.cn
http://P42rMT0H.Lmxzw.cn
http://fMofxQys.Lmxzw.cn
http://E4cGSiFJ.Lmxzw.cn
http://QYbcKOT8.Lmxzw.cn
http://71lxsiP6.Lmxzw.cn
http://6YLmqvp0.Lmxzw.cn
http://rINIol3r.Lmxzw.cn
http://de54OeDL.Lmxzw.cn
http://neSPajyU.Lmxzw.cn
http://3jpGS6EN.Lmxzw.cn
http://JeC7AVA3.Lmxzw.cn
http://www.dtcms.com/wzjs/689164.html

相关文章:

  • 商丘网站建设价格小广告推广网站
  • 常州市金坛建设局网站如何做网站域名备案
  • 贵州省城乡建设部网站首页怎么申请商标品牌
  • 桥梁建设 网站网站 展示板
  • 一锅汤资源网站建设大全南京和筑建设有限公司网站
  • 最优的网站建设推广网站怎么才能被百度收录
  • 河北远策网站建设wordpress作者增加分类插件
  • 呼市做网站公司响应式网站 图片处理
  • 网站关键词排名怎么做计算机语言python
  • 展示图片的网站模板2021年经典营销案例
  • 建立网站时间网站模版好建设吗
  • 建设厅工作证查询网站蓝色的网站
  • 河南网站seo费用长沙网站建设 鼎誉
  • 专业网站制作地址企业网站模板是什么
  • 建站公司会有多大的坑邯郸网站设计怎么做
  • 徐州网站无障碍建设网站开发开题报告范文2019
  • 一级做爰片c视频网站火车头导入wordpress
  • 网站建设用的什么语言lumen wordpress 下载
  • 漳州网站设计制作安卓html编辑器
  • 广州市从化区住房和建设据网站做机器人的网站
  • php网站开发需要学什么沈阳市网站建设报价
  • 网站推广渠道特点自建网站如何备案
  • 枞阳县建设局网站怎么做网站播放器
  • ps网站头部seo的网站
  • 网站建设首选九零后网络网店推广的目的
  • 西安建设工程网站免费编程网站
  • 只做衬衫的网站做哪个网站卖一手房比较好
  • 北京火车站建站时间北京承达创建装饰工程有限公司
  • 安卓搭建网站网站建设实训该写哪些内容
  • 展示类网站管理员东莞seo 公司