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

【数据结构与算法】什么是链表?并用代码手动实现一个单向链表

文章目录

  • 一、链表是什么
  • 二、链表的作用
  • 三、链表与数组的区别
  • 四、如何理解链表
  • 五、单链表完整代码

一、链表是什么

  1. 链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,有一系列结点(地址)组成,结点可动态的生成。

  2. 结点包括两个部分:
    (1)存储数据元素的数据域(内存空间)
    (2)存储指向下一个结点地址的指针域。

  3. 相对于线性表顺序结构,操作复杂。

  4. 链表分为 :
    (1)单链表
    (2)双链表
    (3)单向循环链表
    (4)双向循环链表

二、链表的作用

  1. 实现数据元素的存储按一定顺序储存,允许在任意位置插入和删除结点。

  2. 包括单向结点,双向结点,循环接点。

三、链表与数组的区别

说到链表那肯定要聊一下数组,为什么会出现链表呢?

  1. 数组:使用一块连续的内存空间地址去存放数据,但
    例如:
    int a[5]={1,2,3,4,5} 突然我想继续加两个数据进去,但是已经定义好的数组不能往后加,只能通过定义新的数组
    int b[7]={1,2,3,4,5,6,7} 这样就相当不方便比较浪费内存资源,对数据的增删不好操作。

  2. 链表:使用多个不连续的内存空间去存储数据, 可以 节省内存资源(只有需要存储数据时,才去划分新的空间),对数据的增删比较方便。

四、如何理解链表

理论的东西我就不说太多了,下面我将以代码+图形的方式让大家很通俗易懂的理解链表。

  1. 单链表的结构体
struct node 
{
	int data;//存放数据
	struct node  *next; //地址域 (与节点的类型地址相匹配)
	
}

可以把这个结构体理解成这个样子在这里插入图片描述

  1. 创建链表的新节点
struct node *creat_node(int data)
{
	struct node  *new = malloc(sizeof(struct node));
	new->data = data; 
	new->next = NULL;
	
	return  new;
		
}

在这里插入图片描述

  1. 插入节点
struct  node* insert_node(struct  node*p,struct  node*new)
{	
	 p->next = new;		
}
  1. 显示链表
void show(struct node  *p)
{	
	while(1)
	{		
		if(p== NULL)  //假设p已经为NULL则返回 
		{
			return ;
		}				
		printf("p=%d\n",p->data);		
		p  = p->next;  //链表的重要知识点!!! 遍历节点向下走 		
	}	
}

在这里插入图片描述

有了以上三个步骤我们就可以做出一条简单的单链表。

五、单链表完整代码

list.c

#include  <stdio.h>
#include  <stdlib.h>
//设计链表的节点 
struct node 
{
	int data;//存放数据
	struct node  *next; //存放地址  (与节点的类型地址相匹配)
	
};

//创建节点 
struct node *creat_node(int data)
{
	struct node  *new = malloc(sizeof(struct node));
	new->data = data; 
	new->next = NULL;
	return  new;		
}
 
//插入节点 (链接节点)
struct  node* insert_node(struct  node*p,struct  node*new)
{	
	 p->next = new;		
}

//显示节点数据  (遍历节点)
void show(struct node  *p)
{	
	while(1)
	{		
		if(p== NULL)  //假设p已经为NULL则返回 
		{
			return ;
		}				
		printf("p=%d\n",p->data);		
		p  = p->next;  //链表的重要知识点!!! 遍历节点向下走 		
	}	
}
 
 
int main()
{
    //1.分配节点空间
	struct node  *a0 = creat_node(100); 
	struct node  *a1 = creat_node(200); 
	struct node  *a2 = creat_node(300);
	
	inser_node(a0,a1);
	inser_node(a1,a2);
	
	//通过a0  访问a0  a1  a2的数据    //3.访问节点中的数据 
	//printf("a0=%d,a1=%d,a2=%d\n",a0.data,a0.next->data,a0.next->next->data);
	
	show(a0);
}

相关文章:

  • 【Mysql系列】——详细剖析数据库“索引”【上篇】
  • 贯穿设计模式第一话--单一职责原则
  • tf模型在C++部署
  • 【产品经理】常用需求优先级评估模型
  • CCM调试的理论依据
  • libvirt零知识学习4 —— libvirt源码编译安装(2)
  • leetcode每日一题:1005. K 次取反后最大化的数组和
  • this\super\statis\abstract关键字作用
  • Spring Boot 3.0系列【22】应用篇之嵌入式 Servlet 容器
  • 位置编码Positional Encoding
  • 【XXL-JOB】XXL-JOB定时处理视频转码
  • 二、ModBus协议解析
  • AI绘画关键词网站推荐 :轻松获取百万个提示词!完全免费
  • Mybatis中使用in()查询
  • 关于笔记本电脑插上网线没反应的解决方案
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • HTML-表单
  • JavaScript 奇技淫巧
  • JSONP原理
  • Linux链接文件
  • v-if和v-for连用出现的问题
  • Vue 动态创建 component
  • 二维平面内的碰撞检测【一】
  • 服务器之间,相同帐号,实现免密钥登录
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 警报:线上事故之CountDownLatch的威力
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 小程序测试方案初探
  • 一个SAP顾问在美国的这些年
  • nb
  • k8s使用glusterfs实现动态持久化存储
  • ​比特币大跌的 2 个原因
  • # Java NIO(一)FileChannel
  • #162 (Div. 2)
  • (33)STM32——485实验笔记
  • (39)STM32——FLASH闪存
  • (C语言)逆序输出字符串
  • (分布式缓存)Redis哨兵
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)http-server应用
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)Unity3DUnity3D在android下调试
  • (转载)深入super,看Python如何解决钻石继承难题
  • .apk 成为历史!
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET delegate 委托 、 Event 事件
  • .Net IE10 _doPostBack 未定义