网站建设公司一年多少钱/登封网络推广公司

网站建设公司一年多少钱,登封网络推广公司,青岛互联网企业排名,类似源码之家的网站目录 一、为什么需要链表? 二、链表与数组的对比 三、链表节点定义 四、链表基本操作 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://www.mzph.cn/bicheng/71847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MybatisPlus-扩展功能-枚举处理器

在Mybatis里有一个叫TypeHandler的类型处理器&#xff0c;我们常见的PO当中的这些成员变量的数据类型&#xff0c;它都有对应的处理器&#xff0c;因此它就能自动实现这些Java数据类型与数据库类型的相互转换。 它里面还有一个叫EnumOrdinalTypeHandler的枚举处理器&#xff0…

北京大学第二弹《DeepSeek提示词工程和落地场景》

大家好&#xff0c;我是吾鳴。 之前给大家分享过北京大学出品的DeepSeek教程《DeepSeek与AIGC应用》&#xff0c;今天吾鳴发现北京大学又出第二版教程了&#xff0c;教程的名称叫做《DeepSeek提示词工程和落地场景》&#xff0c;在此分享给大家。文末有完整版PDF下载地址。 教程…

deepseek自动化代码生成

使用流程 效果第一步&#xff1a;注册生成各种大模型的API第二步&#xff1a;注册成功后生成API第三步&#xff1a;下载vscode在vscode中下载agent&#xff0c;这里推荐使用cline 第四步&#xff1a;安装完成后&#xff0c;设置模型信息第一步选择API provider&#xff1a; Ope…

ARM Cortex-M处理器中的MSP和PSP

在ARM Cortex-M系列处理器中&#xff0c;MSP&#xff08;主堆栈指针&#xff09;和PSP&#xff08;进程堆栈指针&#xff09;是两种不同的堆栈指针&#xff0c;主要用于实现堆栈隔离和提升系统可靠性。以下是它们的核心区别和应用场景&#xff1a; 1. 基本定义 MSP&#xff08;…

Python代码片段-Excel导入到MongoDB

有一次遇到一个需求&#xff0c;需要把Excel的数据导入到MongoDB中&#xff0c;表面上感觉就是导入数据很简单&#xff0c;但实际操作后&#xff0c;发现是比较麻烦的一个事情&#xff0c;一般图形化的工具对于MongoDB而言&#xff0c;导入选项都是json的&#xff0c;根本没有E…

axios几种请求类型的格式

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式&#xff0c;包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…

Linux的基础指令和环境部署,项目部署实战(下)

目录 上一篇&#xff1a;Linxu的基础指令和环境部署&#xff0c;项目部署实战&#xff08;上&#xff09;-CSDN博客 1. 搭建Java部署环境 1.1 apt apt常用命令 列出所有的软件包 更新软件包数据库 安装软件包 移除软件包 1.2 JDK 1.2.1. 更新 1.2.2. 安装openjdk&am…

flink operator v1.10对接华为云对象存储OBS

1 概述 flink operator及其flink集群&#xff0c;默认不直接支持华为云OBS&#xff0c;需要在这些java程序的插件目录放一个jar包&#xff0c;以及修改flink配置后&#xff0c;才能支持集成华为云OBS。 相关链接参考&#xff1a; https://support.huaweicloud.com/bestpracti…

免费PDF工具

Smallpdf.com - A Free Solution to all your PDF Problems Smallpdf - the platform that makes it super easy to convert and edit all your PDF files. Solving all your PDF problems in one place - and yes, free. https://smallpdf.com/#rappSmallpdf.com-解决您所有PD…

去中心化技术P2P框架

中心化网络与去中心化网络 1. 中心化网络 在传统的中心化网络中&#xff0c;所有客户端都通过一个中心服务器进行通信。这种网络拓扑结构通常是一个星型结构&#xff0c;其中服务器作为中心节点&#xff0c;每个客户端只能与服务器通信。如果客户端之间需要通信&#xff0c;必须…

