答案1
下面的代码定义了两个命令。
\pointer[optional for position, label, ...]{name}{node pointed to}
\element[optional for position, label, ...]{name}{data}{node pointed to}
空node pointed to
对应于空指针。
\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows.meta,shadows}
\usepackage{xifthen}
% definitions for list
\newcommand\boxsize{6mm}
\tikzset
{cell/.style=
{inner sep=0pt,minimum width=\boxsize,minimum height=\boxsize,
drop shadow,fill=white},
ptr/.style={Circle-stealth,shorten <=-1.5pt}
}
\newcommand\pointer[3][]%
{\node[draw,cell,#1] (#2) {};
\ifthenelse{\isempty{#3}}%
{\draw (#2.south west)--(#2.north east);}%
{\draw[ptr] (#2.center)--(#3);}
}
\newcommand\element[4][]%
{\node[draw,cell,#1] (#2) {#3};
\node[draw,cell,xshift=\boxsize] (#2ptr) at (#2) {};
\ifthenelse{\isempty{#4}}%
{\draw (#2ptr.south west)--(#2ptr.north east);}%
{\draw[ptr] (#2ptr.center)--(#4);}
}
\begin{document}
\begin{tikzpicture}
\element{e1}{10}{}
\element[left=of e1]{e2}{20}{e1}
\element[left=of e2]{e3}{40}{e2}
\element[left=of e3]{e4}{30}{e3}
\pointer[left=5mm of e4,label=left:list]{list}{e4}
\pointer[above=5mm of e4,label=above:cur]{cur}{e4}
\pointer[above=5mm of list,label=above:prev]{prev}{}
\end{tikzpicture}
\end{document}