【数据结构】(C语言):链表

链表:

  • 基本单位是节点。节点至少两部分:数据,下一个数据的地址。
  • 头指针head,始终指向链表的第一个节点。若没有节点,则head=NULL。
  • 链表在内存中是非连续的。不能使用索引(下标)查找元素。只能从头遍历。
  • 链表有单链表、循环单链表、双链表、循环双链表。本文以单链表举例。

添加节点:(注意指向顺序,避免数据丢失)

  • 在链表头部添加:先新节点指向第一个节点,再头指针指向新节点。
  • 在链表尾部添加:最后一个节点指向新节点。
  • 在链表指定位置添加:找到指定位置,先新节点指向下一个节点,再上一个节点指向新节点。

 删除节点:

  • 删除链表头部节点:头指针指向第二个节点。
  • 删除链表尾部节点:倒数第二个节点指向NULL。
  • 删除链表指定位置节点:找到指定位置,上一个节点指向该节点的下一个节点。


 C语言代码:

创建节点(结构体数据类型),并创建具体节点实例的函数:

// 节点(结构体数据类型)
typedef struct Node
{int data;                 // 数据为整数struct Node *next;        // 指针指向下一个节点
} LinkNode;                   // 别名LinkNode
// 创建具体节点实例的函数
LinkNode * createNode(int data)
{LinkNode *node = (LinkNode *)malloc(sizeof(LinkNode));   // 给节点分配内存空间if(node == NULL){perror("Memory allocation failed");exit(-1);}node->data = data;node->next = NULL;return node;
}

本文将头指针和链表长度作为全局变量:

LinkNode *header = NULL;		// 头指针,初始化指向NULL
int length = 0;				    // 统计链表元素个数

添加节点:

// 添加节点(链表头部添加)
void addtop(int data)
{LinkNode *node = createNode(data);       // 调用createNode函数,创建具体节点node->next = header;                     // 先新节点指向头指针指向的节点header = node;                           // 再头指针指向新节点length++;                                // 每添加一个数据,length+1
}
// 添加节点(链表尾部添加)
void append(int data)
{if(length == 0)        // 若空链表,在链表头部添加{addtop(data);return ;}LinkNode *node = createNode(data);LinkNode *cur = header;         // 从头遍历元素,找到最后while(cur->next != NULL){cur = cur->next;}cur->next = node;length++;
}
// 添加节点(在指定位置,位置从0开始)
void insert(int location, int data)
{if(length == 0)    // 若空链表,在链表头部添加{addtop(data);return ;}if(length <= location)    // 若链表长度<=指定位置,在链表尾部添加{append(data);return ;}LinkNode *node = createNode(data);LinkNode *prev, *cur = header;      // 使用两个指针,遍历链表,找到指定位置while(location > 0){	prev = cur;cur = cur->next;location--;}node->next = cur;prev->next = node;length++;
}

删除节点:

// 删除节点(删除链表头部节点)
void pop(void)
{if(length == 0) return ;   // 空链表,直接退出程序header = header->next;length--;                  // 每删除一个元素,length-1
}
// 删除节点(删除链表尾部节点)
void dellast(void)
{	if(length == 0) return ;       // 空链表,直接退出程序if(length == 1)                // 一个元素,头指针直接指向NULL{header = NULL;return ;}LinkNode *prev, *cur = header;     // 使用两个指针,遍历链表,直到最后的位置while(cur->next != NULL){prev = cur;cur = cur->next;}prev->next = NULL;length--;
}
// 删除节点(删除链表指定位置的节点,位置从0开始)
void delat(int location)
{if(length == 0) return ;          // 空链表,直接退出程序if(length - 1 <= location)        // 链表长度-1<=指定位置,删除链表尾部节点{dellast();return ;}LinkNode *prev, *cur = header;     // 使用两个指针,遍历链表,直到指定位置while(location > 0){prev = cur;cur = cur->next;location--;}prev->next = cur->next;length--;
}
// 删除节点(删除指定数据)
void del(int data)
{LinkNode *prev, *cur = header;      // 使用两个指针,遍历链表,比对数据内容while(cur != NULL){if(cur->data == data){if(header == cur)       // 若是第一个节点,头指针直接跳过该节点指向下一个节点{header = cur->next;}else                    // 否则 该节点上一个节点,直接跳过该节点指向下一个节点{prev->next = cur->next;}length--;return ;}prev = cur;cur = cur->next;}return ;
}

遍历节点:

void travel(void)
{if(length == 0) return ;       // 空链表,直接退出程序printf("linklist elements: ");LinkNode *cur = header;while(cur != NULL){printf("%d \t", cur->data);cur = cur->next;}printf("\n");
}


完整代码:(linklist.c)

