这个程序用来生成有向图十字链表的示意图,
运行效果:
使用方式:
输入图所对应的邻接矩阵,并调用函数即可,如下图:
完整代码:
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