我需要画一些单链表和双链表对于一篇 CS 论文,我不知道应该使用什么软件包。据我在互联网上搜索,我似乎找不到一个好的。也许是 TiKZ/PGF?如果是这样,我需要一个小例子。
答案1
这是一个可能的解决方案TikZ
:我使用多部分矩形作为双节点,并使用链来放置节点。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,shapes.multipart,chains,arrows}
\begin{document}
\begin{tikzpicture}[list/.style={rectangle split, rectangle split parts=2,
draw, rectangle split horizontal}, >=stealth, start chain]
\node[list,on chain] (A) {12};
\node[list,on chain] (B) {99};
\node[list,on chain] (C) {37};
\node[on chain,draw,inner sep=6pt] (D) {};
\draw (D.north east) -- (D.south west);
\draw (D.north west) -- (D.south east);
\draw[*->] let \p1 = (A.two), \p2 = (A.center) in (\x1,\y2) -- (B);
\draw[*->] let \p1 = (B.two), \p2 = (B.center) in (\x1,\y2) -- (C);
\draw[*->] let \p1 = (C.two), \p2 = (C.center) in (\x1,\y2) -- (D);
\end{tikzpicture}
\end{document}
答案2
用户只需修改下面的值,保持名称不变即可。
% user defined data
\def\list{12,99,37}% list of elements
\const{_W}{2}% node width
\const{_H}{1}% node height
\const{_D}{1.5}% arrow length
\documentclass[pstricks,border=3pt]{standalone}
\usepackage{pstricks-add,fp}
\psset{dimen=middle}
\makeatletter
\newcommand\const[3][\FPeval]{% #1=method, #2=name, #3=data
\expandafter#1\csname#2\endcsname{#3}%
\begingroup\edef\x{\endgroup
\noexpand\pstVerb{/#2 \csname#2\endcsname\space def}}\x
}
\newcount\const@count
\def\FPnset#1#2{%
\const@count=\z@
\@for\next:=#2\do{\advance\const@count\@ne}%
\edef#1{\number\const@count}%
}
\makeatother
% user defined data
\def\list{12,99,37}% list of elements
\const{_W}{2}% node width
\const{_H}{1}% node height
\const{_D}{1.5}% arrow length
% internal used constants
\const[\FPnset]{_N}{\list}% number of nodes
\const{_QW}{_W/4}
\const{_HW}{_W/2}
\const{_TQW}{3*_W/4}
\const{_HH}{_H/2}
\const{_NL}{_TQW+_D}
\const{CanvasHeight}{_H}% Canvas Height = _H
\const{CanvasWidth}{_NL * _N + _HW}% Canvas Width = _NL*_N+_HW
\def\node#1#2{%
\rput(!_NL #2 mul 0){%
\psframe(!_W _H)%
\rput(!_QW _HH){#1}%
\psline(!_HW 0)(!_HW _H)%
\psline[arrowscale=2]{*->}(!_TQW _HH)(!_NL _HH)%
}}
\def\finish{%
\rput(!_NL _N mul 0){%
\psframe(!_HW _H)%
\psline(!_HW _H)%
\psline(!0 _H)(!_HW 0)%
}}
\def\DrawLinkedList{%
\begin{pspicture}(\CanvasWidth,\CanvasHeight)
\psforeach{\i}{\list}{\node{\i}{\the\psLoopIndex}}\finish
\end{pspicture}}
\begin{document}
\DrawLinkedList
\end{document}
答案3
Graphviz 是一款易于使用的工具,它允许人们指定图形而不必过多担心它们的外观。点语言很简单。这是一个单链表:
foo -> bar
bar -> baz
baz -> qux
使其双向几乎同样容易。您可以指定每个节点都是双向的。更简单的是,指定所有节点都是双向的:
edge [dir=both]
foo -> bar
bar -> baz
baz -> qux
有多种方法可以将 .dot 文件作为图形导入 LaTeX 文档中。如果您使用的是 pdflatex,请将 graphviz 附带的 dot 命令(指定输出格式 = ps)的输出通过管道传输到 ps2pdf 以生成 .pdf 文件。您可以将此 .pdf \includegraphics 添加到您的文档中。
不喜欢混乱的字体?使用点到文本将 .dot 文件转换为 latex 作为一系列 pstricks 命令。