【图像处理 --- Sobel 边缘检测的详解】

Sobel 边缘检测的详解 目录 Sobel 边缘检测的详解1. 梯度计算2. 梯度大小3. 梯度方向4. 非极大值抑制5. 双阈值处理6. 在 MATLAB 中实现 Sobel 边缘检测7.运行结果展示8.关键参数解释9.实验与验证 Sobel 边缘检测是一种经典的图像处理算法&#xff0c;用于检测图像中的边缘。它…

基因组组装中的术语1——from HGP

Initial sequencing and analysis of the human genome | Nature 1&#xff0c;分层鸟枪法测序hierarchical shotgun sequencing

安全开发-环境选择

文章目录 个人心得虚拟机选择ubuntu 22.04python环境选择conda下载使用&#xff1a; 个人心得 在做开发时配置一个专门的环境可以使我们在开发中的效率显著提升&#xff0c;可以避免掉很多环境冲突的报错。尤其是python各种版本冲突&#xff0c;还有做渗透工具不要选择windows…

数字体验驱动用户参与增效路径

内容概要 在数字化转型深化的当下&#xff0c;数字内容体验已成为企业与用户建立深度连接的核心切入点。通过个性化推荐引擎与智能数据分析系统的协同运作&#xff0c;企业能够实时捕捉用户行为轨迹&#xff0c;构建精准的用户行为深度洞察模型。这一模型不仅支撑内容分发的动…

Java Web开发实战与项目——Spring Boot与Spring Cloud微服务项目实战

企业级应用中&#xff0c;微服务架构已经成为一种常见的开发模式。Spring Boot与Spring Cloud提供了丰富的工具和组件&#xff0c;帮助开发者快速构建、管理和扩展微服务应用。本文将通过一个实际的微服务项目&#xff0c;展示如何使用Spring Boot与Spring Cloud构建微服务架构…

VMware建立linux虚拟机

本文适用于初学者&#xff0c;帮助初学者学习如何创建虚拟机&#xff0c;了解在创建过程中各个选项的含义。 环境如下&#xff1a; CentOS版本&#xff1a; CentOS 7.9&#xff08;2009&#xff09; 软件&#xff1a; VMware Workstation 17 Pro 17.5.0 build-22583795 1.配…

Linux8-互斥锁、信号量

一、前情回顾 void perror(const char *s);功能&#xff1a;参数&#xff1a; 二、资源竞争 1.多线程访问临界资源时存在资源竞争&#xff08;存在资源竞争、造成数据错乱&#xff09; 临界资源&#xff1a;多个线程可以同时操作的资源空间&#xff08;全局变量、共享内存&a…

LD_PRELOAD 绕过 disable_function 学习

借助这位师傅的文章来学习通过LD_PRELOAD来绕过disable_function的原理 【PHP绕过】LD_PRELOAD bypass disable_functions_phpid绕过-CSDN博客 感谢这位师傅的贡献 介绍 静态链接&#xff1a; &#xff08;1&#xff09;举个情景来帮助理解&#xff1a; 假设你要搬家&#x…

【无人集群系列---无人机集群编队算法】

【无人集群系列---无人机集群编队算法】 一、核心目标二、主流编队控制方法1. 领航-跟随法&#xff08;Leader-Follower&#xff09;2. 虚拟结构法&#xff08;Virtual Structure&#xff09;3. 行为法&#xff08;Behavior-Based&#xff09;4. 人工势场法&#xff08;Artific…

【Erdas实验教程】009:非监督分类及分类后评价

文章目录 一、分类过程二、分类评价ERDAS 的 ISODATA 算法是基于最小光谱距离来进行的非监督分类,聚类过程始于任意聚类平均值或一个已有分类模板的平均值;聚类每重复一次,聚类的平均值就更新一次,新聚类的均值再用于下次聚类循环。这个过程不断重复,直到最大的循环次数已…