关于数据结构的图的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于数据结构的图的问题相关的知识,希望对你有一定的参考价值。

(1)键盘输入数据,建立一个有向图的邻接表。
(2)输出该邻接表。
(3)在有向图的邻接表的基础上计算各顶点的度,并输出。
(4)采用邻接表存储实现无向图的广度优先遍历。
(5)采用邻接表存储实现无向图的深度优先非递归遍历。
先谢谢了,代码中最好有注释,越多越好!
只能用1个主函数!!

参考技术A 数据结构(C语言) 这个不知道对不
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define MAX_VERTEX_NUM 20
typedef struct ArcBox
int tailvex,headvex;
struct ArcBox *hlink,*tlink;
int *info;
ArcBox;
typedef struct VexNode
char data;
ArcBox *firstin,*firstout;
VexNode;
typedef struct
VexNode xlist[MAX_VERTEX_NUM];
int vexnum,arcnum;
OLGraph;
ArcBox ptr[MAX_VERTEX_NUM]; //定义访问图的辅助向量
int visited[MAX_VERTEX_NUM]; //定义顶点访问标志

int Locate(OLGraph &G, char a)
int s;
for(s=0;s<G.vexnum;s++)
if(G.xlist[s].data==a) return s;
return -1; //未找到则返回-1


void createDG(OLGraph &G)
int i,j,k;
char v1,v2;
ArcBox *p;
printf("请输入有向图的当前顶点数和弧数:");
scanf("%d%d",&G.vexnum ,&G.arcnum);
// printf("请输入有向图中与弧有关的指针系信息,输入0时表示各弧不含任何信息:");
printf("请输入顶点的值:");
for(i=0;i<G.vexnum ;++i)
scanf("%c",&G.xlist [i].data);
G.xlist[i].firstin=NULL;G.xlist[i].firstout=NULL;

for(k=0;k<G.arcnum ;++k)
printf("请输入一条弧的始点和终点:");
scanf("%c%c",&v1,&v2);
i=Locate(G,v1); j=Locate(G,v2);
p=(ArcBox * )malloc(sizeof(ArcBox));

p->tailvex=i;p->headvex=j;

p->hlink=G.xlist[j].firstin;
p->tlink=G.xlist[i].firstout;

// *p=i,j,G.xlist[j].firstin ,G.xlist[i].firstout ,NULL;
G.xlist[j].firstin=G.xlist[i].firstout=p;




void printGraph(OLGraph &G)
ArcBox *p;
int i;
printf("\n\n输出图中的弧:");
for(i=0; i<G.vexnum; i++) //输出图中的弧
p=G.xlist[i].firstout; printf("\n%c:",G.xlist[i].data);
while(p!=NULL)
printf("%c->%c",G.xlist[i].data, G.xlist[p->headvex].data);
p=p->tlink;




int outNumNode(ArcBox *p) //计算弧尾相同链表的结点数
int n=0;
while (p!=NULL) n++; p=p->tlink;
return n;


int inNumNode(ArcBox *p) //计算弧头相同链表的结点数
int n=0;
while (p!=NULL) n++; p=p->hlink;
return n;


int outDegree(OLGraph &G, char a)//计算某结点的出度
int outNumber=0;

outNumber=outNumNode(G.xlist[Locate(G,a)].firstout);
return outNumber;


int inDegree(OLGraph &G, char a)//计算某结点的入度
int inNumber=0;
inNumber=inNumNode(G.xlist[Locate(G,a)].firstin);
return inNumber;


void printDegree(OLGraph &G) //输出结点的度数
int i;
printf("\n\n输出节点的值及其出度:");
for(i=0; i<G.vexnum; i++)
printf("\n%c: %d",G.xlist[i].data, outDegree(G,G.xlist[i].data));

printf("\n\n输出节点的值及其入度:");
for(i=0; i<G.vexnum; i++)
printf("\n%c: %d",G.xlist[i].data, inDegree(G,G.xlist[i].data));


void dfs(OLGraph &G,int indexV) //以某顶点出发深度优先遍历图
int w;
printf("%4c", G.xlist[indexV].data);
visited[indexV]=1; // 访问此结点,并设置标志
while (ptr[indexV]!=NULL)
w= ptr[indexV]->headvex; //取结点的邻接顶点w
if( visited[w]==0 ) dfs(G, w);
ptr[indexV]=ptr[indexV]->tlink; // 记住顶点v 的邻接顶点位置,
// 该邻接点在w之后


