一起笨笨的学C ——16链表基础
目录
目录
前言
正文
链表定义:
基本创建链表程序:
链表结点插入:
对角线记忆法:
画图理解法:
链表结点删除:
链表销毁:
后语
前言
链表理解方法分享,愿你的大脑也能建立一个链表的指针!
正文
链表定义:
为什么要熟悉定义,总感觉对理解链表会有帮助的。
链表是什么?链表是C 高级编程核心。高级编程诶,开不开心!
链表是相对数组而言的,之所以需要链表是因为数组有缺点。
对于链表而言,最要命的其实不是庞大的代码量,而是逻辑。(就像接电路一样,搞不懂逻辑,看别人继电器之间互锁自锁,就像给自己大脑上了一把锁)
链表是N个结点离散分配,彼此通过指针相连,除头结点与尾结点外,中间的每个结点只有一个前去结点和一个后续结点, 头结点没有前驱结点,尾结点没有后续结点。
一堆鬼文字只能辅助理解(大部分摘自《手把手教你C语言》)。
基本创建链表程序:
就像当初学编程从输出“hello,world”一样,理解创建链表的过程很重要,是基础中的基础,这个搞定后,后面的一系列删除、插入等就不是问题了(的确没那么难理解了)。
//#define NDEBUG#include <stdio.h>
#include <stdlib.h>#include "dbg.h"typedef struct node{char *data;struct node *next;
}Sn;//结构体类型通常首字母大写。
Sn *create_list(void);
void print(Sn *list);int main(int argc, char *argv[])
{Sn *list;list = create_list();print(list);while(list !=NULL){Sn *tmp = list;list = list->next;free(tmp);}return 0;
}Sn *create_list(void)
{int i;int num;Sn *head = malloc(sizeof(*head));Sn *move = head; //这是head的秘书debug("%p", move);check_mem(head);printf("你想输入几条数据?\n:");scanf("%d", &num);getchar();for (i=0; i<num; i++){Sn *fresh= malloc(sizeof(*fresh));char *tmp = malloc(sizeof(tmp));check_mem(fresh);printf("请输入第%d条数据", i+1);scanf("%s", tmp);getchar();fresh->data = tmp;fresh->next = NULL;move->next = fresh;move = fresh;debug("%p", move);}return head;
error:exit(-1);
}void print(Sn *list)
{Sn *move = list;debug("%p", move);printf("你输入的数据是:");while(move->next !=NULL){printf("%s", move->next->data);move= move->next;debug("%p", move);}printf("\n");
}
链表结点插入:
对角线记忆法:
对角线大家都知道,怎么结合程序理解记忆呢?如
fresh->next = move->next; move->next = fresh
画图理解法:
如果以上感觉还是不理解,脑袋里绕不过来,那就拿笔在纸上画画。
如图,假设原来只有move及move->next两块内存,现在要插入fresh,那么就要先让fresh的next指针指向fmovenext,然后movenext指向fresh。顺序不要错,不然报错为定义。
其实搞懂链表创建之后,其它的理解起来也就没那么难了,再看下删除吧。
链表结点删除:
void delete(Sn *head)
184 {
185 char num[20] = "\0";
186 printf("Select the num to delete: ");
187 Sn *save = malloc(sizeof(*save));
188 Sn *move = head;
189 scanf("%s", num);
190 while(move->next != NULL){
191 if(strcmp(num, move->next->num)== 0){
192 save = move->next;
193 move->next = move->next->next;
194 free(save);
195 save = NULL;
196 }
197 move = move->next;
198 }
199 printf("dielet it!");
200 }
201//间隔一段时间再看,我又用笔画了画才理解,也许我该放弃了?
链表销毁:
while(head != NULL){save = head->next;free(head);head = save;
}
所以你废了吗?
后语
-
本以为我已经已如道,可以闭关修炼了。结果在即将道基崩塌的一刻,幡然醒悟,我已再次入魔!浮躁不知不觉又侵占吾身,特开此篇,抑制心魔,与尔共勉!——20240702
-
修真小说看多了,大脑总喜欢把C语言与 修真联想。以下是部分狂想曲:链表是金丹之锁,打破它,才能成为高手。指针之前是寻找气感,理解指针进入练气,然后经过later……以后,锁链出现了。
哦,掌握它得的过程就是破丹期!打破了才是新生,打不破就是个蛋!
-
一不小心已经过去了一个月了,尽管有别的事情,但是更多的说明链表不愧是高级部分,自学表示真的很难——2024/7/27
4.手把手的吴明杰说,实在搞不懂就记住吧 。我正在用这个方法!
相关文章:

一起笨笨的学C ——16链表基础
目录 目录 前言 正文 链表定义: 基本创建链表程序: 链表结点插入: 对角线记忆法: 画图理解法: 链表结点删除: 链表销毁: 后语 前言 链表理解方法分享,愿你的大脑也能建立一个…...

