单链表 就好比火车

火车头-->链表头部
火车尾-->链表尾部
火车厢-->链表的节点
火车厢连接的部分-->指针
火车中的内容-->链表节点的的数据
链表节点包含数据域和指针域
数据域存放数据
指针域存放要连接的节点的首地址

在造火车的时候 先是火车头 然后是车厢
--->链表的首节点和之后的节点

先从内存中申请头结点的存储空间
--->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语言部分)之 单链表的更多相关文章

  1. Salesforce LWC学习(三十五) 使用 REST API实现不写Apex的批量创建/更新数据

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.224.0.api_rest.meta/api_rest/resources_compo ...

  2. Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析

    一.SpringBoot简介 SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程. 使用了 Spring 框架后已经简化了我 ...

  3. python学习 (三十五) logging

    1  demo import logging # log level: # DEBUG # INFO # Warning # Error # CRITICAL logging.basicConfig( ...

  4. python学习三十五天函数递归的用法

    python函数递归就是自己调用自己,无限循环,但是python限制了调用的次数1000次,就会终止,递归用在栏目分类,采集程序比较多,下面简单说函数递归用法和实例 1,函数递归用法 def func ...

  5. 前端学习(三十五)模块化es6(笔记)

    RequireJs:一.安装.下载    官网: requirejs.org    Npm:  npm i requirejs二.使用    以前的开发方式的问题:        1).js 是阻塞加 ...

  6. Java开发学习(三十六)----SpringBoot三种配置文件解析

    一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...

  7. 风炫安全web安全学习第三十五节课 文件下载和文件读取漏洞

    风炫安全web安全学习第三十五节课 文件下载和文件读取漏洞 0x03 任意文件下载漏洞 一些网站由于业务需求,往往需要提供文件下载功能,但若对用户下载的文件不做限制,则恶意用户就能够下载任意敏感文件, ...

  8. “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. “全栈2019”Java第三十五章:面向对象

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容

     孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...

随机推荐

  1. Linux Sphinx 安装与使用

    一.什么是 Sphinx? Sphinx 是一个基于SQL的全文检索引擎,可以结合 MySQL,PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序 更容易实现专业化 ...

  2. gitlab备份还原

    断电后gitlab报500错误 查看日志 tail -f /var/log/gitlab/gitlab-rails/production.log ActionView::Template::Error ...

  3. excel加密文件破解代码

    1. AIT+F11  2. 代码   3. F5 Public Sub AllInternalPasswords()' Breaks worksheet and workbook structure ...

  4. Rancher2.0导入本地RKE Kubernetes集群图解

      简要说明: 使用RKE工具在192.168.3.161机器上,创建包含两个节点的Kubernetes集群,(192.168.3.162和192.168.3.163).RKE会自动在/home/用户 ...

  5. A_Pancers团队作业4—基于原型的团队项目需求调研与分析

    任务1:实施团队项目软件用户调研活动. (1)用户调研对象:我们的项目软件是基于安卓系统的音乐播放器,以设计出操作简单的音乐播放器为目的,所以本次用户调研的对象主要以身边的老人为主,对他们听音乐,听戏 ...

  6. mockjs学习

    mockjs简单学习与应用,可以满足工作所需就行.*************************************************************************** ...

  7. jar包安装到本地仓库

    mvn install:install-file -Dfile=hm_test.jar -DgroupId=com.TEST -DartifactId=hm_test -Dversion=1.0 -D ...

  8. 百度地图API---JS开发

    百度地图API 开源地址:http://lbsyun.baidu.com/index.php?title=jspopular/guide/introduction#Https_.E8.AF.B4.E6 ...

  9. html5(六) 地理位置

    http://www.cnblogs.com/lhb25/archive/2012/07/10/html5-geolocation-api-demo.html http://www.w3school. ...

  10. IPFS初探

    背景:听说IPFS=bittorrent+bitcoin+git+afs,有可能取代http,好像厉害的不行,所以要研究一下. 编译参考:https://github.com/ipfs/go-ipfs ...