#include <stdio.h>
#include <stdlib.h>/* structure */
typedef struct Node			// node structure
{int data;struct Node *next;
} LinkNode;/* global variables */
LinkNode *header = NULL;		// header pointer
int length = 0;				    // the number of linklist elements/* function prototype */
void addtop(int data);			// add element to the top of the linklist
void append(int data);			// add element to the end of the linklist
void insert(int location, int data);	// add element to the specify location (start with 0)
void travel(void);			// show element one by one
void pop(void);				// delete element from the top of the linklist
void dellast(void);			// delete element from the end of the linklist
void delat(int location);		// delete element from the specify location (start with 0)
void del(int data);			// delete the specify data/* main function */
int main(void)
{addtop(5);printf("length is %d \n", length);		travel();append(9);printf("length is %d \n", length);		travel();insert(1,8);printf("length is %d \n", length);		travel();addtop(3);printf("length is %d \n", length);		travel();pop();	printf("length is %d \n", length);		travel();dellast();printf("length is %d \n", length);		travel();delat(1);printf("length is %d \n", length);		travel();del(7);printf("length is %d \n", length);		travel();del(5);printf("length is %d \n", length);		travel();
}/* subfunction */
LinkNode * createNode(int data)		// create a node
{LinkNode *node = (LinkNode *)malloc(sizeof(LinkNode));if(node == NULL){perror("Memory allocation failed");exit(-1);}node->data = data;node->next = NULL;return node;
}void addtop(int data)			// add element to the top of the linklist
{LinkNode *node = createNode(data);node->next = header;header = node;length++;
}void append(int data)			// add element to the end of the linklist
{if(length == 0){addtop(data);return ;}LinkNode *node = createNode(data);LinkNode *cur = header;while(cur->next != NULL){cur = cur->next;}cur->next = node;length++;
}	void insert(int location, int data)	// add element to the specify location (start with 0)
{if(length == 0){addtop(data);return ;}if(length <= location){append(data);return ;}LinkNode *node = createNode(data);LinkNode *prev, *cur = header;while(location > 0){	prev = cur;cur = cur->next;location--;}node->next = cur;prev->next = node;length++;
}void travel(void)			// show element one by one
{if(length == 0) return ;printf("linklist elements: ");LinkNode *cur = header;while(cur != NULL){printf("%d \t", cur->data);cur = cur->next;}printf("\n");
}void pop(void)				// delete element from the top of the linklist
{if(length == 0) return ;header = header->next;length--;
}void dellast(void)			// delete element from the end of the linklist
{	if(length == 0) return ;if(length == 1){header = NULL;return ;}LinkNode *prev, *cur = header;while(cur->next != NULL){prev = cur;cur = cur->next;}prev->next = NULL;length--;
}void delat(int location)		// delete element from the specify location (start with 0)
{if(length == 0) return ;if(length - 1 <= location){dellast();return ;}LinkNode *prev, *cur = header;while(location > 0){prev = cur;cur = cur->next;location--;}prev->next = cur->next;length--;
}void del(int data)			// delete the specify data
{LinkNode *prev, *cur = header;while(cur != NULL){if(cur->data == data){if(header == cur){header = cur->next;}else{prev->next = cur->next;}length--;return ;}prev = cur;cur = cur->next;}return ;
}

编译链接: gcc -o linklist linklist.c

执行可执行文件: ./linklist

 

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

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

相关文章

解决:Xshell通过SSH协议连接Ubuntu服务器报“服务器发送了一个意外的数据包,received:3,expected:20”

下图所示&#xff1a; 日志也基本看不出来问题在哪&#xff0c;只是说断开了连接大概是验证失败。有幸在某论坛评论区找到了原因&#xff0c;是因为我的xshell版本太低了而服务器的ssh版本太高&#xff0c;高版本的ssh默认屏蔽了一部分不太安全的算法导致建立连接的时候验证失败…

C++ 14新特性个人总结

variable templates 变量模板。这个特性允许模板被用于定义变量&#xff0c;就像之前模板可以用于定义函数或类型一样。变量模板为模板编程带来了新的灵活性&#xff0c;特别是在定义泛化的常量和元编程时非常有用。 变量模板的基本语法 变量模板的声明遵循以下基本语法&am…

解决Vue+Vite打包后Leaflet的marker图标不显示的问题

前言 用Leaflet写关于WebGIS的开发&#xff0c;用Vite或者webpack打包&#xff0c;打包后会找不到图标&#xff0c;如下所示。 直言的说&#xff0c;笔者去网上搜了搜&#xff0c;其实收到一个比较好是答案。网址如下。 &#xff08;完美解决~&#xff09;关于VueLeaflet添加…

eslint 与 prettier 的一些常见的配置项(很详细)

目录 1、eslint 常见配置项&#xff08;语法规范&#xff09; 2、 prettier 常见的配置项&#xff08;格式规范&#xff09; 代码规范相关内容看小编的该文章&#xff0c;获取对你有更好的帮助 vsCode代码格式化&#xff08;理解eslint、vetur、prettier&#xff0c;实现格式…

IDEA启动报错:Abnormal build process termination...

一、问题描述 因为项目需要&#xff0c;同时打开了两个idea&#xff0c;突然发现一个启动的时候报错&#xff0c;有点莫名其妙&#xff0c;刚还好好的&#xff0c;为啥就不能用了&#xff0c;一顿百度找方法&#xff0c;试了各种方法&#xff0c;像重新安装jdk、重启系统发现都…

TensorFlow开源项目

