c语言中如何创建一幅图,同时将数据输入到图中
结构体
sturct Shortway{
char *beigin;
char *end;
int distance;
};
c语言图的邻接表建立,建立应该怎么写,说一下具体的思路就行,不要给代码
在读入顶点信息的时候,将每个点的第一条置为空。如node[x].first_edge = NULL
读入每条边的时候,边的信息应该包括这条边所连接的两个点,即为ilink和jlink。然后执行
edge = malloc…
edge-next_edge = node[ilink].first_edge;
node[ilink].first_edge = edge;
即,将ilink的第一条边指向刚刚输入的这条边,而该边的下一条边置为原本ilink的第一条边。
重复这一过程,直至读完所有边的信息。
C语言关于图的邻接表建立
#include “iostream.h”
const int Max_vertex=5;
const int Max_Edge=8;
int visited[Max_vertex+1]; //访问标志数组
struct ArcNode
{
int adjvex;
ArcNode *nextarc; //指向下一条弧
};
struct Vnode
{
int v; //顶点信息
ArcNode *next;
}a[Max_vertex+1];
/* 无向图的建立 */
void creategraph()
{
int i,j,k;
ArcNode *s;
//初始化
for(i=1;i=Max_vertex;i++)
{
a[i].v=i;
a[i].next=NULL;
}
/*以头插法建立 */
for(k=1;k=Max_Edge;k++)
{
cout”请输入第”k”条边:”;
cinij;
if(i9||i0||j0||j9)
{
cout”输入错误!!\n”endl;
break;
}
else{
coutendl;
s=new ArcNode;
s-adjvex=j;
s-nextarc=a[i].next;
a[i].next=s;
s=new ArcNode;
s-adjvex=i;
s-nextarc=a[j].next;
a[j].next=s;
}
}
}
void display()
{
ArcNode *p;
cout”你建立的图为:”endl;
for(int i=1;i=Max_vertex;i++)
{
p=a[i].next;
couta[i].v”-“;
while(p-nextarc!=NULL)
{
coutp-adjvex”-“;
p=p-nextarc;
}
coutp-adjvexendl;
}
}
void main()
{
cout”/******\t本算法以关插法建立无向图的邻接表为例!\t******/”endl;
char yn=’y’;int k;
creategraph();
display();
}
c语言图的遍历,邻接表存储,深度,广度优先遍历
(1)图的建立,按采用邻接表作为存储结构。
(2)从指定顶点出发进行深度优先搜索遍历。
(3)从指定顶点出发进行广度优先搜索遍历。
#include”stdio.h”
#include”string.h”
#include”stdlib.h”
#include”math.h”
#define MAX_INT 1000
#define MAX_VERTEX_NUM 20
#define MAX_QUEUE_NUMBER 20
typedef struct ArcNode
{
int adjvex;
double adj;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VexNode
{
char szName[40];
ArcNode *firstarc;
}VexNode,AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vexs;
int vexnum,arcnum;
}Net;
//定义队列
typedef struct{
int *elem;
int front, rear;
}Queue;
void InitQueue(Queue Q)
{
Q.elem = new int[MAX_QUEUE_NUMBER];
Q.front = Q.rear = 0;
}
int EmptyQueue(Queue Q)
{
if(Q.front==Q.rear)
return 0;
else
return 1;
}
void DestroyQueue(Queue Q){
delete []Q.elem;
Q.front = Q.rear = 0;
}
void EnterQueue(Queue Q, int e)
{
if((Q.rear + 1)%MAX_QUEUE_NUMBER != Q.front)
Q.elem[Q.rear ]= e;
else
printf(“队列满!\n”);
Q.rear = (Q.rear + 1)%MAX_QUEUE_NUMBER;
}
void LeaveQueue(Queue Q, int e)
{
if(Q.rear != Q.front)
e = Q.elem[Q.front];
else
printf(“队列空!\n”);
Q.front = (Q.front+1)%MAX_QUEUE_NUMBER;
}
int LocateVex(Net ga,char *name)
{
int i;
for(i=0;iga.vexnum;i++)
if(strcmp(name,ga.vexs[i].szName)==0)
return i;
return -1;
}
void crt_net(Net ga)
{
ArcNode *p;
char name1[40],name2[40];
int i,j,k;
double w;
printf(“请输入顶点数和弧数:”);
scanf(“%d%d”,ga.vexnum,ga.arcnum);
printf(“请依次输入顶点名:\n”);
for(i=0;iga.vexnum;i++)
{
scanf(“%s”,ga.vexs[i].szName);
ga.vexs[i].firstarc=NULL;
}
for(k=0;kga.arcnum;k++)
{
printf(“请输入相邻的两个定点和权值:”);
scanf(“%s%s%lf”,name1,name2,w);
i=LocateVex(ga,name1);
j=LocateVex(ga,name2);
p=new ArcNode;
p-adjvex=j;
p-adj=w;
p-nextarc=ga.vexs[i].firstarc;
ga.vexs[i].firstarc=p;
}
}
void DFS(Net ga,char *name,int *visited)
{
int v,w;
ArcNode *p;
v=LocateVex(ga,name);
visited[v]=1;
printf(“%s “,ga.vexs[v].szName);
p=ga.vexs[v].firstarc;
while(p!=NULL)
{
w=p-adjvex;
if(visited[w]==0)
DFS(ga,ga.vexs[w].szName,visited);
p=p-nextarc;
}
}
void DFSTravel(Net ga,char *name)
{
int v,k=0;
int visited[20];
for(v=0;vga.vexnum;v++)
visited[v]=0;
for(v=LocateVex(ga,name);k!=2;v=(v+1)%(ga.vexnum-1))
{
if(v+1==LocateVex(ga,name))
k++;
if(visited[v]==0)
DFS(ga,ga.vexs[v].szName,visited);
}
}
void BFSTravel(Net ga,char *name)
{
ArcNode *p;
int v,w,u,k=0;
Queue Q;
int visited[20];
for(v=0;vga.vexnum;v++)
visited[v]=0;
InitQueue(Q);
for(v=LocateVex(ga,name);k!=2;v=(v+1)%(ga.vexnum-1))
{
if(v+1==LocateVex(ga,name))
k++;
if(visited[v]==0)
{
visited[v]=1;
printf(“%s “,ga.vexs[v].szName);
EnterQueue(Q,v);
while(EmptyQueue(Q)!=0)
{
LeaveQueue(Q,u);
p=ga.vexs[u].firstarc;
while(p!=NULL)
{
w=p-adjvex;
if(visited[w]==0)
{
printf(“%s “,ga.vexs[w].szName);
visited[w]=1;
EnterQueue(Q,w);
}
p=p-nextarc;
}
}
}
}
}
void main()
{
char name[40];
Net ga;
crt_net(ga);
printf(“请输入深度优先遍历开始点的名:”);
scanf(“%s”,name);
printf(“深度优先遍历:”);
DFSTravel(ga,name);
printf(“\n”);
printf(“请输入广度优先遍历开始点的名:”);
scanf(“%s”,name);
printf(“广度优先遍历:”);
BFSTravel(ga,name);
printf(“\n”);
}
c语言流程图怎么画
画法如下:
第一步:以特定的图形符号加上说明,表示算法的图,称为流程图或框图
打开流程编辑工具。
第二步:选择对应的图形
开始结束用椭圆形
过程用长方形
第三步::绘制整个流程的过程
第四步:将各个流程节点用线连接起来
第五步:添加备注