关于数据结构的图的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于数据结构的图的问题相关的知识,希望对你有一定的参考价值。
(1)键盘输入数据,建立一个有向图的邻接表。
(2)输出该邻接表。
(3)在有向图的邻接表的基础上计算各顶点的度,并输出。
(4)采用邻接表存储实现无向图的广度优先遍历。
(5)采用邻接表存储实现无向图的深度优先非递归遍历。
先谢谢了,代码中最好有注释,越多越好!
只能用1个主函数!!
#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); } } }
以上是关于关于数据结构的图的问题的主要内容,如果未能解决你的问题,请参考以下文章
【Winfrom】 小弟请教各位大哥一个问题,我想在一个窗体上绘制像下面图片一样结构的图