C++学习(三十五)(C语言部分)之 单链表
单链表 就好比火车
火车头-->链表头部
火车尾-->链表尾部
火车厢-->链表的节点
火车厢连接的部分-->指针
火车中的内容-->链表节点的的数据
链表节点包含数据域和指针域
数据域存放数据
指针域存放要连接的节点的首地址
在造火车的时候 先是火车头 然后是车厢
--->链表的首节点和之后的节点
先从内存中申请头结点的存储空间
--->PLTST phead=(PLTST)malloc(sizeof(LTST));
首节点在创建时会让指针域指向空
--->既链表的初始化
链表连接的规则,要先连接后断开
对于单链表的插入有两种方法
1、头插法
2、尾插法(比较简单的)
尾插法 申请好一个新的节点后将链表的最后一个节点的指针域指向新节点
头插法 首先创建新节点,找到链表头节点,将指针指向新节点,将新节点指针指向第二节点
单链表测试代码笔记如下:
#include<stdio.h>
#include <stdlib.h> //malloc 要用到 typedef struct Node
{
int data; //数据域:用来存放数据
struct Node* pNext; //指针域:用来存储下一个结点地址
}LIST,*PLIST; //1. 创建一个火车头. 相当于创建链表 =用函数来创建一个链表的头部
//创建链表的头部
PLIST CreateListHead()
{
//1.1 申请内存
PLIST phead = (PLIST)malloc(sizeof(LIST));
//1.2 判断是否申请成功
if (NULL == phead)
{
printf("头结点的内存申请失败!\n");
return NULL;
}
phead->pNext = NULL;
//phead->data 可以赋值也可以不赋值,因为头结点不存储数据
//.它只是用来标记链表的头部
//有表头的链表头结点都不存储数据,只是用来标记链表的头部
return phead;
} //2.写一个创建结点的函数,用来申请结点内存
PLIST CreateListNode(int data)
{
PLIST newNode = (PLIST)malloc(sizeof(LIST));
if (NULL == newNode)
{
printf("结点内存申请失败!\n");
return NULL;
}
newNode->pNext = NULL;
newNode->data = data;
return newNode;
} //3.插入一个结点 头部插入 指定位置插入 尾部插入
void InsertListHead(PLIST p_list, int data)//1. 要说明要插入的链表是哪一个 2.要插入的数据
{
//3.1 申请一个结点
PLIST node = CreateListNode(data);
//先连接后断开
node->pNext = p_list->pNext;
p_list->pNext = node;
} //4. 尾插法
void InsertListTail(PLIST p_list, int data)
{
//4.1 申请结点内存
PLIST node = CreateListNode(data);
//我们只知道链表的头部 尾部就要去遍历得到
PLIST p_Temp = p_list;
//遍历找到尾结点
while (p_Temp->pNext!=NULL) // 表达式非0就是真
{
p_Temp = p_Temp->pNext;
}
//循环结束 就是找到了最后一个结点
node->pNext = NULL;
p_Temp->pNext = node;
} //在链表p_list中的pos位置插入data
void InsertListAppoint(PLIST p_list, int pos, int data)
{
PLIST node = CreateListNode(data);
PLIST p_Temp1 = p_list;
PLIST p_Temp2 = p_list;
for (int i = ; i < pos; i++)
{
if (p_Temp1->pNext != NULL)
{
p_Temp1 = p_Temp1->pNext;
if (i>)
p_Temp2 = p_Temp2->pNext;
}
else
{ //如果pos大于链表结点的个数,就插入到尾部
p_Temp1->pNext = node;
node->pNext = NULL;
return; //退出函数 不往下执行
}
}
//循环结束 --> 说明我找到了我要插入的位置
node->pNext = p_Temp1;
p_Temp2->pNext = node; } // 遍历链表的每一个结点
void PrintList(PLIST p_list)
{
PLIST p_Temp = p_list->pNext; //从头部的下一个结点开始输出里面的数据
while (p_Temp)
{
printf("%d -> ", p_Temp->data);//打印结点里面的数据
p_Temp = p_Temp->pNext;
}
printf("NULL\n");
}
//删除 删除头结点 指定位置删除 尾部删除
//知道这个逻辑 多画图 多写代码
//后面还会有双向循环链表 要处理四个指针 现在只需要处理两个 双向循环链表不画图很难理解
//画图之后会发现很简单 只需要照着画的图去链接各个指针就OK了
void DeleteListHead(PLIST p_list) //PLIST p_list=head.
{
PLIST p_Temp = p_list->pNext;
//先链接还是先释放
p_list->pNext = p_Temp->pNext; //连接
free(p_Temp);
} //不用循环 删除所有结点
void DeleteList(PLIST p_list)//函数会执行5 5 4 3 2 1
{
//满足条件的情况下 自己调用自己
if (p_list->pNext!=NULL) //if括号里面不是0就是成立
{
DeleteList(p_list->pNext);
}
free(p_list); } int fun(int n)
{
if (n == )
{
return ;
}
else
{
return n + fun(n - );
} //5 +4+3+2+1 //函数嵌套调用
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
///内循环结束又回到了外循环
}
}
} int main()
{
PLIST head = CreateListHead(); //创建头部 把堆内存的首地址返回给head
for (int i = ; i <= ; i++)
InsertListHead(head, i);
PrintList(head); ////尾插法
//InsertListTail(head, 98);
//PrintList(head); ////指定位置插入
//InsertListAppoint(head, 2, 520);
//PrintList(head);
//InsertListAppoint(head, 88, 520);
//PrintList(head);
//DeleteListHead(head);
//PrintList(head); DeleteList(head);
PrintList(head);
head = NULL;
return ;
}
附:


