<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://sheng-7-hys.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sheng-7-hys.github.io/" rel="alternate" type="text/html" /><updated>2026-08-07T02:42:04+00:00</updated><id>https://sheng-7-hys.github.io/feed.xml</id><title type="html">陌寒</title><subtitle>记录生活、思考</subtitle><author><name>sheng-7-hys</name></author><entry><title type="html">数据结构-线性表·栈·队列</title><link href="https://sheng-7-hys.github.io/2026/04/03/UpdatingC-LanguageRelated/" rel="alternate" type="text/html" title="数据结构-线性表·栈·队列" /><published>2026-04-03T12:14:00+00:00</published><updated>2026-04-03T12:14:00+00:00</updated><id>https://sheng-7-hys.github.io/2026/04/03/UpdatingC-LanguageRelated</id><content type="html" xml:base="https://sheng-7-hys.github.io/2026/04/03/UpdatingC-LanguageRelated/"><![CDATA[<ul>
  <li><code class="language-plaintext highlighter-rouge">free(p)</code>只释放该空间, 标记该空间为可复用，空间中数据暂时<strong>不会被清除</strong>，指针值未变，需要使用<code class="language-plaintext highlighter-rouge">p=NULL</code>，防止野指针。</li>
  <li>顺序表函数<code class="language-plaintext highlighter-rouge">clearlist(Sqlist &amp;L)</code>仅使length变为0，所存储值仍也存在，待覆盖。</li>
  <li>头插法可用于建立逆向链表</li>
  <li>就地逆转单链表方法
    <div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">LNode</span><span class="p">{</span>
  <span class="n">elemtype</span> <span class="n">data</span><span class="p">;</span>
  <span class="k">struct</span> <span class="nc">LNode</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
<span class="p">}</span><span class="n">LNode</span><span class="p">,</span><span class="o">*</span><span class="n">LinkList</span><span class="p">;</span>
<span class="n">LinkList</span> <span class="n">Reverse</span><span class="p">(</span><span class="n">Linklist</span> <span class="o">&amp;</span><span class="n">L</span><span class="p">){</span>
  <span class="k">if</span><span class="p">(</span><span class="n">L</span><span class="o">-&gt;</span><span class="n">next</span><span class="o">==</span><span class="nb">NULL</span><span class="o">||</span><span class="n">L</span><span class="o">-&gt;</span><span class="n">next</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span> <span class="k">return</span> <span class="n">L</span><span class="p">;</span>
  <span class="n">LNode</span> <span class="o">*</span><span class="n">pre</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
  <span class="n">LNode</span> <span class="o">*</span><span class="n">cur</span> <span class="o">=</span> <span class="n">L</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
  <span class="n">LNode</span> <span class="o">*</span><span class="n">next</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
  <span class="k">while</span> <span class="p">(</span><span class="n">cur</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">){</span>
      <span class="n">next</span><span class="o">=</span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>  <span class="c1">//保留直接后继</span>
      <span class="n">cur</span><span class="o">-&gt;</span><span class="n">next</span><span class="o">=</span><span class="n">pre</span><span class="p">;</span>  <span class="c1">//调转方向</span>
      <span class="n">pre</span><span class="o">=</span><span class="n">cur</span><span class="p">;</span>       <span class="c1">//后移</span>
      <span class="n">cur</span><span class="o">=</span><span class="n">next</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="n">L</span><span class="o">-&gt;</span><span class="n">next</span><span class="o">=</span><span class="n">pre</span><span class="p">;</span>  <span class="c1">//执行完循环操作后cur为原尾节的next，为NULL，pre为新的首元，令原头指针指向它</span>
<span class="p">}</span>
</code></pre></div>    </div>
    <p><code class="language-plaintext highlighter-rouge">}LNode,*LinkList;</code>相当于给<code class="language-plaintext highlighter-rouge">struct LNode</code>起了两个别名，同时使得<code class="language-plaintext highlighter-rouge">LinkList</code>直接为指向这种结构的指针，方便后续简便书写。</p>
  </li>
  <li>在涉及到某个函数调用比较方法时，可以考虑使用函数指针，方便运用不同的比较规则</li>
</ul>

<h1 id="栈分为顺序栈和链栈">栈分为顺序栈和链栈</h1>
<h2 id="sqstack">SqStack</h2>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">typedef</span> <span class="k">struct</span><span class="p">{</span>
    <span class="n">elemtype</span> <span class="o">*</span><span class="n">base</span><span class="p">;</span>   <span class="c1">//基址，站地指针</span>
    <span class="n">elemtype</span> <span class="o">*</span><span class="n">top</span><span class="p">;</span> <span class="c1">//栈顶</span>
    <span class="kt">int</span> <span class="n">size</span><span class="p">;</span>
<span class="p">}</span><span class="o">*</span><span class="n">SqStack</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">top</code>指向下一个可以入栈的空位置（约定）</p>
<h3 id="栈的应用">栈的应用</h3>
<ul>
  <li>数制转换</li>
  <li>
    <ul>
      <li>eg.10-&gt;8
        <div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">conversion</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
