<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[从0至1]]></title> 
<atom:link href="https://www.from0to1.cn/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[从0至1 - 个人博客 ·  学习笔记 · 技术成长]]></description>
<link>https://www.from0to1.cn/</link>
<language>zh-cn</language>

<item>
    <title>跟优秀的人在一起，要展现自己的智慧，为大家做贡献</title>
    <link>https://www.from0to1.cn/one_penetrating_remark/gyxdrzyq-yzxzjdzh-wdjzgx.html</link>
    <description><![CDATA[<p>跟优秀的人在一起，要展现自己的智慧，为大家做贡献；<br />
跟愚蠢的人在一起，要迅速离开，离开不了，就假装什么都不知道，少交流、少聚在<br />
一起、随便打发他们。<br />
不要妄想把他们教会，也别纠正他们，因为纠正不了，他们不会听，也认<br />
识不到自己的问题，必须隐藏自己的能力和智慧。<br />
我们是明哲保身策略，绝不跟蠢人死磕硬刚，他们的力量难以预估。<br />
首先是保全自己，防止被侵害，等待离开的机会。<br />
你不需要为了证明自己是正确的，他们是错误的，而把自己置于险境。<br />
变聪明很容易，但是会装傻，就难了。</p>]]></description>
    <pubDate>Thu, 21 May 2026 00:23:33 +0800</pubDate>
    <dc:creator>从0至1</dc:creator>
    <guid>https://www.from0to1.cn/one_penetrating_remark/gyxdrzyq-yzxzjdzh-wdjzgx.html</guid>
</item>
<item>
    <title>为什么人际关系这么重要？因为信任，本来就是人类社会最难解决的 问题。</title>
    <link>https://www.from0to1.cn/one_penetrating_remark/wsyrjgxzycy-ywsr-bljsrlshznjjdwt-.html</link>
    <description><![CDATA[<p>为什么人际关系这么重要？因为信任，本来就是人类社会最难解决的<br />
问题。<br />
尤其是做生意，好的商业关系一定要用心维护，信任是一切的基础。<br />
你说你的货靠谱、是正品，别人凭什么信你？你让人家先付钱、再等货，<br />
别人为什么愿意赌？<br />
最后做决定的是人，而人本来就很主观。<br />
人是群居动物，人际关系是人脑天生懂的语言之一。<br />
熟悉的、舒适的关系就是会让人产生更高的信任度。<br />
尤其到了 AI 时代，很多事情机器都能做，唯独人与人之间的真诚、默<br />
契、信任，AI 模仿不来。<br />
所以我觉得，现在的年轻人最该学的，是怎么跟人打交道：懂社交、懂人<br />
性、会沟通，知道别人想要什么，懂得用价值交换拿到自己想要的结果。<br />
可现实偏偏是，越来越多人社恐、喜欢独处，大家都越来越不爱社交。<br />
诚信<br />
现在咱们国家对外输出的是什么<br />
诚信中国</p>]]></description>
    <pubDate>Thu, 21 May 2026 00:22:36 +0800</pubDate>
    <dc:creator>从0至1</dc:creator>
    <guid>https://www.from0to1.cn/one_penetrating_remark/wsyrjgxzycy-ywsr-bljsrlshznjjdwt-.html</guid>
</item>
<item>
    <title>跟高能量场的朋友聊天，聊的是什么？</title>
    <link>https://www.from0to1.cn/ggnlcdpylt-ldssy-.html</link>
    <description><![CDATA[<p>跟高能量场的朋友聊天，聊的是什么？是事实，是陈述，再深一层<br />
呢？就是基于事实推理出的自我观点，就到这一步。<br />
我们总说，中国教育需要改革，需要加入逻辑课程。<br />
可是，很多人并不知道什么是逻辑。<br />
以及加入的目的是什么？<br />
我不知道大家观察过没，日常大家聊天，以及很多公众号，输出的全是观<br />
点，例如电车比油车好，至于为什么得出这个观点，他不讲，甚至他自己<br />
就没思考过。<br />
逻辑是个什么玩意？<br />
把事实加工成观点的推理过程，这就是逻辑。<br />
事实是原材料。<br />
观点是成品。<br />
逻辑就是机床。<br />
貌似很容易理解吧？<br />
其实，大部分人的日常里，都没有这玩意，我去品品香大姐那边玩耍，在<br />
茶馆会遇到很多人，大家在一起聊天，我发现大家输出的要么是观点，要<br />
么是立场，要么是信仰，缺失的恰好是地基部分。<br />
地基是什么？<br />
事实+逻辑。<br />
大家日常也喜欢传播观点。<br />
整个链条是：事实、观点、立场、信仰。<br />
主观性越来越强。<br />
事实就是事实，例如今天股票大跌。<br />
观点是什么？例如我纵观分析了股票从高点已经下跌了多少，公司业绩没<br />
问题，是情绪超跌了，我认为可以抄底了，这个推理过程就是逻辑分析，<br />
观点就是我认为可以抄底了。<br />
立场是什么？<br />
例如我认为，炒股就是赌博，我不管你逻辑怎么分析，反正炒股就是错<br />
的，绝对不能买。<br />
信仰是什么？<br />
你信佛就不能吃肉，你别跟我讲不吃肉缺蛋白质，我们的体质不需要蛋白<br />
质……<br />
真正的高维选手，你听他们聊天，基本都框定在事实+逻辑+观点这三道<br />
里，不会随意上升到立场、信仰。<br />
这样交流才有意义。</p>]]></description>
    <pubDate>Thu, 21 May 2026 00:21:55 +0800</pubDate>
    <dc:creator>从0至1</dc:creator>
    <guid>https://www.from0to1.cn/ggnlcdpylt-ldssy-.html</guid>
</item>
<item>
    <title>人生的核心，其实只需做好两件事：照顾好身体和驯服大脑。</title>
    <link>https://www.from0to1.cn/one_penetrating_remark/rsdhx-qszxzhljs-zghsbhxfdn-.html</link>
    <description><![CDATA[<p>人生的核心，其实只需做好两件事：照顾好身体和驯服大脑。<br />
身体是你唯一的载体，健康是所有可能性的前提；大脑是你的操作系统，<br />
不受控制的思绪会制造痛苦。<br />
身体与大脑相互影响：健康的身体支撑清晰的思维，平静的思维呵护身体<br />
健康。<br />
当你同时照顾身心，你就拥有行动的能量、判断的平静和专注的清晰，其<br />
他欲望与焦虑都只是噪音。</p>]]></description>
    <pubDate>Thu, 21 May 2026 00:21:15 +0800</pubDate>
    <dc:creator>从0至1</dc:creator>
    <guid>https://www.from0to1.cn/one_penetrating_remark/rsdhx-qszxzhljs-zghsbhxfdn-.html</guid>
</item>
<item>
    <title>这世上很多东西都可以是你的杠杆</title>
    <link>https://www.from0to1.cn/one_penetrating_remark/zhe-shi-shang-hen-duo-dong-xi-dou-ke-yi-shi-ni-de-gang-gan.html</link>
    <description><![CDATA[<p>这世上很多东西都可以是你的杠杆。<br />
如果你拥有优渥的家庭条件，那么老天爷赏饭吃，家庭就是你的杠杆。<br />
如果你学习成绩好，读了好的学校，那么学校也可以是你的杠杆。<br />
你找到了优秀的另一半，带你不断往前走，爱人也是你的杠杆。<br />
你遇到了愿意提携你的贵人，贵人更是你的杠杆。<br />
杠杆，会让你更快更好地实现跨越。<br />
互联网是最大的杠杆<br />
你没有很强的优点，能力，不要紧<br />
互联网会把你仅有的优点，能力，无限放大<br />
同时，你火了之后，也会把你现实中都不算什么的缺点也无限放大。</p>]]></description>
    <pubDate>Thu, 21 May 2026 00:20:10 +0800</pubDate>
    <dc:creator>从0至1</dc:creator>
    <guid>https://www.from0to1.cn/one_penetrating_remark/zhe-shi-shang-hen-duo-dong-xi-dou-ke-yi-shi-ni-de-gang-gan.html</guid>
</item>
<item>
    <title>学会理财，学会自律</title>
    <link>https://www.from0to1.cn/reading-notes/xue-hui-li-cai--xue-hui-zi-lv.html</link>
    <description><![CDATA[<p>学会理财，保持自律！</p>
<p>用闲钱、用现金流进行投资，同时保住自己的工作，稳定的工资收入可以维持生活的各样开支，让自己能更从容去做投资。</p>
<p>不激进，不all in，记住投资不是一时的事情，而是一生要做的事业。</p>]]></description>
    <pubDate>Fri, 01 May 2026 13:50:07 +0800</pubDate>
    <dc:creator>从0至1</dc:creator>
    <guid>https://www.from0to1.cn/reading-notes/xue-hui-li-cai--xue-hui-zi-lv.html</guid>
