c 语言链表的简单使用

一、链表介绍

在 C 语言中,链表是一种常用的数据结构,用于动态地存储数据。链表中的每个元素称为节点,每个节点包含数据部分和指向下一个节点的指针。

1.1 链表的基本概念

定义:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
组成部分:链表由一系列节点(链表中每一个元素称为节点)组成,节点可以在运行时动态生成。每个节点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域。

1.2 链表的类型

单向链表:每个节点只有一个指向下一个节点的指针。
双向链表:每个节点有两个指针,一个指向下一个节点,一个指向上一个节点。
循环链表:链表的尾节点指向链表的头节点,形成一个环。

1.3 链表的基本操作

节点创建:为链表分配新的节点,并初始化节点的数据和指针。
节点插入:将新节点插入到链表的指定位置,包括在头部插入、在尾部插入和在中间插入。
节点删除:从链表中删除指定节点,需要调整相关节点的指针。
查找节点:在链表中查找具有指定值的节点,需要遍历链表。
链表遍历:从头节点开始,逐个访问链表中的每个节点,直到到达链表末尾。
链表长度计算:遍历链表,同时维护一个计数器来记录访问的节点数。
链表反转:通过改变节点之间的指针方向来实现链表的反转。
链表排序:使用排序算法(如归并排序、插入排序等)对链表进行排序。
链表合并:将两个或多个链表合并成一个链表。
链表清空:删除链表中的所有节点,并释放它们所占用的内存。

1.4链表的优缺点

优点:链表克服了数组需要预先知道数据大小的缺点,可以充分利用计算机内存空间,实现灵活的内存动态管理。链表允许插入和移除表上任意位置上的节点,但不允许随机存取。
缺点:链表失去了数组随机读取的优点,同时链表由于增加了节点的指针域,空间开销比较大。

二、单链表的实现

链表的基本实现,包括创建节点、添加节点、打印链表和释放链表内存

2.1 定义节点结构

定义一个节点结构,每个节点包含一个整数数据和一个指向下一个节点的指针。

#include <stdio.h>  
#include <stdlib.h>  // 定义节点结构  
struct Node{  int data;  struct Node* next;  
};

2.2 创建新节点

定义一个函数来创建新节点

// 创建新节点  
struct Node* createNode(int data){  struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));  if (!newNode){  printf("内存分配失败\n");  exit(1);  }  newNode->data = data;  newNode->next = NULL;  return newNode;  
}

2.3 添加节点到链表

定义一个函数来在链表的头部或尾部添加新节点。比如在头部添加节点。

// 在链表头部添加节点  
void appendNodeAtHead(struct Node** head, int data) 
{  struct Node* newNode = createNode(data);  newNode->next = *head;  *head = newNode;  
}

2.4 打印链表

定义一个函数来打印链表中的所有节点

// 打印链表  
void printList(struct Node* head) 
{  struct Node* temp = head;  while (temp != NULL) {  printf("%d -> ", temp->data);  temp = temp->next;  }  printf("NULL\n");  
}

2.5 释放链表内存

定义一个函数来释放链表占用的内存,防止内存泄漏。

// 释放链表内存  
void freeList(struct Node* head) 
{  struct Node* temp;  while (head != NULL) {  temp = head;  head = head->next;  free(temp);  }  
}

三、测试代码

编写代码,创建一个链表,并在链表的头部依次添加 10、20 和 30 三个节点,然后打印链表内容,最后释放链表占用的内存。
示意图:
在这里插入图片描述