信息学奥赛一本通1917:【01NOIP普及组】装箱问题
1917:【01NOIP普及组】装箱问题 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4178 通过数: 2473 【题目描述】 有一个箱子容量为VV(正整数,0≤V≤200000≤V≤20000),同时有n个物品(0≤n≤300≤n≤30),…...

android user 版本如何手动触发dump
项目需要在android user版本增加手动触发dump方法,用以确认user版本发生dump后系统是重启还是真正发生dump卡机! 本文以qcom平台项目为例描述所做的修改,留下足迹以备后忘。 闲言少叙,开整上干货: 一、修改bin文件 …...

RedHat Linux 7.5 安装 mssql-server
RedHat Linux 7.5 安装 mssql-server 1、安装部署所需的依赖包 [rootlocalhost ~]# yum -y install libatomic bzip2 gdb cyrus-sasl cyrus-sasl-gssapi Loaded plugins: ulninfo Resolving Dependencies --> Running transaction check ---> Package bzip2.x86_64 0:1…...

Vue的SSR和预渲染:提升首屏加载速度与SEO效果
引言 在现代Web应用开发中,首屏加载速度和搜索引擎优化(SEO)是衡量应用性能的重要指标。Vue.js 作为流行的前端框架,提供了服务器端渲染(SSR)和预渲染(prerendering)两种技术来提升这些指标。本文将深入探讨如何使用 Vue 的 SSR 和预渲染技术,提供详细的代码示例和最…...

若依ruoyi+AI项目二次开发(智能售货机运营管理系统)
(一) 帝可得 - 产品原型 - 腾讯 CoDesign (qq.com)...

【SpringBoot】 4 Thymeleaf
官网 https://www.thymeleaf.org/ 介绍 Thymeleaf 是一个适用于 Web 和独立环境的现代服务器端 Java 模板引擎。 模板引擎:为了使用户界面和业务数据分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎会生成一个标准的 html 文档…...

动静资源的转发操作
目录 Nginx中的location指令 静态资源的转发 动态资源的转发 注意事项 深入研究 如何在Nginx中实现对特定后缀文件的静态资源进行反向代理? Nginx中location指令的优先级是怎样确定的? 为什么在使用proxy_pass时要区分是否带有斜杠? N…...

Windows系统安全加固方案:快速上手系统加固指南(上)
无论是个人用户、小型企业还是大型机构,都需要采取措施保护其计算机系统免受各种威胁、系统加固常见的应用场景有个人用户、 AWD 比赛、公共机构以及企业环境等等 文档目录 一、Windows常用命令二、Windows常见端口三、账户安全3.1 默认账户安全3.2 按照用户分配账户…...

git连接远程仓库
一、本地新建代码,上传到远程仓库 1.git init #初始化本地仓库 2.git remote -v #查看当前仓库的远程地址 3.git remote add origin 远程仓库的URL 4.git branch master / git branch dev 创建 主分支或者 dev 分支 5.git checkout master/dev. 切换到主分支或者dev 分支…...

算法-----递归~~搜索~~回溯(宏观认识)
目录 1.什么是递归 1.1二叉树的遍历 1.2快速排序 1.3归并排序 2.为什么会用到递归 3.如何理解递归 4.如何写好一个递归 5.什么是搜索 5.1深度(dfs)优先遍历&优先搜索 5.2宽度(bfs)优先遍历&优先搜索 6.回溯 1.什…...

【云原生】Docker搭建知识库文档协作平台Confluence
目录 一、前言 二、企业级知识库文档工具部署形式 2.1 开源工具平台 2.1.1 开源工具优点 2.1.2 开源工具缺点 2.2 私有化部署 2.3 混合部署 三、如何选择合适的知识库平台工具 3.1 明确目标和需求 3.2 选择合适的知识库平台工具 四、Confluence介绍 4.2 confluence特…...