</item>
<item>
    <title>新手写 Prompt 最容易踩的 10 个坑｜每个坑配正反完整例子，对着改就能用</title>
    <link>https://www.from0to1.cn/Converse_with_AI/xsxpzrycdgk-mgkpzfwzlz-dzgjny.html</link>
    <description><![CDATA[<h1>新手写 Prompt 最容易踩的 10 个坑｜每个坑配正反完整例子，对着改就能用</h1>
<p>好多朋友看完上一篇，在后台跟我说：每个坑都精准踩中了，想要每个坑都配上实打实的完整例子，自己写的时候能对着改，一看就懂哪里错了。</p>
<p>没问题，今天这篇不玩虚的，10 个坑每个都给你们配：<strong>新手真实会写的翻车完整 Prompt</strong>、<strong>改完就能直接用的避坑版 Prompt</strong>，还有一句话讲透改对的核心逻辑。你对着自己写的 Prompt 一对照，立马就能找到问题，改完 AI 输出效果直接翻倍。</p>
<p>还是老样子，没有晦涩术语，全是我踩坑踩出来的干货，新手看完就能上手。</p>
<hr />
<h2>坑 1：只甩一句光秃秃的需求，啥补充信息都不给</h2>
<p>这是新手翻车率 100% 的头号坑，就像给实习生派活只说 “帮我做个东西”，对方根本不知道从哪下手，只能给你凑一篇没用的流水账。</p>
<p>✅ <strong>新手翻车完整 Prompt 例子</strong></p>
<pre><code>帮我写个工作总结</code></pre>
<p>✅ <strong>改后避坑可用 Prompt 例子</strong></p>
<pre><code>你是一名有3年经验的互联网内容运营，擅长写逻辑清晰、重点突出数据的工作总结，给直属领导汇报用。

帮我撰写2024年Q4的运营岗季度工作总结，核心工作内容如下：

1\. 公众号更新原创文章16篇，总阅读量18万，单篇最高阅读1.2万，季度涨粉1800

2\. 完成8场直播带货，总GMV96万，平均转化率3.1%

3\. 对接15个品牌合作，敲定8个落地项目，合作总金额12万

要求：重点突出数据成果和业务价值，弱化琐碎执行细节，复盘工作不足和改进方案，规划Q1的核心工作目标，不要空话套话。

最终内容分4个模块呈现：【季度核心成果】【工作复盘与改进】【不足与优化方案】【Q1工作计划】，每个模块分点列表，总字数控制在1200字以内。</code></pre>
<p>✅ <strong>改对的核心逻辑</strong></p>
<p>没有只甩需求，而是补全了「汇报对象、核心工作内容、重点要求、结构规范」4 个关键信息，AI 不用瞎猜，直接就能精准输出贴合你需求的内容，而不是全网通用的空模板。</p>
<hr />
<h2>坑 2：全是主观形容词，没有半分可落地的标准</h2>
<p>新手改 10 遍都不满意，90% 都是踩了这个坑。你嘴里的 “高级、好看、有创意”，和 AI 理解的完全不是一回事，鸡同鸭讲，永远达不到你的预期。</p>
<p>✅ <strong>新手翻车完整 Prompt 例子</strong></p>
<pre><code>帮我写个高级的粉底液小红书文案，要好看有质感，能种草的</code></pre>
<p>✅ <strong>改后避坑可用 Prompt 例子</strong></p>
<pre><code>你是一名有4年经验的小红书平价美妆博主，主打油皮彩妆测评，擅长写有真实使用感、不生硬、像朋友分享一样的种草文案，懂小红书流量逻辑。

帮我写一篇持妆粉底液的小红书种草文案，核心卖点：平价99元、油皮持妆8小时不氧化、不闷痘、遮瑕力中等能遮红血丝、自然不假白，面向混油/油皮的学生党和化妆新手。

要求：开头3秒戳中油皮夏天脱妆卡粉的痛点，文案有真实的带妆一天的使用感受，口语化表达，不夸大宣传，字数控制在380字以内。

最终内容包含：吸睛标题、正文分3个小段、结尾加相关的话题标签。</code></pre>
<p>✅ <strong>改对的核心逻辑</strong></p>
<p>把 “高级、好看、有质感” 这些虚的主观形容词，全部换成了可落地的客观标准：<strong>精准的博主人设、明确的产品卖点、目标人群、内容结构、字数要求、语气风格</strong>，AI 有明确的执行标准，不会再天马行空。</p>
<hr />
<h2>坑 3：一次堆 N 个任务，让 AI 同时干好几件事</h2>
<p>很多新手想一步到位，一个 Prompt 让 AI 把所有活都干了，结果就是啥都干了，啥都没干好，每个部分都敷衍到没法用。</p>
<p>✅ <strong>新手翻车完整 Prompt 例子</strong></p>
<pre><code>帮我写一篇身体乳的抖音推广文案，再想15个标题，做一份14天的短视频发布计划，顺便分析一下3个同赛道的竞品账号，再给我写个直播带货的口播稿</code></pre>
<p>✅ <strong>改后避坑可用 Prompt 例子</strong></p>
<pre><code>你是一名有3年经验的抖音个护类短视频博主，擅长写节奏快、有痛点、有卖点、完播率高的30秒口播文案。

帮我写一篇平价保湿身体乳的抖音短视频口播文案，核心卖点：29.9元两大瓶、保湿不粘腻、涂完吸收快、香味是淡栀子花香、适合秋冬皮肤干燥起皮的人群。

要求：开头3秒戳中秋冬皮肤干痒起皮的痛点，中间讲3个核心卖点，结尾引导点击小黄车，文案时长30秒左右，大概200字，口语化表达，适合对着镜头口述，不要书面化。</code></pre>
<p>✅ <strong>改对的核心逻辑</strong></p>
<p>砍掉了所有叠加的任务，一次只聚焦「写抖音口播文案」这一个核心目标，AI 能把所有注意力放在这一件事上，输出的内容质量会比同时干 5 件事高 10 倍。其他的标题、发布计划，等文案定稿后，再单独给 AI 指令完成。</p>
<hr />
<h2>坑 4：只会用否定句，不会说正向指令</h2>
<p>新手写 Prompt，最爱写 “别、不要、禁止”，结果 AI 输出的内容，偏偏就踩中了你不让它干的事 —— 不是 AI 跟你对着干，是它对否定词的敏感度极低，根本记不住。</p>
<p>✅ <strong>新手翻车完整 Prompt 例子</strong></p>
<pre><code>帮我写个新人入职的自我介绍，别太长，别太官方，别太张扬，不要空话套话，不要写没用的内容</code></pre>
<p>✅ <strong>改后避坑可用 Prompt 例子</strong></p>
<pre><code>你是一名刚入职互联网公司的运营岗新人，帮我写一篇入职当天在部门群里发的自我介绍。

要求：态度谦虚真诚，口语化接地气，总字数控制在150字以内，内容只包含3部分：姓名、岗位、个人擅长的事，结尾加上请大家多多关照的礼貌话术。</code></pre>
<p>✅ <strong>改对的核心逻辑</strong></p>
<p>把所有 “别、不要” 的否定句，100% 换成了正向的、明确的执行指令，直接告诉 AI「要写什么、要写成什么样、要控制在什么范围」，而不是只说「不能写什么」，AI 不会再因为抓不住否定词而跑偏。</p>
<hr />
<h2>坑 5：死活不给角色，让 AI 无边界瞎发挥</h2>
<p>90% 的新手都觉得 “给 AI 定角色是花架子”，但我可以说，同样的需求，加一句精准的角色，AI 输出的效果直接翻倍，完全是两个级别。</p>
<p>✅ <strong>新手翻车完整 Prompt 例子</strong></p>
<pre><code>帮我解释一下社保断缴有什么影响</code></pre>
<p>✅ <strong>改后避坑可用 Prompt 例子</strong></p>
<pre><code>你是一名有12年经验的一线城市社保经办专员，每天都给普通人解答社保问题，擅长用大白话讲清社保规则，不讲专业术语和官话。

帮我给刚毕业的应届生讲清楚，职工社保断缴会有哪些具体影响，分别对医保、养老、买房、摇号、落户这5个方面的影响，分点讲清楚，哪些是断缴就立刻失效的，哪些是可以补缴的，不要空话。</code></pre>
<p>✅ <strong>改对的核心逻辑</strong></p>
<p>给 AI 定了「12 年经验的社保经办专员」这个精准角色，它会自动调用这个身份对应的专业知识和表达逻辑，不会给你发一堆百度百科式的官话，而是直接讲普通人最关心的、最实用的内容，完全贴合你的需求。</p>
<hr />
<h2>坑 6：不给背景信息，让 AI 凭空瞎猜</h2>
<p>很多新手写 Prompt，总怕麻烦，啥背景都不给，结果 AI 输出的内容全是编的，没有半分个性化，根本没法用 ——AI 不会读心术，它不知道你的个人情况、产品卖点、项目背景。</p>
<p>✅ <strong>新手翻车完整 Prompt 例子</strong></p>
<pre><code>帮我写个考研复试的自我介绍</code></pre>
<p>✅ <strong>改后避坑可用 Prompt 例子</strong></p>
<pre><code>你是一名985高校计算机专业的硕士生导师，带过8届考研复试，最懂复试老师想听到什么样的自我介绍，不喜欢空话套话。

帮我写一份考研复试的英文自我介绍，时长2分钟，大概300个单词，我的个人背景如下：

1\. 本科双非院校软件工程专业，一志愿985院校计算机技术专业，初试总分385分，数学二130分

2\. 本科期间拿过2次校级一等奖学金，参与过校级的校园管理系统开发项目，负责后端开发模块

3\. 对人工智能、大模型应用方向感兴趣，本科期间自学过Python、深度学习相关课程

要求：突出我的数学优势和项目实践经历，态度真诚不浮夸，不要空话套话，句式简单易懂，适合口语表达，不要复杂的长难句。</code></pre>
<p>✅ <strong>改对的核心逻辑</strong></p>
<p>把自己的个人背景、分数、经历、优势、目标全部清晰地告诉了 AI，补充了完整的参考信息，AI 不用凭空瞎编，输出的内容完全贴合你的个人情况，拿来就能直接用，而不是全网通用的模板。</p>
<hr />
<h2>坑 7：迷信英文 Prompt，中文都说不明白硬拽英文</h2>
<p>网上总有人说 “英文 Prompt 比中文效果好”，结果一堆新手中文都没把需求说清楚，硬往里面塞半懂不懂的英文，最后 AI 直接理解跑偏，输出的内容完全不对。</p>
<p>✅ <strong>新手翻车完整 Prompt 例子</strong></p>
<pre><code>帮我写个月度的work report，要有具体的data支撑，还要有user画像分析，重点突出我的KPI完成情况，给leader看的，要professional一点</code></pre>
<p>✅ <strong>改后避坑可用 Prompt 例子</strong></p>
<pre><code>你是一名有5年经验的互联网电商运营，擅长写逻辑清晰、数据化呈现的月度工作汇报，给部门总监看的，语言专业严谨，不啰嗦。

帮我写一份12月的电商运营月度工作汇报，核心数据如下：

1\. 店铺月度销售额120万，完成月度KPI的120%，同比上月增长25%

2\. 付费投放ROI1:4.2，同比上月提升0.8，投放成本降低15%

3\. 店铺粉丝月度新增1.2万，会员新增3000人

要求：重点突出KPI完成情况和核心工作成果，拆解增长原因，复盘工作不足，制定1月的核心工作目标，用数据支撑所有结论，不要空话套话。

最终内容分4个模块呈现，分点列表，总字数控制在1000字以内。</code></pre>
<p>✅ <strong>改对的核心逻辑</strong></p>
<p>删掉了所有没必要的英文单词，用纯中文把需求、背景、要求说的清清楚楚，没有任何会让 AI 理解偏差的内容。对于新手来说，中文的表达精准度，远比你硬拽的半吊子英文高 100 倍。</p>
<hr />
<h2>坑 8：一次不满意就重写，不会迭代优化</h2>
<p>我见过太多新手，写一个 Prompt，AI 输出的内容不满意，直接删掉重写，前前后后写十几个版本，结果一个比一个离谱，纯属白费功夫。</p>
<p>✅ <strong>新手翻车完整操作例子</strong></p>
<ol>
<li>第一次写的 Prompt：</li>
</ol>
<pre><code>帮我写个商场情人节活动方案</code></pre>
<ol>
<li>输出不满意，直接删掉，重写了一个完全不一样的 Prompt：</li>
</ol>
<pre><code>你是活动策划，帮我写个商场情人节的快闪活动方案，预算2万，要吸引年轻人</code></pre>
<ol>
<li>还是不满意，继续删掉重写，来回改了 8 个版本，一个比一个离谱。</li>
</ol>
<p>✅ <strong>正确的迭代优化避坑例子</strong></p>
<ol>
<li>第一次基础 Prompt：</li>
</ol>
<pre><code>你是一名有5年经验的线下活动策划师，擅长做面向年轻人的低成本、高参与度的商场情人节快闪活动方案，帮我写一份2天的商场情人节活动方案，总预算2万，核心目标是提升商场周末客流量和到店消费率。</code></pre>
<ol>
<li>第一次输出后，不满意的点是「预算太笼统，活动流程太复杂」，不重写，直接发迭代指令：</li>
</ol>
<pre><code>你刚才写的这份方案，有两个地方需要调整：

1\.  预算部分太笼统了，帮我把每一项的预算明细拆出来，总预算严格控制在2万以内，重点预算放在活动互动和宣传引流上，不要花在复杂的搭建上

2\.  活动流程太复杂了，帮我把核心互动环节简化成2个，要轻量级、情侣参与门槛低、不用提前报名的，其他内容保持不变。</code></pre>
<p>✅ <strong>改对的核心逻辑</strong></p>
<p>没有推翻重写，而是在原有正确的框架上，精准告诉 AI「哪里不满意、要改成什么样」，一次只调整 1-2 个核心点，AI 不用从零开始，直接在原有基础上优化，效率和效果都比重写 10 个版本好 10 倍。</p>
<hr />
<h2>坑 9：觉得 Prompt 越长越好，堆一堆没用的废话</h2>
<p>很多新手觉得，Prompt 写的越长，越专业，AI 输出的效果越好。结果写了一大段，堆了一堆没用的情绪铺垫、无关内容，核心需求反而被淹没了，AI 直接抓不住重点。</p>
<p>✅ <strong>新手翻车完整 Prompt 例子</strong></p>
<pre><code>你好，我是一个刚毕业的应届生，刚入职一家互联网公司做行政，才入职半个月，什么都不会，特别紧张，我们领导特别严格，我怕做错事被骂，明天我家里有事，想跟领导请假一天，我从来没跟领导请过假，不知道怎么说，怕领导不同意，也怕说的不对给领导留下不好的印象，你一定要帮我写一个合适的请假条，要礼貌一点，真诚一点，不要太生硬，不然领导会生气的，求求你了</code></pre>
<p>✅ <strong>改后避坑可用 Prompt 例子</strong></p>
<pre><code>你是一名互联网公司的行政岗新人，帮我写一篇给直属领导的事假请假申请，用企业微信的消息格式发送。

要求：语气诚恳礼貌，理由合理，清晰说明请假时间、工作交接安排，不啰嗦，不卑微，正文控制在150字以内。

具体信息：请假时间为1月15日（周一）1天，已和同事对接好当天的应急工作，紧急事项可以电话联系我。</code></pre>
<p>✅ <strong>改对的核心逻辑</strong></p>
<p>删掉了所有和核心需求无关的情绪铺垫、个人焦虑、没用的废话，只保留了「角色、核心任务、具体信息、要求、输出规范」这些核心内容，越简洁清晰，AI 越能抓住你的核心需求，不会被无关信息干扰跑偏。</p>
<hr />
<h2>坑 10：照搬网上的模板，不改直接用</h2>
<p>网上到处都是 “万能 Prompt 模板”，很多新手找个模板，直接复制粘贴，只改个产品名就发给 AI，结果出来的内容还是不对，就骂模板没用。</p>
<p>✅ <strong>新手翻车完整操作例子</strong></p>
<ol>
<li>网上找的通用模板：</li>
</ol>
<pre><code>你是【】领域的资深专家，拥有【】年的经验，擅长【】。请你为我生成【】，核心要求是【】，面向【】人群，最终用【】格式呈现。</code></pre>
<ol>
<li>新手直接照搬，只改了一两个词，完全没填充自己的需求：</li>
</ol>
<pre><code>你是美妆领域的资深专家，拥有很多年的经验，擅长写文案。请你为我生成口红的文案，核心要求是好看能种草，面向女生，最终用文案格式呈现。</code></pre>
<p>✅ <strong>改后避坑可用 Prompt 例子</strong></p>
<pre><code>你是有5年经验的小红书美妆博主，主打学生党平价彩妆测评，拥有10万粉丝，擅长写真实不浮夸、有细节、种草力强的口红试色文案，懂小红书用户喜好和流量逻辑。

请你为我生成一篇平价唇泥的小红书试色文案，产品核心信息：价格39元、色号是低饱和灰粉豆沙色、哑光不拔干、黄皮素颜涂显白、不沾杯，核心卖点是平价、素颜友好、黄皮显白。

面向18-22岁的学生党、化妆新手、黄皮女生，要求文案有真实上嘴试色感受，戳中黄皮买口红显黑、拔干的痛点，口语化表达，字数控制在350字以内。

最终内容包含：吸睛标题、正文分3小段、结尾话题标签的格式呈现。</code></pre>
<p>✅ <strong>改对的核心逻辑</strong></p>
<p>没有只抄模板的空架子，而是把模板里的每一个括号，都填充了自己的具体需求、产品信息、目标人群、核心要求，把通用模板，改成了完全贴合自己需求的专属 Prompt，AI 输出的内容自然精准。</p>
<hr />
<h2>最后说两句</h2>
<p>其实写 Prompt 真的没有什么高深的技巧，你把这 10 个坑避开，就已经超过了 80% 的新手。</p>
<p>说到底，写 Prompt 的核心，就是把你自己想要什么，想的明明白白，然后清清楚楚、原原本本地告诉 AI。你给的指令越具体，边界越清晰，信息越完整，AI 给你的结果就越精准。</p>
<p>为了帮大家更快上手，我把这 10 个坑的避坑指南，还有对应的 30 个新手零门槛、全场景 Prompt 模板，整理成了一份《Prompt 新手避坑手册》。关注我的公众号【Prompt 工程笔记】，后台回复【避坑】，就能直接免费领取，改几个字就能用。</p>
<p>你们平时写 Prompt，最常踩的是哪个坑？评论区跟我说说，我下次专门给你们出对应的解决办法。下一篇，我会给你们拆解《新手写 Prompt 的 3 步迭代法，一次就能改到你满意》，记得星标公众号，不然下次更新就刷不到了。</p>]]></description>
    <pubDate>Wed, 18 Mar 2026 17:35:34 +0800</pubDate>
    <dc:creator>从0至1</dc:creator>
    <guid>https://www.from0to1.cn/Converse_with_AI/xsxpzrycdgk-mgkpzfwzlz-dzgjny.html</guid>
