这个程序用来生成有向图十字链表的示意图,
运行效果:
使用方式:
输入图所对应的邻接矩阵,并调用函数即可,如下图:
完整代码:
function crossForm(adjMat)
if (nargin<1)
adjMat=[0 0 1 0 0 0 0 0 1;
0 0 0 0 0 1 0 0 0;
0 0 0 1 0 1 0 0 1;
1 1 1 0 0 0 1 0 0;
0 0 1 0 0 1 0 0 0;
1 0 0 1 0 0 1 0 0;
0 0 1 0 0 1 0 1 0;
1 0 0 1 0 0 1 0 1;
0 1 1 0 0 1 0 0 0];
end
%==========================================================================
f=figure;
f.MenuBar='none';
f.ToolBar='figure';
f.Position=[50 50 1200 600];
f.Name='crossForm';
f.NumberTitle='off';
ax=axes(f);
ax.Position=[0 0 1 1];
ax.XLim=[0 50];
ax.YLim=[0 19];
ax.XTick=0:1:50;
ax.YTick=0:1:19;
ax.XGrid='on';
ax.YGrid='on';
ax.XColor='none';
ax.YColor='none';
ax.YDir='reverse';
ax.TickDir='out';
hold(ax,'on');
N=size(adjMat,1);
for i=1:N
drawSq(1,2*i-1);
drawSq(2,2*i-1);
drawSq(3,2*i-1);
drawTxt(0,2*i-1,num2str(i-1),16);
drawTxt(1,2*i-1,['V',num2str(i)],12);
for j=1:N
if adjMat(i,j)==1
drawSq(5*j,2*i-1);
drawSq(5*j+1,2*i-1);
drawSq(5*j+2,2*i-1);
drawSq(5*j+3,2*i-1);
drawTxt(5*j,2*i-1,num2str(i-1),16);
drawTxt(5*j+1,2*i-1,num2str(j-1),16);
end
end
end
for i=1:N
if all(adjMat(i,:)==0)
drawTxt(3,2*i-1,'∧',15);
else
j=find(adjMat(i,:)==1,1,'last');
jf=find(adjMat(i,:)==1,1,'first');
drawArrow(3,2*i-1,5*jf,2*i-1,1);
drawTxt(5*j+3,2*i-1,'∧',15);
end
if all(adjMat(:,i)==0)
else
j=find(adjMat(:,i)==1,1,'last');
drawTxt(5*i+2,2*j-1,'∧',15);
end
end
for i=1:N
if sum(adjMat(i,:)==1)>=2
l=sum(adjMat(i,:)==1);
jSet=find(adjMat(i,:)==1);
for j=1:(l-1)
drawArrow(5*jSet(j)+3,2*i-1,5*jSet(j+1),2*i-1,1);
end
end
end
for j=1:N
if sum(adjMat(:,j)==1)>=2
l=sum(adjMat(:,j)==1);
iSet=find(adjMat(:,j)==1);
for i=1:(l-1)
drawArrow(5*j+2,2*iSet(i)-1,5*j+2,2*iSet(i+1)-1,2);
end
end
end
for i=1:N
if all(adjMat(:,i)==0)
drawTxt(2,2*i-1,'∧',15);
else
j1=adjMat(:,i)==1;
j2=(1:N)'<i;
j=find(j1&j2,1,'last');
if ~isempty(j)
drawArrow(2,2*i-1,5*i+1,2*j,3);
else
j=find(j1&(~j2),1,'first');
drawArrow(2,2*i-1,5*i+2,2*j-1,3)
end
end
end
%==========================================================================
function drawSq(x,y)
plot([x,x+1],[y,y],'LineWidth',1.5,'Color',[1,1,1].*.3);
plot([x,x+1],[y+1,y+1],'LineWidth',1.5,'Color',[1,1,1].*.3);
plot([x,x],[y,y+1],'LineWidth',1.5,'Color',[1,1,1].*.3);
plot([x+1,x+1],[y,y+1],'LineWidth',1.5,'Color',[1,1,1].*.3);
end
function drawTxt(x,y,str,size)
text(x+0.5,y+0.5,str,'Color',[1,1,1].*.3,'HorizontalAlignment',...
'center','FontSize',size,'FontWeight','bold');
end
function drawArrow(x1,y1,x2,y2,type)
switch type
case 1
annotation('arrow',[x1+0.5,x2]./50,1-[y1+0.5,y2+0.5]./19);
case 2
annotation('arrow',[x1+0.5,x2+0.5]./50,1-[y1+0.5,y2]./19);
case 3
annotation('line',[x1+0.5,x1+0.5]./50,1-[y1+0.5,y1+1+0.5]./19);
annotation('line',[x1+0.5,x2+0.5]./50,1-[y1+1+0.5,y1+1+0.5]./19);
annotation('arrow',[x2+0.5,x2+0.5]./50,1-[y1+1+0.5,y2]./19);
end
end
end