数据结构 十字链表示意图自动生成器(MATLAB)

这个程序用来生成有向图十字链表的示意图,
运行效果:
在这里插入图片描述
使用方式:
输入图所对应的邻接矩阵,并调用函数即可,如下图:
在这里插入图片描述
在这里插入图片描述
完整代码:

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

猜你喜欢

转载自blog.csdn.net/slandarer/article/details/112983985