</item>
<item>
    <title>空气质量监测与管理系统</title>
    <link>https://www.from0to1.cn/inspiration-coding/kong-qi-zhi-liang-jian-ce-yu-guan-li-xi-tong.html</link>
    <description><![CDATA[<h1>空气质量监测与管理系统</h1>
<h2>项目概述</h2>
<p>本项目是一个基于 Python Flask + Vue.js 的空气质量监测与管理系统，集成了 Scrapy 爬虫用于数据采集，支持 Spark/Hive/HDFS 大数据处理能力。系统从中国环境监测总站实时获取空气质量数据，并提供数据可视化、统计分析等功能。</p>
<hr />
<h2>技术栈</h2>
<table>
<thead>
<tr>
<th>层级</th>
<th>技术</th>
</tr>
</thead>
<tbody>
<tr>
<td>后端框架</td>
<td>Flask 1.1.2 + Flask-SQLAlchemy</td>
</tr>
<tr>
<td>前端框架</td>
<td>Vue.js 2.x</td>
</tr>
<tr>
<td>数据库</td>
<td>MySQL 5.7+</td>
</tr>
<tr>
<td>爬虫框架</td>
<td>Scrapy 2.6.3</td>
</tr>
<tr>
<td>大数据组件</td>
<td>PySpark 3.3.2 / PyHive / HDFS</td>
</tr>
<tr>
<td>认证方式</td>
<td>JWT Token</td>
</tr>
</tbody>
</table>
<hr />
<h2>项目结构</h2>
<pre><code>air/
├── python_air/                      # Python 后端项目
│   ├── api/                         # API 模块
│   │   ├── main/                    # 视图层（路由接口）
│   │   │   ├── Kongqizhiliang_v.py  # 空气质量接口
│   │   │   ├── Yonghu_v.py          # 用户管理接口
│   │   │   ├── News_v.py            # 新闻公告接口
│   │   │   ├── Newstype_v.py        # 新闻分类接口
│   │   │   ├── Storeup_v.py         # 收藏功能接口
│   │   │   ├── Syslog_v.py          # 系统日志接口
│   │   │   ├── Systemintro_v.py     # 系统简介接口
│   │   │   ├── config_v.py          # 配置管理接口
│   │   │   ├── users_v.py           # 管理员用户接口
│   │   │   └── common.py            # 通用接口
│   │   ├── models/                  # 数据模型层
│   │   │   ├── brush_model.py       # 业务数据模型
│   │   │   ├── models.py            # 基础模型类
│   │   │   ├── user_model.py        # 用户模型
│   │   │   └── config_model.py      # 配置模型
│   │   ├── templates/front/         # 前端项目
│   │   │   ├── admin/               # 后台管理系统（Vue）
│   │   │   └── front/               # 前台展示系统（Vue）
│   │   └── exts.py                  # Flask 扩展初始化
│   ├── db/                          # 数据库脚本
│   │   └── python0745x1xa.sql       # 初始化 SQL
│   ├── utils/                       # 工具模块
│   │   ├── jwt_auth.py              # JWT 认证
│   │   ├── spark_func.py            # Spark 功能
│   │   ├── hdfs_func.py             # HDFS 功能
│   │   ├── hive_func.py             # Hive 功能
│   │   └── mysqlinit.py             # MySQL 初始化
│   ├── config.ini                   # 数据库配置文件
│   ├── configs.py                   # 项目配置类
│   ├── manage.py                    # 项目管理脚本
│   ├── requirements.txt             # Python 依赖
│   └── run.py                       # 启动入口
│
├── spider/                          # Scrapy 爬虫项目
│   ├── Spider/
│   │   ├── spiders/
│   │   │   └── KongqizhiliangSpider.py  # 空气质量爬虫
│   │   ├── items.py                 # 数据容器定义
│   │   ├── pipelines.py             # 数据管道
│   │   └── settings.py              # 爬虫配置
│   ├── run.py                       # 爬虫启动脚本
│   └── requirements.txt             # 爬虫依赖
│
└── 声明.txt</code></pre>
<hr />
<h2>数据库设计</h2>
<h3>数据表说明</h3>
<table>
<thead>
<tr>
<th>表名</th>
<th>说明</th>
<th>主要字段</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>kongqizhiliang</code></td>
<td>空气质量数据</td>
<td>cityname(城市), positionname(站点), aqi, pm25, pm10, so2, no2, co, o3</td>
</tr>
<tr>
<td><code>qa565z0x_kongqizhiliang</code></td>
<td>爬虫缓存数据</td>
<td>同上（用于爬虫数据暂存）</td>
</tr>
<tr>
<td><code>yonghu</code></td>
<td>前台用户</td>
<td>yonghuzhanghao(账号), mima(密码), yonghuxingming(姓名), touxiang(头像), xingbie(性别), shoujihaoma(手机号)</td>
</tr>
<tr>
<td><code>users</code></td>
<td>后台管理员</td>
<td>username, password, image, role</td>
</tr>
<tr>
<td><code>news</code></td>
<td>通知公告</td>
<td>title, introduction, typename, content, picture, clicknum, thumbsupnum</td>
</tr>
<tr>
<td><code>newstype</code></td>
<td>公告分类</td>
<td>typename</td>
</tr>
<tr>
<td><code>storeup</code></td>
<td>收藏记录</td>
<td>userid, refid, tablename, name, type</td>
</tr>
<tr>
<td><code>syslog</code></td>
<td>系统日志</td>
<td>username, operation, method, params, time, ip</td>
</tr>
<tr>
<td><code>systemintro</code></td>
<td>系统简介</td>
<td>title, subtitle, content, picture1/2/3</td>
</tr>
<tr>
<td><code>config</code></td>
<td>轮播图配置</td>
<td>name, value, url</td>
</tr>
</tbody>
</table>
<h3>ER 关系图</h3>
<pre><code class="language-mermaid">graph TB
    A[用户 yonghu] --&gt; B[收藏 storeup]
    C[管理员 users] --&gt; D[系统日志 syslog]
    E[新闻分类 newstype] --&gt; F[新闻公告 news]
    G[空气质量 kongqizhiliang]
    H[系统简介 systemintro]
    I[轮播图配置 config]</code></pre>
<hr />
<h2>功能模块</h2>
<h3>1. 空气质量管理</h3>
<ul>
<li>数据列表展示（分页、搜索、排序）</li>
<li>数据详情查看</li>
<li>数据新增/编辑/删除</li>
<li>数据导入（Excel）</li>
<li>分组统计/按值统计/按日期统计</li>
<li>Spark 大数据分析</li>
</ul>
<h3>2. 用户管理</h3>
<ul>
<li>用户注册/登录/登出</li>
<li>密码重置</li>
<li>个人信息管理</li>
<li>JWT Token 认证</li>
</ul>
<h3>3. 新闻公告</h3>
<ul>
<li>公告列表/详情</li>
<li>分类管理</li>
<li>点击量/点赞/收藏统计</li>
</ul>
<h3>4. 系统功能</h3>
<ul>
<li>系统简介管理</li>
<li>轮播图管理</li>
<li>系统日志记录</li>
</ul>
<hr />
<h2>API 接口规范</h2>
<h3>基础路径</h3>
<pre><code>http://localhost:8080/python0745x1xa/</code></pre>
<h3>主要接口示例</h3>
<table>
<thead>
<tr>
<th>接口</th>
<th>方法</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/kongqizhiliang/page</code></td>
<td>GET</td>
<td>分页查询空气质量数据</td>
</tr>
<tr>
<td><code>/kongqizhiliang/list</code></td>
<td>GET</td>
<td>前端列表查询</td>
</tr>
<tr>
<td><code>/kongqizhiliang/info/{id}</code></td>
<td>GET</td>
<td>获取详情</td>
</tr>
<tr>
<td><code>/kongqizhiliang/save</code></td>
<td>POST</td>
<td>新增数据</td>
</tr>
<tr>
<td><code>/kongqizhiliang/update</code></td>
<td>POST</td>
<td>更新数据</td>
</tr>
<tr>
<td><code>/kongqizhiliang/delete</code></td>
<td>POST</td>
<td>删除数据</td>
</tr>
<tr>
<td><code>/kongqizhiliang/group/{columnName}</code></td>
<td>GET</td>
<td>分组统计</td>
</tr>
<tr>
<td><code>/kongqizhiliang/value/{x}/{y}</code></td>
<td>GET</td>
<td>按值统计</td>
</tr>
<tr>
<td><code>/yonghu/register</code></td>
<td>POST</td>
<td>用户注册</td>
</tr>
<tr>
<td><code>/yonghu/login</code></td>
<td>POST</td>
<td>用户登录</td>
</tr>
<tr>
<td><code>/users/login</code></td>
<td>POST</td>
<td>管理员登录</td>
</tr>
</tbody>
</table>
<hr />
<h2>爬虫说明</h2>
<h3>数据源</h3>
<ul>
<li><strong>URL</strong>: <code>https://air.cnemc.cn:18007/CityData/GetAQIDataPublishLive</code></li>
<li><strong>来源</strong>: 中国环境监测总站</li>
<li><strong>城市</strong>: 默认郑州市（可配置）</li>
</ul>
<h3>采集字段</h3>
<table>
<thead>
<tr>
<th>原始字段</th>
<th>存储字段</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>Area</td>
<td>cityname</td>
<td>城市名称</td>
</tr>
<tr>
<td>PositionName</td>
<td>positionname</td>
<td>监测站点</td>
</tr>
<tr>
<td>AQI</td>
<td>aqi</td>
<td>空气质量指数</td>
</tr>
<tr>
<td>PM2_5</td>
<td>pm25</td>
<td>PM2.5 浓度</td>
</tr>
<tr>
<td>PM10</td>
<td>pm10</td>
<td>PM10 浓度</td>
</tr>
<tr>
<td>SO2</td>
<td>so2</td>
<td>二氧化硫浓度</td>
</tr>
<tr>
<td>NO2</td>
<td>no2</td>
<td>二氧化氮浓度</td>
</tr>
<tr>
<td>CO</td>
<td>co</td>
<td>一氧化碳浓度</td>
</tr>
<tr>
<td>O3</td>
<td>o3</td>
<td>臭氧浓度</td>
</tr>
</tbody>
</table>
<hr />
<h2>环境部署</h2>
<h3>前置要求</h3>
<ul>
<li>Python 3.7+</li>
<li>MySQL 5.7+</li>
<li>Node.js 14+ (前端构建)</li>
<li>Redis（可选）</li>
</ul>
<h3>配置文件</h3>
<p>编辑 <code>python_air/config.ini</code>：</p>
<pre><code class="language-ini">[sql]
type=mysql
host=localhost
port=3306
user=root
passwd=123456
db=python0745x1xa
hasHadoop=hive
charset=utf8

[redis]
host=127.0.0.1
port=6379
passwd=123456</code></pre>
<hr />
<h2>快速启动</h2>
<h3>方式一：一键安装</h3>
<pre><code class="language-bash"># 进入项目目录
cd python_air

# 双击运行
安装全部.bat</code></pre>
<h3>方式二：手动安装</h3>
<h4>1. 安装 Python 依赖</h4>
<pre><code class="language-bash">cd python_air
pip install -r requirements.txt</code></pre>
<h4>2. 初始化数据库</h4>
<pre><code class="language-bash"># 创建数据库
python manage.py initsql --ini config.ini

# 创建数据表
python manage.py create_all</code></pre>
<h4>3. 启动后端服务</h4>
<pre><code class="language-bash">python manage.py run</code></pre>
<h4>4. 访问系统</h4>
<ul>
<li><strong>前台</strong>: <a href="http://localhost:8123">http://localhost:8123</a></li>
<li><strong>后台</strong>: <a href="http://localhost:8124">http://localhost:8124</a></li>
<li><strong>API</strong>: <a href="http://localhost:8080">http://localhost:8080</a></li>
</ul>
<h3>运行爬虫</h3>
<pre><code class="language-bash">cd spider
pip install -r requirements.txt
python run.py</code></pre>
<hr />
<h2>默认账号</h2>
<table>
<thead>
<tr>
<th>角色</th>
<th>账号</th>
<th>密码</th>
</tr>
</thead>
<tbody>
<tr>
<td>管理员</td>
<td>admin</td>
<td>admin</td>
</tr>
<tr>
<td>普通用户</td>
<td>用户账号1</td>
<td>123456</td>
</tr>
</tbody>
</table>
<hr />
<h2>项目流程图</h2>
<pre><code class="language-mermaid">graph TB
    subgraph 数据采集层
        A[Scrapy爬虫] --&gt; B[中国环境监测总站API]
        A --&gt; C[MySQL数据库]
    end

    subgraph 后端服务层
        D[Flask API服务] --&gt; C
        D --&gt; E[JWT认证]
        D --&gt; F[Spark分析]
        F --&gt; G[HDFS存储]
    end

    subgraph 前端展示层
        H[Vue后台管理] --&gt; D
        I[Vue前台展示] --&gt; D
    end

    subgraph 用户
        J[管理员] --&gt; H
        K[普通用户] --&gt; I
    end</code></pre>
<hr />
<h2>系统架构图</h2>
<pre><code class="language-mermaid">graph LR
    subgraph 客户端
        A[浏览器]
    end

    subgraph 前端
        B[Vue Admin 8124]
        C[Vue Front 8123]
    end

    subgraph 后端
        D[Flask API 8080]
    end

    subgraph 数据层
        E[MySQL]
        F[Redis]
        G[HDFS]
    end

    subgraph 大数据
        H[Spark]
        I[Hive]
    end

    subgraph 数据源
        J[环境监测总站]
        K[Scrapy爬虫]
    end

    A --&gt; B
    A --&gt; C
    B --&gt; D
    C --&gt; D
    D --&gt; E
    D --&gt; F
    D --&gt; H
    H --&gt; G
    H --&gt; I
    K --&gt; J
    K --&gt; E</code></pre>
<hr />
<h2>业务流程</h2>
<h3>空气质量数据流程</h3>
<pre><code class="language-mermaid">graph TB
    A[开始] --&gt; B[Scrapy爬虫启动]
    B --&gt; C[请求环境监测API]
    C --&gt; D{数据获取成功?}
    D --&gt;|是| E[解析JSON数据]
    D --&gt;|否| F[使用缓存数据]
    E --&gt; G[数据清洗过滤]
    G --&gt; H[存入MySQL]
    F --&gt; H
    H --&gt; I[Flask API读取]
    I --&gt; J[Spark统计分析]
    J --&gt; K[结果存入HDFS]
    I --&gt; L[前端展示]
    K --&gt; L
    L --&gt; M[结束]</code></pre>
<h3>用户操作流程</h3>
<pre><code class="language-mermaid">graph TB
    A[用户访问系统] --&gt; B{是否登录?}
    B --&gt;|否| C[登录/注册]
    B --&gt;|是| D[进入主页]
    C --&gt; E[JWT Token生成]
    E --&gt; D
    D --&gt; F[浏览空气质量数据]
    D --&gt; G[查看新闻公告]
    D --&gt; H[收藏内容]
    F --&gt; I[数据统计图表]
    G --&gt; J[点赞/评论]
    H --&gt; K[我的收藏]</code></pre>
<hr />
<h2>开发说明</h2>
<h3>新增接口步骤</h3>
<ol>
<li>在 <code>api/models/brush_model.py</code> 定义数据模型</li>
<li>在 <code>api/main/</code> 目录创建对应的 <code>xxx_v.py</code> 视图文件</li>
<li>前端对应添加路由和页面</li>
</ol>
<h3>代码规范</h3>
<ul>
<li>后端遵循 PEP8 规范</li>
<li>前端使用 ESLint 规范</li>
<li>所有接口返回统一 JSON 格式：
<pre><code class="language-json">{
"code": 0,
"msg": "success",
"data": {}
}</code></pre></li>
</ul>
<hr />
<h2>常见问题</h2>
<h3>Q: 数据库连接失败</h3>
<p>检查 <code>config.ini</code> 配置是否正确，确保 MySQL 服务已启动。</p>
<h3>Q: 爬虫无法获取数据</h3>
<p>检查网络连接，API 地址可能需要科学上网或更换数据源。</p>
<h3>Q: 前端无法访问</h3>
<p>确保后端服务已启动，检查跨域配置。</p>
<hr />
<h2>版本信息</h2>
<ul>
<li><strong>版本</strong>: 1.0</li>
<li><strong>数据库</strong>: python0745x1xa</li>
<li><strong>更新日期</strong>: 2024-04</li>
</ul>
<hr />
<h2>联系方式</h2>
<p>如有问题，欢迎通过以下渠道联系：</p>
<ul>
<li><strong>抖音</strong>: 从 0 至 1</li>
<li><strong>公众号</strong>: 从 0 至 1</li>
<li><strong>博客</strong>: <a href="https://www.from0to1.cn">www.from0to1.cn</a></li>
<li><strong>GitHub</strong>: <a href="https://github.com/mtnljbydd">https://github.com/mtnljbydd</a></li>
</ul>]]></description>
    <pubDate>Wed, 28 Jan 2026 09:40:02 +0800</pubDate>
    <dc:creator>从0至1</dc:creator>
    <guid>https://www.from0to1.cn/inspiration-coding/kong-qi-zhi-liang-jian-ce-yu-guan-li-xi-tong.html</guid>
