学习数据结构的第三天
初识链表
目录
初识链表
1.链表的概念及结构
2.单链表
打印
后插
前插
动态申请节点
前删
后删
查找
1.链表的概念及结构
typedef int SLTDataType;typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;
定义这样一个结构体,就可以完成链表的连接:
从定义和例子中间我们不难总结出:
1、链式结构在逻辑上是连续的,但是在物理上是不连续的,所谓的链,不过是我们构建的理论模型
2、现实中的结点一般都是从堆上申请出来的
3、从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续
2.单链表
链表的种类是很多的,我们先来实现最不复杂的单链表的这几个功能吧
//打印
void SListPrint(SLTNode* phead);
//尾插
void SListPushBack(SLTNode** pphead, SLTDataType x);
//头插
void SListPushFront(SLTNode* pphead, SLTDataType x);
//动态申请一个节点
SLTNode* BuySListNode(SLTDataType x);
//尾删
void SListPopBack(SLTNode** pphead);
//头删
void SListPopFront(SLTNode** pphead);
//查找
void SListFind(SLTNode* phead, SLTDataType x);
//任意位置的插入和删除
void SListInsert(SLTNode** pphead,SLTNode * pos, SLTDataType x);
void SListErase(SLTNode** pphead, SLTNode* pos);
typedef int SLTDataType;typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;
首先我们来个简单的:
打印
我们知道,打印数组是从0下表打印到size下标,那么打印链表呢?我们怎么找到它的各个节点呢?
void SListPrint(SLTNode* phead)
{SLTNode* cur =phead;while (cur != NULL){printf("%d->", cur->data);cur = cur->next;//相当于数组里面的i++}printf("NULL\n");
}
思路:先找到第一个结构体的地址,进而找到首结构体中的next指针,进而找到next指针指向的结构体中的next指针...每次进入一个结构体都将其中的data打印出来,这就是链表的遍历过程的实现
我们再看个难度高的:
后插
我们知道在数组中后插是要考虑扩容和越界的,但是链表和数组不同,他要考虑的是指针所带来的的问题
思路:我们先把要插入的数据x放到一个动态申请的节点里,然后让这个节点的next指向NULL(因为是在最后插入)随后我们找到原链表中的最后一个节点,把这个节点的next指向我们新申请的节点就OK了。
注意:如果这个链表为空,那么首个节点的地址就是个空指针,这个时候我们找不到所谓的最后一个节点,所以这种情况时我们直接把我们申请的节点作为首元素(*phead=STLNode *newnode)
于是,我们有:
void SListPushBack(SLTNode* phead, SLTDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));assert(newnode);newnode->data = x;newnode->next = NULL;if (phead == NULL){phead = newnode;}else{ //找尾结点SLTNode* tail = phead;while (tail != NULL){tail = tail->next;}tail->next = newnode;//让原来的NULL指向newnode}
}
但是很遗憾,上面这串代码是纯小丑代码
学习数据结构的第三天相关推荐
- 学号 20172326 《程序设计与数据结构》第三周学习总结
学号 20172326 <程序设计与数据结构>第三周学习总结 教材学习内容总结 队列是先进先出的数据结构(FIFO)与栈不同,队列的两端可分别进行操作 first与front相同,返回首段 ...
- 20162329张旭升 2017-2018-2 《程序设计与数据结构》第三周学习总结
20162329 2017-2018-1 <程序设计与数据结构>第三周学习总结 教材学习内容总结 1.查找 线性查找: (对任意数组)顺序的对数组内的元素一个一个的进行比较,直到找到所查找 ...
- 20172305 2017-2018-2 《程序设计与数据结构》实验三报告
20172305 2017-2018-2 <程序设计与数据结构>实验三报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 谭鑫 学号:20172305 实验教师:王志 ...
- 数据结构稀疏矩阵的加法十字链表_学习数据结构和算法的框架思维
----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...
- 机器学习理论《统计学习方法》学习笔记:第三章 k近邻法
机器学习理论<统计学习方法>学习笔记:第三章 k近邻法 3 k近邻法 3.1 K近邻算法 3.2 K近邻模型 3.2.1 模型 3.2.2 距离度量 3.2.3 K值的选择 3.2.4 分 ...
- 20172332 2017-2018-2 《程序设计与数据结构》实验三报告
20172332 2017-2018-2 <程序设计与数据结构>实验三报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 于欣月 学号:20172332 实验教师:王 ...
- 20172324 2017-2018-2《程序设计与数据结构》实验三报告
20172324 2017-2018-2<程序设计与数据结构>实验三报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 曾程 学号:20172324 实验教师:王志强 ...
- c# 插入数据到 uniqueidentifier_每天5分钟用C#学习数据结构(16)二叉树 Part 2
[基础知识]| 作者 / Edison Zhou这是恰童鞋骚年的第209篇原创文章 上一篇开始了树与二叉树之旅,本篇会介绍二叉树的基本实现.1二叉树的代码实现 二叉树节点的定义实现 /// /// 二 ...
- 数据结构java 图实验代码_20172329 2018-2019 《Java软件结构与数据结构》实验三报告...
20172329 2018-2019-2 <Java软件结构与数据结构>实验三报告 课程:<Java软件结构与数据结构>html 班级: 1723java 姓名: 王文彬lin ...
最新文章
- .NET中的密码学--对称加密
- Asp.net设计模式笔记之一:理解设计模式
- 小程序获取form_id 与 小程序获取openid
- 僵尸进程孤儿进程与守护进程
- matlab im2double
- BOM之navigator对象和用户代理检测
- anaconda3 安装tensorflow 报Cannot remove entries fro
- 动态规划——最优买卖股票时机含冷冻期(Leetcode 309)
- 认知觉醒是成长的首因,送3本硬核认知提升书
- windows下MongoDB数据库的安装
- 如何在Windows即服务上安装Memcached Server
- python系统开发_证券交易系统设计与开发
- MIT6.S081 2021
- 【计算机网络】Socket聊天室程序
- CIO40: 2020年IT人员如何借机破局
- 做专业领域领航者 佳能正式推出了Professional Print Layout打印软件
- arcgis,裁剪投影不一致的矢量和栅格
- 电力电子元器件行业研究:市场规模持续增长
- 计算几何:正多边形的滚动与旋轮线…
- “数据产品”是怎样的存在?
热门文章
- php抓取新浪微博数据抓取,php利用curl抓取新浪微博内容实例
- Spotmicroai机械狗初上手——组装测试踩坑(二)
- C++ 中名称冲突之 y1
- java输入坐标_用java语言编写输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离....
- Mac文件夹打包成jar
- Scrapy-Redis Windows下多台机互联
- MPC5748G开发笔记-----LED工程建立
- 南昌邀请赛 赛后总结与补题
- 图像处理之鱼眼图片矫正
- 不甘寂寞农家女一年变千万富婆