序列化与反序列化的本质
1. 将对象存储到本地 假如有一个student类,我们定义了好几个对象,想要把这些对象存储下来,该怎么办呢 from typing import List class Student:name: strage: intphones: List[str] s1 Student("xiaoming",10,["huawei&quo…...

飞牛爬虫FlyBullSpider 一款简单方便强大的爬虫,限时免费 特别适合小白!用它爬下Boss的2024年7月底Java岗位,分析一下程序员就业市场行情
一、下载安装FlyBullSpider 暂时支持Window,现在只在Win11上做过测试 1 百度 点击百度网盘 下载 链接:https://pan.baidu.com/s/1gSLKYuezaZgd8iqrXhk8Kg 提取码:Fly6 2 csdn https://download.csdn.net/download/fencer911/89584687 二、体验初…...

EXCEL 排名(RANK,COUNTIFS)
1.单列排序 需求描述:如有下面表格,需要按笔试成绩整体排名。 解决步骤: 我们使用RANK函数即可实现单列整体排名。 Number 选择第一列。 Ref 选择这一整列(CtrlShift向下箭头、再按F4)。 "确定"即可计算…...

【踩坑系列-JS】iframe中的url参数获取
Author:赵志乾 Date:2024-07-24 Declaration:All Right Reserved!!! 1. 问题描述 系统A的页面中以iframe的方式嵌入了系统B的页面,并需要将A页面url中的参数传递给B页面。 最初的实现方式是&am…...

测试工作中常听到的名词解释 : )
背景 很多名称其实看字面意思都挺抽象的,有时看群里的测试大佬在不停蹦这类术语,感觉很高大上,但其实很多你应该是知道的,只不过没想到别人是这样叫它的。又或者你的主编程语言不是 Java,所以看不懂他们在讲啥&#x…...

Linux内网离线用rsync和inotify-tools实现文件夹文件单向同步和双向同步
lsyncd实现方式可参考:https://www.jianshu.com/p/c075ccf89516 安装文件下载:相关文件下载 rsync默认都有,所以没有提供。 服务端和客户端均操作 服务端:双向同步其实都是服务端,只是单向同步时稍有区别 客户端&am…...

Spring Security学习笔记(二)Spring Security认证和鉴权
前言:本系列博客基于Spring Boot 2.6.x依赖的Spring Security5.6.x版本 上一篇博客介绍了Spring Security的整体架构,本篇博客要讲的是Spring Security的认证和鉴权两个重要的机制。 UsernamePasswordAuthenticationFilter和BasicAuthenticationFilter是…...

产品经理NPDP好考吗?
NPDP是新产品开发专业人员的资格认证,对于希望在产品管理领域取得认可的专业人士来说,NPDP认证是一项重要的资格。 那么,产品经理考取NPDP资格认证究竟难不难呢? 首先,NPDP考试的难易程度取决于考生的背景和准备情况…...

【C++】:红黑树的应用 --- 封装map和set
点击跳转至文章:【C】:红黑树深度剖析 — 手撕红黑树! 目录 前言一,红黑树的改造1. 红黑树的主体框架2. 对红黑树节点结构的改造3. 红黑树的迭代器3.1 迭代器类3.2 Begin() 和 End() 四,红黑树相关接口的改造4.1 Find…...

unity美术资源优化(资源冗余,主界面图集过多)
图片资源冗余: UPR unity的性能优化工具检查资源 1.检查纹理读/写标记 开启纹理资源的读/写标志会导致双倍的内存占用 检查Inspector -> Advanced -> Read/Write Enabled选项 2.检查纹理资源alpha通道 如果纹理的alpha通道全部为0,或者全部为2…...

【git】github中的Pull Request是什么
在 Git 中,"pull request"(简称 PR)是一种在分布式版本控制系统中使用的功能,特别是在使用 GitHub、GitLab、Bitbucket 等基于 Git 的代码托管平台时。Pull Request 允许开发者请求将他们的代码更改合并到另一个分支&am…...

gitlab查询分支API显示不全,只有20个问题
背景 gitlab查询分支API需要查询所有分支,且分支数量大于20,但目前调用接口返回的branch最多就显示了20个 解决方案 根据GitLab的文档,查询分支API默认最多返回20个分支。如果要一次性显示80个分支,可以使用分页参数来获取所有…...

vue3+vite 实现动态引入某个文件夹下的组件 - glob-import的使用
<template><div class"user-content"><HeaderTitle title"用户详情"></HeaderTitle><div class"main-content"><div><UserForm /></div><div><TableList></TableList></d…...

hhhhh
x torch.tensor([1.0,0.],[-1.,1.],requires_gradTrue) z x.pow(2).sum() z.backward() x.grad在这段代码中,我们利用 PyTorch 进行自动求梯度,下面详细解释代码的每一个部分及其在反向传播中的作用。同时,我们也将介绍函数对象和叶子节点的…...

扫雷小游戏纯后端版
package com.wind;import java.util.Random; import java.util.Scanner;public class ResultLei {static Random random new Random();public static void main(String[] args) {boolean end true;while (end) {System.out.println("请输入你选择的难度对应的数字&#…...

RuoYi-Vue-Plus(动态添加移除数据源)
一、添加数据 private final DynamicRoutingDataSource dynamicRoutingDataSource;private final DefaultDataSourceCreator dataSourceCreator;//添加一个dynamic的数据源@GetMapping("createDynamic")public void createDynamic() {DataSourceProperty property =…...

idea启动项目报:the command line via JAR manifest or via a classpath file and rerun.
解决方案 1.打开Edit Configurations,进去编辑,如下: 笔记配置 2.选择Modfiy options,点击Shorten command line 3.在新增的Shorten command line选项中选择JAR manifest或classpath file 4.点击保存后即可...

vue3 + ts中有哪些类型是由vue3提供的?
在 Vue 3 中结合 TypeScript 使用时,Vue 提供了一系列的类型帮助函数和接口,这些类型用于增强 TypeScript 的集成和提供类型安全。以下是一些由 Vue 3 提供的常用 TypeScript 类型: RefType: 用于标注一个 ref 返回的响应式引用类型。Reacti…...