</item>
<item>
    <title>C语言链表实战：从数组转链表求和到问题解决的完整笔记</title>
    <link>https://www.from0to1.cn/c-language/cyylbsz-cszzlbqhdwtjjdwzbj.html</link>
    <description><![CDATA[<h1>C 语言链表实战：从数组转链表求和到问题解决的完整笔记</h1>
<h2>引言</h2>
<p>作为 C 语言初学者，在学习<strong>结构体、指针、链表</strong>这三大核心知识点时，很容易遇到「语法报错」「逻辑阻断」「内存泄漏」等问题。本文以「数组转链表并求和」为实战场景，梳理了从需求分析到代码落地的完整过程 —— 包括初始代码的报错排查、核心知识点拆解、最终可运行代码实现，以及初学者高频易错点总结。通过本文，你不仅能掌握链表的基础操作，还能学会如何高效排查 C 语言中指针和动态内存相关的常见问题。</p>
<h2>一、问题提出：需求与初始困境</h2>
<h3>1. 核心需求</h3>
<ul>
<li>
<p>输入：第一行输入正整数<code>n</code>（数组长度），第二行输入<code>n</code>个正整数（数组元素）；</p>
</li>
<li>
<p>处理：将数组转换为<strong>单向链表</strong>（每个节点存储数组一个元素）；</p>
</li>
<li>
<p>输出：遍历链表，累加所有节点值并输出总和。</p>
</li>
</ul>
<h3>2. 初始报错与困境</h3>
<p>在编写代码时，遇到了 3 类典型错误：</p>
<ol>
<li>
<p>编译报错：<code>表达式必须包含算术类型</code>「<code>+=</code>：int 与 ListNode * 的间接级别不同」；</p>
</li>
<li>
<p>逻辑错误：运行后输出<code>0</code>，链表构建失败；</p>
</li>
<li>
<p>潜在风险：动态内存未正确释放，存在内存泄漏隐患。</p>
</li>
</ol>
<h2>二、核心知识点拆解：从基础到实战</h2>
<h3>（一）链表的基础：结构体定义</h3>
<p>链表的核心是<strong>节点结构体</strong>，每个节点包含「数据域」（存储数据）和「指针域」（连接下一个节点），这是链表链式存储的基础。</p>
<pre><code>// 定义链表节点结构体（typedef简化结构体名称）

typedef struct ListNode {

&amp;#x20;   int val;                // 数据域：存储整数（核心数据）

&amp;#x20;   struct ListNode\* next;  // 指针域：指向同类型节点（实现链式连接）

} ListNode;  // 别名ListNode，替代冗长的struct ListNode</code></pre>
<h4>关键术语说明：</h4>
<ul>
<li>
<p><strong>结构体</strong>：C 语言中自定义数据类型，用于封装不同类型的数据（此处整合<code>int</code>和指针）；</p>
</li>
<li>
<p><strong>指针域</strong>：<code>struct ListNode* next</code>是核心，通过指针指向后续节点，形成「链状结构」；</p>
</li>
<li>
<p><code>typedef</code>：仅用于简化名称，不改变结构体本质，初学者需注意结构体内部指针仍需写<code>struct ListNode*</code>。</p>
</li>
</ul>
<h3>（二）动态内存分配：节点创建的核心</h3>
<p>链表节点需要在程序运行时动态创建（长度由用户输入决定），必须使用<code>malloc</code>分配内存，且需手动检查分配结果。</p>
<pre><code>// 辅助函数：创建单个链表节点（返回节点指针）

ListNode\* createNode(int val) {

&amp;#x20;   // 1. 分配内存：申请ListNode大小的空间，强制转换为ListNode\*类型

&amp;#x20;   ListNode\* newNode = (ListNode\*)malloc(sizeof(ListNode));

&amp;#x20;  &amp;#x20;

&amp;#x20;   // 2. 健壮性检查：malloc分配失败返回NULL，避免程序崩溃

&amp;#x20;   if (newNode == NULL) {

&amp;#x20;       printf("错误：内存分配失败！\n");

&amp;#x20;       exit(1);  // 异常退出（退出码1表示非正常终止）

&amp;#x20;   }

&amp;#x20;  &amp;#x20;

&amp;#x20;   // 3. 初始化节点：数据域赋值，指针域置NULL（无后续节点）

&amp;#x20;   newNode-&gt;val = val;   // 结构体指针用-&gt;访问成员（区别于变量的.）

&amp;#x20;   newNode-&gt;next = NULL;

&amp;#x20;  &amp;#x20;

&amp;#x20;   return newNode;  // 返回创建好的节点指针

}</code></pre>
<h4>关键知识点：</h4>
<ul>
<li>
<p><code>malloc</code><strong>函数</strong>：动态分配内存，返回<code>void*</code>，必须强制转换为目标指针类型；</p>
</li>
<li>
<p><strong>内存泄漏</strong>：动态分配的内存需用<code>free</code>释放，否则会一直占用系统内存；</p>
</li>
<li>
<p><code>-&gt;</code><strong>运算符</strong>：结构体指针访问成员的唯一方式，初学者易混淆<code>-&gt;</code>和<code>.</code>（变量用<code>.</code>，指针用<code>-&gt;</code>）。</p>
</li>
</ul>
<h3>（三）链表构建：从数组到链式结构</h3>
<p>链表构建的核心逻辑：先创建「头节点」（链表入口），再循环创建后续节点，通过<code>next</code>指针连接成链。</p>
<pre><code>// 函数：根据数组构建单向链表（输入数组指针+长度，返回链表头节点）

ListNode\* buildLinkedList(int\* nums, int len) {

&amp;#x20;   // 入参有效性检查：数组为空或长度无效时返回NULL

&amp;#x20;   if (nums == NULL || len ) {

&amp;#x20;       printf("输入无效！\n");

&amp;#x20;       return NULL;

&amp;#x20;   }

&amp;#x20;  &amp;#x20;

&amp;#x20;   // 1. 创建头节点：以数组第一个元素为数据（链表入口，不可丢失）

&amp;#x20;   ListNode\* head = createNode(nums\[0]);

&amp;#x20;   // 2. 当前节点指针：跟踪链表尾部，避免每次遍历找尾部

&amp;#x20;   ListNode\* current = head;

&amp;#x20;  &amp;#x20;

&amp;#x20;   // 3. 循环创建后续节点（从数组第2个元素开始，i=1）

&amp;#x20;   for (int i = 1; i&amp;#x20;

&amp;#x20;       current-&gt;next = createNode(nums\[i]);  // 连接新节点

&amp;#x20;       current = current-&gt;next;              // 移动到新尾部

&amp;#x20;   }

&amp;#x20;  &amp;#x20;

&amp;#x20;   return head;  // 返回链表头节点，供后续遍历使用

}</code></pre>
<h4>逻辑拆解：</h4>
<ol>
<li>
<p>头节点是链表的「入口」，丢失头节点会导致整个链表无法访问；</p>
</li>
<li>
<p><code>current</code>指针的作用是「跟踪尾部」，避免重复遍历链表，提升效率；</p>
</li>
<li>
<p>循环起始索引<code>i=1</code>：头节点已使用<code>nums[0]</code>，后续节点从数组第二个元素开始。</p>
</li>
</ol>
<h3>（四）链表遍历与求和：指针移动的核心</h3>
<p>遍历链表的关键是「指针移动」：从 head 开始，通过<code>current = current-&gt;next</code>遍历所有节点，累加数据域的值。</p>
<pre><code>// 函数：遍历链表求和（输入头节点，返回总和）

int calculateSum(ListNode\* head) {

&amp;#x20;   int total = 0;          // 总和初始化为0

&amp;#x20;   ListNode\* current = head;  // 遍历指针从头部开始

&amp;#x20;  &amp;#x20;

&amp;#x20;   // 循环条件：current不为NULL（未遍历到尾部）

&amp;#x20;   while (current != NULL) {

&amp;#x20;       total += current-&gt;val;  // 累加当前节点的数据域（核心：val而非next）

&amp;#x20;       current = current-&gt;next;  // 指针移动到下一个节点（不可遗漏）

&amp;#x20;   }

&amp;#x20;  &amp;#x20;

&amp;#x20;   return total;

}</code></pre>
<h4>关键提醒：</h4>
<ul>
<li>
<p>初学者易犯错误：<code>total += current-&gt;next</code>（误将指针当作数据累加），正确应为<code>current-&gt;val</code>；</p>
</li>
<li>
<p>指针移动不可遗漏：缺少<code>current = current-&gt;next</code>会导致死循环。</p>
</li>
</ul>
<h3>（五）内存释放：避免内存泄漏</h3>
<p>C 语言无自动内存回收，动态分配的数组和链表节点必须手动释放，释放链表时需逐个节点处理。</p>
<pre><code>// 函数：释放链表所有节点内存

void freeLinkedList(ListNode\* head) {

&amp;#x20;   ListNode\* current = head;

&amp;#x20;   while (current != NULL) {

&amp;#x20;       ListNode\* temp = current;  // 临时保存当前节点（避免移动后丢失）

&amp;#x20;       current = current-&gt;next;  // 先移动到下一个节点

&amp;#x20;       free(temp);  // 释放当前节点内存

&amp;#x20;   }

}</code></pre>
<h4>释放逻辑：</h4>
<ol>
<li>
<p>必须先移动指针再释放：直接<code>free(current)</code>会导致后续节点无法访问；</p>
</li>
<li>
<p>数组内存释放：<code>free(nums)</code>（数组是动态分配的，需单独释放）。</p>
</li>
</ol>
<h2>三、完整可运行代码（含详细注释）</h2>
<pre><code>\#define \_CRT\_SECURE\_NO\_WARNINGS

\#include #include // 1. 定义链表节点结构体

typedef struct ListNode {

&amp;#x20;   int val;                // 数据域：存储节点值

&amp;#x20;   struct ListNode\* next;  // 指针域：指向后续节点

} ListNode;

// 2. 创建单个节点

ListNode\* createNode(int val) {

&amp;#x20;   ListNode\* newNode = (ListNode\*)malloc(sizeof(ListNode));

&amp;#x20;   if (newNode == NULL) {

&amp;#x20;       printf("错误：内存分配失败！\n");

&amp;#x20;       exit(1);

&amp;#x20;   }

&amp;#x20;   newNode-&gt;val = val;

&amp;#x20;   newNode-&gt;next = NULL;

&amp;#x20;   return newNode;

}

// 3. 读取用户输入（返回数组指针，长度通过指针返回）

int\* readInput(int\* len\_ptr) {

&amp;#x20;   int n;

&amp;#x20;   scanf("%d", \&amp;n);

&amp;#x20;   if (n&amp;#x20;

&amp;#x20;       printf("错误：数组长度必须大于0！\n");

&amp;#x20;       \*len\_ptr = 0;

&amp;#x20;       return NULL;

&amp;#x20;   }

&amp;#x20;   \*len\_ptr = n;

&amp;#x20;  &amp;#x20;

&amp;#x20;   int\* nums = (int\*)malloc(n \* sizeof(int));

&amp;#x20;   if (nums == NULL) {

&amp;#x20;       printf("错误：数组内存分配失败！\n");

&amp;#x20;       \*len\_ptr = 0;

&amp;#x20;       return NULL;

&amp;#x20;   }

&amp;#x20;  &amp;#x20;

&amp;#x20;   for (int i = 0; i ; i++) {

&amp;#x20;       scanf("%d", \&amp;nums\[i]);

&amp;#x20;   }

&amp;#x20;   return nums;

}

// 4. 构建链表

ListNode\* buildLinkedList(int\* nums, int len) {

&amp;#x20;   if (nums == NULL || len  {

&amp;#x20;       printf("输入无效！\n");

&amp;#x20;       return NULL;

&amp;#x20;   }

&amp;#x20;  &amp;#x20;

&amp;#x20;   ListNode\* head = createNode(nums\[0]);

&amp;#x20;   ListNode\* current = head;

&amp;#x20;   for (int i = 1; i &lt; len; i++) {

&amp;#x20;       current-&gt;next = createNode(nums\[i]);

&amp;#x20;       current = current-&gt;next;

&amp;#x20;   }

&amp;#x20;   return head;

}

// 5. 遍历求和

int calculateSum(ListNode\* head) {

&amp;#x20;   int total = 0;

&amp;#x20;   ListNode\* current = head;

&amp;#x20;   while (current != NULL) {

&amp;#x20;       total += current-&gt;val;

&amp;#x20;       current = current-&gt;next;

&amp;#x20;   }

&amp;#x20;   return total;

}

// 6. 释放内存

void freeLinkedList(ListNode\* head) {

&amp;#x20;   ListNode\* current = head;

&amp;#x20;   while (current != NULL) {

&amp;#x20;       ListNode\* temp = current;

&amp;#x20;       current = current-&gt;next;

&amp;#x20;       free(temp);

&amp;#x20;   }

}

// 主函数：程序入口

int main() {

&amp;#x20;   int len;

&amp;#x20;   int\* nums = readInput(\&amp;len);

&amp;#x20;   if (nums == NULL) {

&amp;#x20;       printf("输入无效！\n");

&amp;#x20;       return 1;

&amp;#x20;   }

&amp;#x20;  &amp;#x20;

&amp;#x20;   ListNode\* head = buildLinkedList(nums, len);

&amp;#x20;   if (head == NULL) {

&amp;#x20;       printf("链表构建失败！\n");

&amp;#x20;       free(nums);

&amp;#x20;       return 1;

&amp;#x20;   }

&amp;#x20;  &amp;#x20;

&amp;#x20;   int sum = calculateSum(head);

&amp;#x20;   printf("%d\n", sum);

&amp;#x20;  &amp;#x20;

&amp;#x20;   // 释放所有动态内存

&amp;#x20;   free(nums);

&amp;#x20;   freeLinkedList(head);

&amp;#x20;  &amp;#x20;

&amp;#x20;   return 0;

}</code></pre>
<h3>运行示例：</h3>
<pre><code>输入：

3

1 2 3

输出：

6</code></pre>
<h2>四、初学者高频易错点汇总</h2>
<h3>1. 类型不匹配（编译报错）</h3>
<ul>
<li>
<p>错误代码：<code>total += current-&gt;next</code>；</p>
</li>
<li>
<p>原因：<code>total</code>是<code>int</code>类型，<code>current-&gt;next</code>是<code>ListNode*</code>指针类型，无法直接累加；</p>
</li>
<li>
<p>修正：<code>total += current-&gt;val</code>（累加数据域而非指针）。</p>
</li>
</ul>
<h3>2. 函数提前返回（逻辑阻断）</h3>
<ul>
<li>错误代码：</li>
</ul>
<pre><code>ListNode\* buildLinkedList(int\* nums, int len) {

&amp;#x20;   if (nums == NULL || len 0) {

&amp;#x20;       printf("输入无效！\n");

&amp;#x20;   }

&amp;#x20;   return NULL;  // 无论入参是否有效，都返回NULL

&amp;#x20;   // 后续链表构建代码永远无法执行

}</code></pre>
<ul>
<li>
<p>原因：<code>return NULL</code>未包含在<code>if</code>语句块中，导致链表构建逻辑被阻断；</p>
</li>
<li>
<p>修正：用<code>{}</code>包裹<code>if</code>逻辑，仅入参无效时返回<code>NULL</code>。</p>
</li>
</ul>
<h3>3. 循环索引错误（节点重复 / 遗漏）</h3>
<ul>
<li>
<p>错误代码：`for (int i = 0; i （构建链表时）；</p>
</li>
<li>
<p>原因：头节点已使用<code>nums[0]</code>，循环从<code>i=0</code>开始会重复创建头节点；</p>
</li>
<li>
<p>修正：<code>for (int i = 1; i  i++)</code>。</p>
</li>
</ul>
<h3>4. 内存泄漏（隐性风险）</h3>
<ul>
<li>
<p>错误：未调用<code>free</code>释放<code>nums</code>或链表节点；</p>
</li>
<li>
<p>危害：长期运行会导致内存不足，程序崩溃；</p>
</li>
<li>
<p>修正：所有<code>malloc</code>分配的内存，必须对应<code>free</code>。</p>
</li>
</ul>
<h3>5. 指针操作错误（死循环 / 野指针）</h3>
<ul>
<li>
<p>错误 1：遍历链表时缺少<code>current = current-&gt;next</code>（死循环）；</p>
</li>
<li>
<p>错误 2：释放节点时先<code>free(current)</code>再移动指针（野指针）；</p>
</li>
<li>
<p>修正：遵循「先移动，后释放」原则，用临时指针保存当前节点。</p>
</li>
</ul>
<h2>五、总结与核心收获</h2>
<p>本次实战围绕「数组转链表求和」，串联了 C 语言三大核心知识点：</p>
<ol>
<li>
<p><strong>结构体</strong>：链表节点的基础，封装数据域和指针域；</p>
</li>
<li>
<p><strong>指针</strong>：链表连接、遍历的核心，需掌握<code>-&gt;</code>访问、指针移动、临时指针使用；</p>
</li>
<li>
<p><strong>动态内存管理</strong>：<code>malloc</code>分配与<code>free</code>释放的配对使用，避免内存泄漏。</p>
</li>
</ol>
<p>核心收获：链表的本质是「通过指针连接的结构体节点」，关键在于「头节点保护」「指针移动逻辑」「内存管理」，这三大点也是 C 语言复杂数据结构的基础。</p>
<h2>六、拓展建议：后续学习方向</h2>
<ol>
<li>
<p><strong>链表进阶</strong>：学习双向链表、循环链表，实现插入、删除、反转等操作；</p>
</li>
<li>
<p><strong>关联知识点</strong>：深入学习指针数组、函数指针，理解内存布局（栈区、堆区）；</p>
</li>
<li>
<p><strong>工具使用</strong>：</p>
</li>
</ol>
<ul>
<li>
<p>用 GitHub 管理代码，记录不同版本的错误修正过程；</p>
</li>
<li>
<p>学习 GDB 调试技巧，排查指针相关的隐性错误；</p>
</li>
</ul>
<ol>
<li><strong>实战升级</strong>：实现链表排序、链表合并，或用链表解决实际问题（如多项式加法）。</li>
</ol>
<h2>学习小贴士</h2>
<ol>
<li>
<p><strong>逐函数测试</strong>：编写每个函数后，单独测试功能（如<code>createNode</code>创建节点后，打印<code>val</code>验证）；</p>
</li>
<li>
<p><strong>重视注释</strong>：不仅要注释代码功能，还要标注「为什么这么写」（如临时指针的作用）；</p>
</li>
<li>
<p><strong>画图辅助</strong>：链表问题可手绘节点连接图，清晰展示指针移动和节点关系；</p>
</li>
<li>
<p><strong>错题记录</strong>：将编译报错、逻辑错误分类记录，标注错误原因和修正方法，形成个人错题集。</p>
</li>
</ol>
<p>通过「实战 - 报错 - 排查 - 总结」的闭环学习，能快速掌握 C 语言中指针和链表的核心逻辑，为后续学习更复杂的数据结构（如树、图）打下基础。</p>
<h2>个人矩阵</h2>
<blockquote>
<ul>
<li>抖音账号：从 0 至 1（日常分享实操、效率工具教程）</li>
<li>微信公众号：从 0 至 1（可通过该渠道获取完整代码包及EXE程序）</li>
<li>博客网站：<a href="https://www.from0to1.cn">www.from0to1.cn</a>（持续更新实战教程、技术干货内容）</li>
<li>GitHub账号：<a href="https://github.com/mtnljbydd">https://github.com/mtnljbydd</a>（开源更多实用工具脚本及项目工程）</li>
</ul>
</blockquote>]]></description>
    <pubDate>Tue, 27 Jan 2026 16:54:46 +0800</pubDate>
    <dc:creator>从0至1</dc:creator>
    <guid>https://www.from0to1.cn/c-language/cyylbsz-cszzlbqhdwtjjdwzbj.html</guid>
</item>
<item>
    <title>【C语言进阶】手把手教你实现“双链表求和”：从数组到链表的思维跃迁</title>
    <link>https://www.from0to1.cn/c-language/cyyjj-sbsjnsx-slbqh-cszdlbdswyq.html</link>
    <description><![CDATA[<h1>【C语言进阶】手把手教你实现“双链表求和”：从数组到链表的思维跃迁</h1>
<blockquote>
<p><strong>写在前面</strong>：<br />
很多 C 语言初学者在学完指针和结构体后，面对“链表”往往一头雾水。<br />
“为什么有数组了还要链表？”<br />
“<code>malloc</code> 到底在干什么？”<br />
“指针指来指去晕死了！”</p>
<p>本文将以一道经典的<strong>“双链表求和”</strong>题目为例，不堆砌概念，而是用<strong>形象的比喻</strong>和<strong>工程化的代码</strong>，带你彻底攻克链表难关。特别针对 Visual Studio 用户，提供了独家的避坑指南。</p>
</blockquote>
<hr />
<h2>目录</h2>
<ol>
<li><a href="#1-题目解析">题目解析：此“双”非彼“双”</a></li>
<li><a href="#2-核心概念">核心概念：像“寻宝游戏”一样的链表</a></li>
<li><a href="#3-步步为营">步步为营：手写链表构建（尾插法详解）</a></li>
<li><a href="#4-核心逻辑">核心逻辑：双指针同步遍历</a></li>
<li><a href="#5-环境避坑">环境避坑：Visual Studio 的“坏脾气”</a></li>
<li><a href="#6-完整源码">完整源码（可直接运行）</a></li>
<li><a href="#7-总结与思考">总结与思考</a></li>
</ol>
<hr />
<p><a id="1-题目解析"></a></p>
<h2>1. 题目解析：此“双”非彼“双”</h2>
<p>首先，我们要澄清一个极易混淆的概念。</p>
<ul>
<li><strong>数据结构中的“双向链表” (Doubly Linked List)</strong>：每个节点有两个指针，一个指前 (<code>prev</code>)，一个指后 (<code>next</code>)。</li>
<li><strong>本题的“双链表”</strong>：指的是 <strong>“两个” 单向链表 (Two Singly Linked Lists)</strong>。</li>
</ul>
<p><strong>📝 任务描述</strong>：</p>
<ol>
<li><strong>输入</strong>：一个整数 <code>n</code>，和两个长度为 <code>n</code> 的数组 <code>A</code> 和 <code>B</code>。</li>
<li><strong>转换</strong>：把数组 <code>A</code> 变成链表 <code>ListA</code>，数组 <code>B</code> 变成链表 <code>ListB</code>。</li>
<li><strong>计算</strong>：把 <code>ListA</code> 里每个节点的值，加到 <code>ListB</code> 对应节点上。</li>
<li><strong>输出</strong>：打印计算后的 <code>ListB</code>。</li>
</ol>
<p><strong>示例</strong>：</p>
<blockquote>
<p>数组 A: <code>[1, 2, 3]</code><br />
数组 B: <code>[10, 20, 30]</code></p>
<p><strong>结果</strong>： <code>11 22 33</code> (即 1+10, 2+20, 3+30)</p>
</blockquote>
<hr />
<p><a id="2-核心概念"></a></p>
<h2>2. 核心概念：像“寻宝游戏”一样的链表</h2>
<p>为什么要费劲把数组转成链表？这不仅仅是做题，而是为了理解<strong>内存</strong>。</p>
<h3>🚂 数组 (Array)：电影院的座位</h3>
<p>数组就像电影院的一排座位。</p>
<ul>
<li><strong>特点</strong>：座位是连在一起的。</li>
<li><strong>优势</strong>：你想找第 5 个座位，直接走过去就行（随机访问快）。</li>
<li><strong>劣势</strong>：如果座位满了，想加个座？不行，得把整个电影院拆了重建（扩容成本高）。</li>
</ul>
<h3>🗺️ 链表 (Linked List)：寻宝游戏</h3>
<p>链表就像一场寻宝游戏。</p>
<ul>
<li><strong>特点</strong>：线索散落在城市的各个角落（内存不连续）。</li>
<li><strong>结构</strong>：每个线索点（<strong>节点</strong>）都有两样东西：
<ol>
<li><strong>宝箱</strong>（<code>val</code>）：存放的数据。</li>
<li><strong>下一站的地址</strong>（<code>next</code>）：指向下一个线索在哪里。</li>
</ol></li>
<li><strong>优势</strong>：想加个线索？随便找个空地放宝箱，把上一个线索的地址改一下指向这里就行（动态扩容快）。</li>
<li><strong>劣势</strong>：想找第 5 个线索？必须从第 1 个开始顺藤摸瓜（查找慢）。</li>
</ul>
<p><strong>C 语言中的定义</strong>：</p>
<pre><code class="language-c">typedef struct ListNode {
    int val;                // 宝箱：存数值
    struct ListNode* next;  // 纸条：存下一个节点的地址
} ListNode;</code></pre>
<hr />
<p><a id="3-步步为营"></a></p>
<h2>3. 步步为营：手写链表构建（尾插法详解）</h2>
<p>构建链表是新手的第一个噩梦。最常用的方法是<strong>尾插法</strong>，因为它能保持元素的顺序（输入 1,2,3 -&gt; 链表 1,2,3）。</p>
<p>如果不使用尾指针，每插入一个元素都要从头跑到尾，效率是 $O(N^2)$。<br />
<strong>使用尾指针 (<code>tail</code>)，效率提升为 $O(N)$。</strong></p>
<h3>🔧 算法图解</h3>
<p>假设我们要插入数组 <code>[10, 20]</code>。</p>
<p><strong>第一步：创建头节点（基地）</strong><br />
我们先用 <code>malloc</code> 申请第一个节点，存入 <code>10</code>。<br />
此时，头指针 <code>head</code> 和尾指针 <code>tail</code> 都指向它。</p>
<pre><code class="language-text">      head
       |
       v
    +------+
    |  10  |  &lt;-- tail
    +------+</code></pre>
<p><strong>第二步：插入新节点 20</strong></p>
<ol>
<li><code>malloc</code> 一个新节点，存入 <code>20</code>。</li>
<li>让当前 <code>tail</code>（也就是节点 10）的 <code>next</code> 指向新节点。</li>
<li><strong>关键点</strong>：把 <code>tail</code> 标签移动到新节点上。
<pre><code class="language-text">  head
   |
   v
+------+      +------+
|  10  | ---&gt; |  20  |
+------+      +------+
                 ^
                 |
                tail (更新到这里)</code></pre></li>
</ol>
<h3>💻 代码实现片段</h3>
<pre><code class="language-c">ListNode* createList(int* arr, int n) {
    if (n &lt;= 0) return NULL;

    // 1. 创建头节点
    ListNode* head = (ListNode*)malloc(sizeof(ListNode));
    head-&gt;val = arr[0];
    head-&gt;next = NULL;

    // 2. 初始化尾指针
    ListNode* tail = head;

    // 3. 循环创建后续节点
    for (int i = 1; i &lt; n; i++) {
        ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
        newNode-&gt;val = arr[i];
        newNode-&gt;next = NULL;

        tail-&gt;next = newNode; // 旧尾巴指向新节点
        tail = newNode;       // 尾指针移动到新节点
    }

    return head;
}</code></pre>
<hr />
<p><a id="4-核心逻辑"></a></p>
<h2>4. 核心逻辑：双指针同步遍历</h2>
<p>有了两个链表 <code>ListA</code> 和 <code>ListB</code>，求和逻辑就非常简单了。我们用两个指针 <code>pA</code> 和 <code>pB</code> 同时出发。</p>
<pre><code class="language-c">void addListToB(ListNode* listA, ListNode* listB) {
    // 只要两个链表都没走到头
    while (listA != NULL &amp;&amp; listB != NULL) {
        // 把 A 的值加到 B 上
        listB-&gt;val += listA-&gt;val; 

        // 两个人同时往前走一步
        listA = listA-&gt;next;
        listB = listB-&gt;next;
    }
}</code></pre>
<blockquote>
<p><strong>思考</strong>：如果两个链表长度不一样怎么办？<br />
目前的代码会停在短链表的末尾。在实际的大数加法中，通常需要处理剩余的节点和进位（Carry）。</p>
</blockquote>
<hr />
<p><a id="5-环境避坑"></a></p>
<h2>5. 环境避坑：Visual Studio 的“坏脾气”</h2>
<p>很多同学在 VS 中写 C 语言会遇到报错，这里总结两个最常见的问题。</p>
<h3>🔴 坑 1：变长数组 (VLA) 报错</h3>
<p><strong>错误写法</strong>：</p>
<pre><code class="language-c">int n;
scanf("%d", &amp;n);
int arr[n]; // VS 报错：表达式必须含有常量值</code></pre>
<p><strong>原因</strong>：VS 的 MSVC 编译器默认遵循旧标准 (C89)，不支持用变量定义数组长度。<br />
<strong>解决</strong>：使用 <code>malloc</code> 动态分配。</p>
<pre><code class="language-c">int* arr = (int*)malloc(n * sizeof(int));
// ... 使用完记得 free(arr)</code></pre>
<h3>🔴 坑 2：scanf 安全警告</h3>
<p><strong>报错</strong>：<code>error C4996: 'scanf': This function or variable may be unsafe...</code><br />
<strong>原因</strong>：微软觉得 <code>scanf</code> 容易造成缓冲区溢出，推荐用 <code>scanf_s</code>。但 <code>scanf_s</code> 是微软特有的，不跨平台。<br />
<strong>解决</strong>：在代码文件的<strong>最第一行</strong>（必须是第一行）加上：</p>
<pre><code class="language-c">#define _CRT_SECURE_NO_WARNINGS</code></pre>
<hr />
<p><a id="6-完整源码"></a></p>
<h2>6. 完整源码（可直接运行）</h2>
<p>复制以下代码到 Visual Studio 的 <code>.c</code> 文件中即可运行。</p>
<pre><code class="language-c">#define _CRT_SECURE_NO_WARNINGS // 1. 屏蔽安全警告

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

// --- 数据结构定义 ---
typedef struct ListNode {
    int val;
    struct ListNode* next;
} ListNode;

// --- 函数声明 ---
ListNode* createList(int* arr, int n);
void addListToB(ListNode* listA, ListNode* listB);
void printList(ListNode* head);
void freeList(ListNode* head);

int main() {
    int n;
    // 读取数组长度
    if (scanf("%d", &amp;n) != 1) return 0;

    // 2. 动态分配数组内存 (解决 VS 不支持 int arr[n] 的问题)
    int* arrA = (int*)malloc(n * sizeof(int));
    int* arrB = (int*)malloc(n * sizeof(int));

    // 内存分配检查
    if (!arrA || !arrB) {
        printf("内存分配失败！\n");
        return 1;
    }

    // 读取输入
    for (int i = 0; i &lt; n; i++) scanf("%d", &amp;arrA[i]);
    for (int i = 0; i &lt; n; i++) scanf("%d", &amp;arrB[i]);

    // 3. 核心步骤：数组 -&gt; 链表
    ListNode* listA = createList(arrA, n);
    ListNode* listB = createList(arrB, n);

    // 4. 核心步骤：链表求和
    addListToB(listA, listB);

    // 5. 输出结果
    printList(listB);

    // 6. 善后：释放所有堆内存（养成好习惯！）
    freeList(listA);
    freeList(listB);
    free(arrA);
    free(arrB);

    return 0;
}

// --- 函数实现 ---

// 使用【尾插法】构建链表
ListNode* createList(int* arr, int n) {
    if (n &lt;= 0) return NULL;

    // 创建头节点
    ListNode* head = (ListNode*)malloc(sizeof(ListNode));
    if (!head) exit(1);
    head-&gt;val = arr[0];
    head-&gt;next = NULL;

    // 尾指针：始终指向链表最后一个节点
    ListNode* tail = head;

    for (int i = 1; i &lt; n; i++) {
        ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
        if (!newNode) exit(1);
        newNode-&gt;val = arr[i];
        newNode-&gt;next = NULL;

        // 关键操作：挂接 + 移动
        tail-&gt;next = newNode;
        tail = newNode;
    }
    return head;
}

// 链表相加逻辑
void addListToB(ListNode* listA, ListNode* listB) {
    while (listA != NULL &amp;&amp; listB != NULL) {
        listB-&gt;val += listA-&gt;val;
        listA = listA-&gt;next;
        listB = listB-&gt;next;
    }
}

// 打印链表
void printList(ListNode* head) {
    ListNode* cur = head;
    while (cur != NULL) {
        printf("%d", cur-&gt;val);
        if (cur-&gt;next != NULL) printf(" ");
        cur = cur-&gt;next;
    }
    printf("\n");
}

// 释放链表内存
void freeList(ListNode* head) {
    ListNode* cur = head;
    while (cur != NULL) {
        ListNode* temp = cur; // 先暂存
        cur = cur-&gt;next;      // 后移
        free(temp);           // 再释放
    }
}</code></pre>
<hr />
<p><a id="7-总结与思考"></a></p>
<h2>7. 总结与思考</h2>
<p>恭喜你！通过这道题，你已经掌握了 C 语言链表开发的 80% 核心套路：</p>
<ol>
<li><strong>定义结构体</strong>：<code>val</code> + <code>next</code>。</li>
<li><strong>创建链表</strong>：<code>malloc</code> + 尾插法（<code>tail</code> 指针）。</li>
<li><strong>遍历链表</strong>：<code>while(cur != NULL) { cur = cur-&gt;next; }</code>。</li>
<li><strong>内存管理</strong>：有 <code>malloc</code> 必有 <code>free</code>。</li>
</ol>
<p><strong>🚀 进阶挑战</strong>：<br />
如果题目改成“大数相加”（例如两个 100 位的整数相加），普通的 <code>int</code> 肯定存不下。<br />
这时候，链表的优势就体现出来了：<strong>每个节点存一位数字，模拟竖式加法，处理进位</strong>。<br />
这才是链表在工程中真正的威力所在！</p>
<p>希望这篇博客能帮你打通 C 语言链表的任督二脉！如果有疑问，欢迎在评论区留言讨论。👇</p>]]></description>
    <pubDate>Mon, 26 Jan 2026 15:29:39 +0800</pubDate>
    <dc:creator>从0至1</dc:creator>
    <guid>https://www.from0to1.cn/c-language/cyyjj-sbsjnsx-slbqh-cszdlbdswyq.html</guid>
</item>
</channel>
</rss>