C++学习(三十五)(C语言部分)之 单链表的更多相关文章
- Salesforce LWC学习(三十五) 使用 REST API实现不写Apex的批量创建/更新数据
本篇参考: https://developer.salesforce.com/docs/atlas.en-us.224.0.api_rest.meta/api_rest/resources_compo ...
- Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析
一.SpringBoot简介 SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程. 使用了 Spring 框架后已经简化了我 ...
- python学习 (三十五) logging
1 demo import logging # log level: # DEBUG # INFO # Warning # Error # CRITICAL logging.basicConfig( ...
- python学习三十五天函数递归的用法
python函数递归就是自己调用自己,无限循环,但是python限制了调用的次数1000次,就会终止,递归用在栏目分类,采集程序比较多,下面简单说函数递归用法和实例 1,函数递归用法 def func ...
- 前端学习(三十五)模块化es6(笔记)
RequireJs:一.安装.下载 官网: requirejs.org Npm: npm i requirejs二.使用 以前的开发方式的问题: 1).js 是阻塞加 ...
- Java开发学习(三十六)----SpringBoot三种配置文件解析
一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...
- 风炫安全web安全学习第三十五节课 文件下载和文件读取漏洞
风炫安全web安全学习第三十五节课 文件下载和文件读取漏洞 0x03 任意文件下载漏洞 一些网站由于业务需求,往往需要提供文件下载功能,但若对用户下载的文件不做限制,则恶意用户就能够下载任意敏感文件, ...
- “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java第三十五章:面向对象
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容
孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...
随机推荐
- Win32汇编学习(11):对话框(2)
我们将进一步学习对话框,探讨如何把对话框当成输入设备.如果您看了前一篇文章,那就会发现这次的例子只有少量的改动,就是把我们的对话框窗口附属到主窗口上.另外,我们还要学习通用对话框的用法. 理论: 把对 ...
- visualSFM
Ubuntu18.04配置VisualSFM参考:https://www.jianshu.com/p/cc0b548313e9 VisualSFM有GPU和NO_GPU两个版本,本文安装VisualS ...
- C#实现基于ffmpeg加虹软的人脸识别
关于人脸识别 目前的人脸识别已经相对成熟,有各种收费免费的商业方案和开源方案,其中OpenCV很早就支持了人脸识别,在我选择人脸 识别开发库时,也横向对比了三种库,包括在线识别的百度.开源的OpenC ...
- All You Can Code 2008 (Romanian Contest) A - Tree Search
A - Tree Search 思路: 经典树形dp dp[i][0]表示i的子树中以i为端点的最大链 dp[i][1]表是整棵树中除去i的子树剩下的部分以i为端点的最大链 最后答案就是以i为端点的最 ...
- vue form表单验证
<el-select v-model="ruleForm.region" placeholder="请选择活动区域"> <el-option ...
- C# 实现邮件收取发送功能
.Net调用QQ邮箱发送邮件 话说网上发送邮件的代码很多,但是我由于不细心,导致拿别人的代码发送邮件老是失败,今天就说说几个要注意的地方吧!!! ? 1 2 3 4 5 6 7 8 9 10 11 ...
- gii的使用
假设有表link 在backend中生成子模块content 生成子模块模型common/models/Link 生成模块content中的crud 配置别名 在backend/config/main ...
- 机器学习 之KNN近邻法
目录 1.KNN近邻法 1.KNN近邻法 KNN模型由三个基本要素决定: 距离度量:其中欧式距离一般误差最小,\(x_{i} 和 x_{j}\)为两个样本点:\[L_{2}(x_{i}, x_{j}) ...
- 机器学习之 XGBoost和LightGBM
目录 1.基本知识点简介 2.梯度提升树GBDT算法 2.1 思路和原理 2.2 梯度代替残差建立CART回归树 3.XGBoost提升树算法 3.1 XGBoost原理 3.2 XGBoost中损失 ...
- git branch 不显示的原因
转自:https://blog.csdn.net/qq_39671159/article/details/81261049 必须使用git init命令创建仓库,执行git add . 和git co ...