void depthFirst(OLGraph &G) //深度优先遍历图
int i;
for (i=0; i<G.vexnum; i++)
ptr=G.xlist[i].firstout; //每个顶点链表的第一个结点的地址
visited=0; //给每个结点一个未访问标记

printf("\n\nthe traverse of depthFirst are:");
for(i=0; i<G.vexnum; i++) //调用以顶点vi为出发点的深度优先遍历图G的算法
if (visited == 0) dfs(G,i);
printf("\nthe end of traverse");


void main()
OLGraph G;
createDG(G);
printGraph(G);
printDegree(G);
depthFirst(G);
本回答被提问者采纳

关于h5绘制canvas生成图片的注意点!

1、第一个是关于移动端自适应的问题:

答:如果是最后只要一张canvas生成的图片,而不是要绘制的canvas的图形,则不需要考虑自适应,绘制canvas的时候的宽高,可以直接写成UI提供的图的大小,比如UI提供的图是 750 * 1280 ,则绘制canvas的时候,所有的数据都可以

以375*640来进行计算,固定好即可!这个跟后台绘制图片的原理一样,我们不需要考虑自适应,ui给什么图,或者说我们希望要多大的图片,我们直接绘制即可,因为图片最后自己可以按比例伸缩,默认即是自适应! 

2、关于H5绘制canvas的多行文本,我们可以利用测量宽度进行自动换行绘制文字!

3、绘制图片完成后再绘制文字,即可解决文字在图片底部的问题!

 

具体代码如下:

/**
 * 绘制canvas
 */
function draw(name=‘大威德‘, score = 23, level = 1, str = ‘哈哈哈哈‘) {
    var c = document.getElementById("canvas");
    var ctx = c.getContext("2d");
    // 绘制背景
    var img = new Image();
    img.src = "images/newbg.jpg";
    img.onload = function () {
        ctx.drawImage(img, 0, 0,375,640);
        // 绘制底部文字
        ctx.font = "bold normal 20px Microsoft YaHei";
        ctx.fillStyle = "black";
        ctx.fillText(name, 375 * 0.18, 640 * 0.34);
        ctx.font = "bold normal 20px Microsoft YaHei";
        ctx.fillStyle = "red";
        ctx.fillText(score, 375 * 0.63, 640 * 0.345);
        ctx.fillStyle = "black";
        ctx.fillText(level, 375 * 0.37, 640 * 0.458);
        ctx.font = "normal 18px Microsoft YaHei";
        ctx.fillStyle = "black";
        // 绘制多行文字
        canvasTextAutoLine(str, c, 375 * 0.1, 640 * 0.5, 20);
     var imgsrc = c.toDataURL("image/png",1);
   注意:这一行就是把canvas绘制的图形变成图片,imgsrc为base64格式!
    };

}
/*
str:要绘制的字符串
canvas:canvas对象
initX:绘制字符串起始x坐标
initY:绘制字符串起始y坐标
lineHeight:字行高,自己定义个值即可
*/
function canvasTextAutoLine(str, canvas, initX, initY, lineHeight) {
    var ctx = canvas.getContext("2d");
    var lineWidth = 0;
    var canvasWidth = document.documentElement.clientWidth;
    var lastSubStrIndex = 0;
    for (let i = 0; i < str.length; i++) {
        lineWidth += ctx.measureText(str[i]).width;
        if (lineWidth > canvasWidth * 0.8) {//减去initX,防止边界出现的问题
            ctx.fillText(str.substring(lastSubStrIndex, i), initX, initY);
            initY += lineHeight;
            lineWidth = 0;
            lastSubStrIndex = i;
        }
        if (i == str.length - 1) {
            ctx.fillText(str.substring(lastSubStrIndex, i + 1), initX, initY);
        }
    }
}

 


以上是关于关于数据结构的图的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于gprof和gprof2dot生成的图的一些疑惑

Prim算法得到的图的最小生成树

【Winfrom】 小弟请教各位大哥一个问题,我想在一个窗体上绘制像下面图片一样结构的图

DGL的图数据结构的创建图的特征dgl.batch及一些理解

信息学赛培 | 06 信息学复赛必备的图结构实现方式

图的邻接矩阵算法