#include <stdio.h>  
#include <stdlib.h>  // 定义节点结构  
struct Node 
{  int data;  struct Node* next;  
};  // 创建新节点  
struct Node* createNode(int data) 
{  struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));  if (!newNode) {  printf("内存分配失败\n");  exit(1);  }  newNode->data = data;  newNode->next = NULL;  return newNode;  
}  // 在链表头部添加节点  
void appendNodeAtHead(struct Node** head, int data) 
{  struct Node* newNode = createNode(data);  newNode->next = *head;  *head = newNode;  
}  // 打印链表  
void printList(struct Node* head) 
{  struct Node* temp = head;  while (temp != NULL) {  printf("%d -> ", temp->data);  temp = temp->next;  }  printf("NULL\n");  
}  // 释放链表内存  
void freeList(struct Node* head) 
{  struct Node* temp;  while (head != NULL) {  temp = head;  head = head->next;  free(temp);  }  
}  int main() 
{  struct Node* head = NULL;  // 添加节点到链表  appendNodeAtHead(&head, 10);  appendNodeAtHead(&head, 20);  appendNodeAtHead(&head, 30);  // 打印链表  printList(head);  // 释放链表内存  freeList(head);  return 0;  
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/4143.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络——路由器构成

算路由表是分布式去算——你算你的&#xff0c;我算我的 输出队列非先来先传 调度发生在哪里 缓存队列一般是应对——来数据方向的速度过快问题

微信小程序uniapp基于Android的流浪动物管理系统 70c3u

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 以往流浪猫狗的救助网站相关信息的管理&#xff0c;都是工作人员手工统计。这种方式不但时效性低&#xff0c;而且需要查…

【Pikachu靶场:XSS系列】xss之过滤,xss之htmlspecialchars,xss之herf输出,xss之js输出通关啦

一、xss之过滤 <svg onloadalert("过关啦")> 二、xss之htmlspecialchars javascript:alert(123) 原理&#xff1a;输入测试文本为herf的属性值和内容值&#xff0c;所以转换思路直接变为js代码OK了 三、xss之href输出 JavaScript:alert(假客套) 原理&#x…

【$15000】 通过监控调试模式实现RCE

你有没有遇到过一个你直觉上知道存在漏洞的端点&#xff0c;但你却无法完全理解后端发生了什么或如何利用它&#xff1f;在这篇文章中&#xff0c;我将引导你了解一种技术&#xff0c;它将我的黑盒测试转变为半白盒测试。这种方法导致了多个漏洞的发现&#xff0c;并最终实现了…

npm镜像的常用操作

查看当前配置的 npm 镜像 npm config get registry切换官方镜像 npm config set registry https://registry.npmjs.org/切换淘宝镜像(推荐) npm config set registry https://registry.npmmirror.com/切换腾讯云镜像 npm config set registry http://mirrors.cloud.tencent…

Fake Location解除屏蔽分析

前言:对于Fake Location的appconfigs.xml文件屏蔽分析 <?xml version1.0 encodingutf-8 standaloneyes ?> <map><string name"config">{&quot;disabledApps&quot;:[&quot;com.srit.swork.views&quot;,&quot;com.sqjz&q…

3D系统开发工具HOOPS SDK如何实现PLM应用的创新与优化?

无论是支持汽车、航空航天、医疗设备还是建筑&#xff0c;产品生命周期管理(PLM)解决方案实际上都是将制造生产系统结合在一起的粘合剂&#xff0c;从头到尾提供数字线程并为最终用户优化流程。 Tech Soft 3D在行业内近30年&#xff0c;我们对领先的应用程序所基于的组件技术&…

数据结构和算法之树形结构B+树(7)

前一章节我们介绍了B树&#xff0c;了解了B树是适用于大规模数据存储和磁盘访问‌的树结构&#xff0c;而今天要讲的B是B树的一种改进&#xff0c;是B树的一种优化和改进&#xff0c;被大多数据库系统采纳作为索引结构使用。 一、基本概念 B树是B树的改进&#xff0c;因…

用 Python 爬取淘宝商品价格信息时需要注意什么?

用 Python 爬取淘宝商品价格信息时&#xff0c;需要注意以下方面&#xff1a; 一、法律和道德规范&#xff1a; 遵守法律法规&#xff1a;网络爬虫的行为应在法律允许的范围内进行。未经淘宝平台授权&#xff0c;大规模地爬取其商品价格信息并用于商业盈利等不当用途是违法的…

基于Python的自然语言处理系列(50):Soft Prompt 实现

在本篇文章中,我们将实现一个简单的 Soft Prompt 技术,该技术允许我们仅微调新增的嵌入权重,而保持预训练模型不变。Soft Prompt 的主要优势在于它的参数高效性,使得模型在特定任务上快速适应,而无需重新训练模型的所有权重。 1. Soft Prompt 概述 Soft Prompt 技术来源于…

stack和queue --->容器适配器

不支持迭代器&#xff0c;迭代器无法满足他们的性质 边出边判断 实现 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<stack> #include<queue> using namespace std; int main() {stack<int> st;st.push(1);st.push(2);st.push(3);…

UE5 材质篇 1 如何偏移顶点

顶点偏移 start content里的plane长这样 我们进行一点顶点偏移就能长这样 XY加起来乘个缩放系数扔给sin结果乘个缩放系数即可

MySQL45讲 第十六讲 “order by”是怎么工作的?

文章目录 MySQL45讲 第十六讲 “order by”是怎么工作的&#xff1f;一、引言二、全字段排序&#xff08;一&#xff09;索引创建与执行情况分析&#xff08;二&#xff09;执行流程&#xff08;三&#xff09;查看是否使用临时文件 三、rowid 排序&#xff08;一&#xff09;参…

Ansys HFSS:外壳的屏蔽效果演示

欢迎回来&#xff01;随着电子系统变得越来越复杂和集成&#xff0c;确保适当的屏蔽以减轻电磁干扰 &#xff08;EMI&#xff09; 变得越来越重要。 继续讨论屏蔽效果&#xff0c;我们现在将重点转移到另一个强大的工具上&#xff1a;Ansys HFSS&#xff08;高频结构仿真器&am…

无人机避障——(局部规划方法)DWA(动态窗口法)

传统的DWA算法更加倾向于车辆等差速无人车&#xff0c;旋翼无人机是全速的&#xff0c;全向的。 全局路径是通过A*算法生成的 局部路径规划效果&#xff1a; DWA算法效果&#xff1a; 过程图&#xff1a; 完整过程&#xff1a; PID算法效果&#xff1a; 过程图&#xff1a…

数据库->视图

目录 一、视图 1.什么是视图 ​编辑 2.创建视图 1.语法 3.使用视图 4.视图的功能 1.屏蔽相关字段 2.对外提供统一访问规范 3.视图和真实表进行表连接查询 5.修改数据 6.注意事项 7.删除视图 1.语法 8.视图的优点 1. 简单性 2. 安全性 3. 逻辑数据独⽴性 4. 重…

el-scrollbar 动态更新内容 鼠标滚轮无效

有以下功能逻辑&#xff0c;实现了一个时间轴组件&#xff0c;点击、-号后像地图那样放大组件以显示不同的UI。 默认显示年月&#xff1a; 当点击一下加号时切换为年&#xff1a; 当点击减号时切换为日&#xff1a; 即加号、减号点击就是在年月日显示进行切换。给Scrollvie…

动态ip如何自动更换ip

在探讨如何自动更换动态IP地址时&#xff0c;我们首先需要理解动态IP的基本概念。IP地址&#xff0c;即互联网协议地址&#xff0c;分配给每台连接到互联网的设备的唯一标识符。与传统静态IP地址不同&#xff0c;动态IP地址是由网络服务提供商&#xff08;ISP&#xff09;动态分…

关于金属氢化物(储氢)PCT曲线拟合、ZBS有效导热系数模型、JMAK类型吸放氢动力学方程的笔记

参考文献&#xff1a;Experimental and numerical study of metal hydride beds with Ti0.92Zr0.10Cr1.0Mn0.6Fe0.4 alloy for hydrogen compressionhttps://www.sciencedirect.com/science/article/pii/S1385894723043851?via%3Dihub#s0010 一、PCT曲线拟合 根据以下文献内容…