欢迎来到 Papicatch的博客 文章目录 &#x1f349;TensorFlow介绍 &#x1f349;主要特点和功能 &#x1f348;多语言支持 &#x1f348;灵活的架构 &#x1f348;分布式训练 &#x1f348;跨平台部署 &#x1f348;强大的工具链 &#x1f348;丰富的社区和生态系统 &a…

Vue3基础使用

目录 一、创建Vue3工程 (一)、cli (二)、vite 二、常用Composition API (一)、setup函数 (二)、ref函数 (三)、reactive函数 (四)、setup注意事项 (五)、计算属性 (六)、watch (七)、watchEffect函数 (八)、生命周期 1、以配置项的形式使用生命周期钩子 2、组合式…

【机器学习-10】 | Scikit-Learn工具包进阶指南:Scikit-Learn工具包之支持向量机模块研究

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

高考填报志愿攻略,5个步骤选专业和院校

在高考完毕出成绩的时候&#xff0c;很多人会陷入迷茫中&#xff0c;好像努力了这么多年&#xff0c;却不知道怎么规划好未来。怎么填报志愿合适&#xff1f;在填报志愿方面有几个内容需要弄清楚&#xff0c;按部就班就能找到方向&#xff0c;一起来了解一下正确的步骤吧。 第…

入局AI手机 苹果公布Apple Intelligence

日前&#xff0c;苹果WWDC 2024如期召开。在这持续1个小时44分钟的开发者大会上&#xff0c;苹果在前一个小时里更新了iOS、iPadOS、MacOS等操作系统&#xff0c;而且还首次更新了visionOS。余下的时间全部留给了苹果的“AI大礼包”——Apple Intelligence&#xff08;苹果智能…

mysql是什么

mysql是什么 是DBMS软件系统&#xff0c;并不是一个数据库&#xff0c;管理数据库 DBMS相当于用户和数据库之间的桥梁&#xff0c;有超过300种不同的dbms系统 mysql是关系型数据库&#xff0c;关系型数据库存储模型很想excel&#xff0c;用行和列组织数据 sql是一门编程语言…

关于ip地址的网页无法访问navigator的gpu、媒体、蓝牙等设备的解决方法

在使用threejs的WebGPURenderer渲染器时&#xff0c;发现localhost以及127.0.0.1才能访问到navigator.gpu&#xff0c;直接使用ip会变成undefined,原因是为了用户的隐私安全&#xff0c;只能在安全的上下文中使用&#xff0c;非安全的上下文就会是undefined&#xff0c;安全上下…

谷歌云(GCP)4门1453元最热门证书限时免费考

谷歌云(GCP)最新活动&#xff0c;完成免费官方课程&#xff0c;送4门最热门考试免费考试券1张(每张价值200刀/1453元)&#xff0c;这4门也包括最近大热的AI/ML考试&#xff0c;非常值得学习和参加&#xff0c;活动7/17截止 谷歌云是全球最火的三大云计算厂商(前两名AWS, Azure…

MySQL索引优化解决方案--索引失效(3)

索引失效情况 最佳左前缀法则&#xff1a;如果索引了多列&#xff0c;要遵循最左前缀法则&#xff0c;指的是查询从索引的最左前列开始并且不跳过索引中的列。不在索引列上做任何计算、函数操作&#xff0c;会导致索引失效而转向全表扫描存储引擎不能使用索引中范围条件右边的…

【Linux】进程信号_1

文章目录 八、进程信号1.信号 未完待续 八、进程信号 1.信号 信号和信号量之间没有任何关系。信号是Linux系统提供的让用户/进程给其他进程发送异步信息的一种方式。 常见信号&#xff1a; 当信号产生时&#xff0c;可选的处理方式有三种&#xff1a;①忽略此信号。②执行该…

小程序注册

【 一 】小程序注册 微信公众平台 https://mp.weixin.qq.com/ https://mp.weixin.qq.com/注册 邮箱激活 小程序账户注册 微信小程序配置 微信小程序开发流程 添加项目成员 【 二 】云服务 lass 基础设施服务&#xff08;组装机&#xff09; 你买了一大堆的电脑配件&#x…

AI早班车2024.6.25

全球AI新闻速递 1.高通&#xff1a;开放 AI 模型&#xff0c;帮助开发者打造骁龙 X Elite 平台智能应用。 2.OpenAI&#xff1a;收购数据库分析公司Rockset。 3.大众海外版车型支持 ChatGPT。 4.乐聚夸父人形机器人&#xff0c;搭载华为云盘古具身智能大模型。 5.微软正努力…

Day45

Day45 jQuery动画 显示和隐藏 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script src"js/jquery-1.8.2.js" type"text/javascript" charset"utf-8"></script&…

云南省森林管理新篇章:可视化大屏引领绿色智慧革命

在云南省这片绿意盎然的土地上&#xff0c;森林不仅是自然的宝藏&#xff0c;更是生态的守护者。 想象一下&#xff0c;站在巨大的屏幕前&#xff0c;云南省的森林分布、生长状况、病虫害情况等信息一目了然&#xff0c;仿佛拥有了一双能够洞察森林奥秘的“智慧眼”。这正是森林…