<span class="n">Sqstack</span><span class="o">*</span> <span class="n">s</span> <span class="o">=</span> <span class="n">InitStack</span><span class="p">(</span><span class="mi">6</span><span class="p">);</span>
<span class="k">while</span><span class="p">(</span><span class="n">n</span><span class="p">){</span>
    <span class="n">Push</span><span class="p">(</span><span class="n">s</span><span class="p">,</span><span class="n">n</span><span class="o">%</span><span class="mi">8</span><span class="p">);</span>
    <span class="n">n</span><span class="o">/=</span><span class="mi">8</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">StackEmpty</span><span class="p">(</span><span class="n">s</span><span class="p">)){</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="n">Pop</span><span class="p">(</span><span class="n">s</span><span class="p">));</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div>        </div>
      </li>
    </ul>
  </li>
  <li>
    <ul>
      <li>汉诺塔(和栈类似，只允许从顶出)
        <div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">move</span><span class="p">(</span><span class="kt">char</span> <span class="n">from</span><span class="p">,</span><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="kt">char</span> <span class="n">to</span><span class="p">){</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"Move disk %d from %c to %c</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">from</span><span class="p">,</span> <span class="n">to</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">hanoi</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="kt">char</span> <span class="n">from</span><span class="p">,</span> <span class="kt">char</span> <span class="n">to</span><span class="p">,</span> <span class="kt">char</span> <span class="n">temp</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">){</span>
    <span class="n">move</span><span class="p">(</span><span class="n">from</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">to</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">else</span><span class="p">{</span>
    <span class="n">hanoi</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">from</span><span class="p">,</span> <span class="n">temp</span><span class="p">,</span> <span class="n">to</span><span class="p">);</span>
    <span class="n">move</span><span class="p">(</span><span class="n">from</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">to</span><span class="p">);</span>
    <span class="n">hanoi</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">temp</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">from</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div>        </div>
      </li>
    </ul>
  </li>
</ul>]]></content><author><name>sheng-7-hys</name></author><category term="CPL" /><category term="C" /><summary type="html"><![CDATA[free(p)只释放该空间, 标记该空间为可复用，空间中数据暂时不会被清除，指针值未变，需要使用p=NULL，防止野指针。 顺序表函数clearlist(Sqlist &amp;L)仅使length变为0，所存储值仍也存在，待覆盖。 头插法可用于建立逆向链表 就地逆转单链表方法 typedef struct LNode{ elemtype data; struct LNode *next; }LNode,*LinkList; LinkList Reverse(Linklist &amp;L){ if(L-&gt;next==NULL||L-&gt;next-&gt;next) return L; LNode *pre = NULL; LNode *cur = L-&gt;next; LNode *next = NULL; while (cur != NULL){ next=cur-&gt;next; //保留直接后继 cur-&gt;next=pre; //调转方向 pre=cur; //后移 cur=next; } L-&gt;next=pre; //执行完循环操作后cur为原尾节的next，为NULL，pre为新的首元，令原头指针指向它 } }LNode,*LinkList;相当于给struct LNode起了两个别名，同时使得LinkList直接为指向这种结构的指针，方便后续简便书写。 在涉及到某个函数调用比较方法时，可以考虑使用函数指针，方便运用不同的比较规则]]></summary></entry></feed>