数据结构c语言图的遍历

数据结构(C语言版) 图的遍历和拓扑排序

#includestring.h

#includectype.h

#includemalloc.h /* malloc()等*/

#includelimits.h /* INT_MAX 等*/

#includestdio.h /* EOF(=^Z 或F6),NULL */

#includestdlib.h /* atoi() */

#includeio.h /* eof() */

#includemath.h /* floor(),ceil(),abs() */

#includeprocess.h /* exit() */

/* 函数结果状态代码*/

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

/* #define OVERFLOW -2 因为在math.h 中已定义OVERFLOW 的值为3,故去掉此行*/

typedef int Status; /* Status 是函数的类型,其值是函数结果状态代码,如OK 等*/

typedef int Boolean; Boolean 是布尔类型,其值是TRUE 或FALSE */

/* …………………….*/

#define MAX_VERTEX_NUM 20

typedef enum{DG,DN,AG,AN}GraphKind; /* {有向图,有向网,无向图,无向网} */

typedef struct ArcNode

{

int adjvex; /* 该弧所指向的顶点的位置*/

struct ArcNode *nextarc; /* 指向下一条弧的指针*/

InfoType *info; /* 网的权值指针) */

}ArcNode; /* 表结点*/

typedef struct

{

VertexType data; /* 顶点信息*/

ArcNode *firstarc; /* 第一个表结点的地址,指向第一条依附该顶点的弧的指针*/

}VNode,AdjList[MAX_VERTEX_NUM]; /* 头结点*/

typedef struct

{

AdjList vertices;

int vexnum,arcnum; /* 图的当前顶点数和弧数*/

int kind; /* 图的种类标志*/

}ALGraph;

/* …………………….*/

/* …………………….*/

/*ALGraphAlgo.cpp 图的邻接表存储(存储结构由ALGraphDef.h 定义)的基本操作*/

int LocateVex(ALGraph G,VertexType u)

{ /* 初始条件: 图G 存在,u 和G 中顶点有相同特征*/

/* 操作结果: 若G 中存在顶点u,则返回该顶点在图中位置;否则返回-1 */

int i;

for(i=0;iG.vexnum;++i)

if(strcmp(u,G.vertices[i].data)==0)

return i;

return -1;

}

Status CreateGraph(ALGraph G)

{ /* 采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造4 种图) */

int i,j,k;

int w; /* 权值*/

VertexType va,vb;

ArcNode *p;

printf(“请输入图的类型(有向图:0,有向网:1,无向图:2,无向网:3): “);

scanf(“%d”,(G.kind));

printf(“请输入图的顶点数,边数: “);

scanf(“%d,%d”,(G.vexnum),(G.arcnum));

printf(“请输入%d 个顶点的值(%d 个字符):\n”,G.vexnum,MAX_NAME);

for(i=0;iG.vexnum;++i) /* 构造顶点向量*/

{

scanf(“%s”,G.vertices[i].data);

G.vertices[i].firstarc=NULL;

}

if(G.kind==1||G.kind==3) /* 网*/

printf(“请顺序输入每条弧(边)的权值、弧尾和弧头(以空格作为间隔):\n”);

else /* 图*/

printf(“请顺序输入每条弧(边)的弧尾和弧头(以空格作为间隔):\n”);

for(k=0;kG.arcnum;++k) /* 构造表结点链表*/

{

if(G.kind==1||G.kind==3) /* 网*/

scanf(“%d%s%s”,w,va,vb);

else /* 图*/

scanf(“%s%s”,va,vb);

i=LocateVex(G,va); /* 弧尾*/

j=LocateVex(G,vb); /* 弧头*/

p=(ArcNode*)malloc(sizeof(ArcNode));

p-adjvex=j;

if(G.kind==1||G.kind==3) /* 网*/

{

p-info=(int *)malloc(sizeof(int));

*(p-info)=w;

}

else

p-info=NULL; /* 图*/

p-nextarc=G.vertices[i].firstarc; /* 插在表头*/

G.vertices[i].firstarc=p;

if(G.kind=2) /* 无向图或网,产生第二个表结点*/

{

p=(ArcNode*)malloc(sizeof(ArcNode));

p-adjvex=i;

if(G.kind==3) /* 无向网*/

{

p-info=(int*)malloc(sizeof(int));

*(p-info)=w;

}

else

p-info=NULL; /* 无向图*/

p-nextarc=G.vertices[j].firstarc; /* 插在表头*/

G.vertices[j].firstarc=p;

}

}

return OK;

}

void DestroyGraph(ALGraph G)

{ /* 初始条件: 图G 存在。操作结果: 销毁图G */

int i;

ArcNode *p,*q;

G.vexnum=0;

G.arcnum=0;

for(i=0;iG.vexnum;++i)

{

p=G.vertices[i].firstarc;

while(p)

{

q=p-nextarc;

if(G.kind%2) /* 网*/

free(p-info);

free(p);

p=q;

}

}

}

VertexType* GetVex(ALGraph G,int v)

{ /* 初始条件: 图G 存在,v 是G 中某个顶点的序号。操作结果: 返回v 的值*/

if(v=G.vexnum||v0)

exit(ERROR);

return G.vertices[v].data;

}

int FirstAdjVex(ALGraph G,VertexType v)

{ /* 初始条件: 图G 存在,v 是G 中某个顶点*/

/* 操作结果: 返回v 的第一个邻接顶点的序号。若顶点在G 中没有邻接顶点,则返回-1 */

ArcNode *p;

int v1;

v1=LocateVex(G,v); /* v1 为顶点v 在图G 中的序号*/

p=G.vertices[v1].firstarc;

if(p)

return p-adjvex;

else

return -1;

}

int NextAdjVex(ALGraph G,VertexType v,VertexType w)

{ /* 初始条件: 图G 存在,v 是G 中某个顶点,w 是v 的邻接顶点*/

/* 操作结果: 返回v 的(相对于w 的)下一个邻接顶点的序号。*/

/* 若w 是v 的最后一个邻接点,则返回-1 */

ArcNode *p;

int v1,w1;

v1=LocateVex(G,v); /* v1 为顶点v 在图G 中的序号*/

w1=LocateVex(G,w); /* w1 为顶点w 在图G 中的序号*/

p=G.vertices[v1].firstarc;

while(pp-adjvex!=w1) /* 指针p 不空且所指表结点不是w */

p=p-nextarc;

if(!p||!p-nextarc) /* 没找到w 或w 是最后一个邻接点*/

return -1;

else /* p-adjvex==w */

return p-nextarc-adjvex; /* 返回v 的(相对于w 的)下一个邻接顶点的序号*/

}

Boolean visited[MAX_VERTEX_NUM]; /* 访问标志数组(全局量) */

void(*VisitFunc)(char* v); /* 函数变量(全局量) */

void DFS(ALGraph G,int v)

{ /* 从第v 个顶点出发递归地深度优先遍历图G。算法7.5 */

int w;

VertexType v1,w1;

strcpy(v1,*GetVex(G,v));

visited[v]=TRUE; /* 设置访问标志为TRUE(已访问) */

VisitFunc(G.vertices[v].data); /* 访问第v 个顶点*/

for(w=FirstAdjVex(G,v1);w=0;w=NextAdjVex(G,v1,strcpy(w1,*GetVex(G,w))))

if(!visited[w])

DFS(G,w); /* 对v 的尚未访问的邻接点w 递归调用DFS */

}

void DFSTraverse(ALGraph G,void(*Visit)(char*))

{ /* 对图G 作深度优先遍历。算法7.4 */

int v;

VisitFunc=Visit; /* 使用全局变量VisitFunc,使DFS 不必设函数指针参数*/

for(v=0;vG.vexnum;v++)

visited[v]=FALSE; /* 访问标志数组初始化*/

for(v=0;vG.vexnum;v++)

if(!visited[v])

DFS(G,v); /* 对尚未访问的顶点调用DFS */

printf(“\n”);

}

typedef int QElemType; /* 队列类型*/

#include”LinkQueueDef.h”

#include”LinkQueueAlgo.h”

void BFSTraverse(ALGraph G,void(*Visit)(char*))

{/*按广度优先非递归遍历图G。使用辅助队列Q 和访问标志数组visited。算法7.6 */

int v,u,w;

VertexType u1,w1;

LinkQueue Q;

for(v=0;vG.vexnum;++v)

visited[v]=FALSE; /* 置初值*/

InitQueue(Q); /* 置空的辅助队列Q */

for(v=0;vG.vexnum;v++) /* 如果是连通图,只v=0 就遍历全图*/

if(!visited[v]) /* v 尚未访问*/

{

visited[v]=TRUE;

Visit(G.vertices[v].data);

EnQueue(Q,v); /* v 入队列*/

while(!QueueEmpty(Q)) /* 队列不空*/

{

DeQueue(Q,u); /* 队头元素出队并置为u */

strcpy(u1,*GetVex(G,u));

for(w=FirstAdjVex(G,u1);w=0;w=NextAdjVex(G,u1,strcpy(w1,*GetVex(G,w))))

if(!visited[w]) /* w 为u 的尚未访问的邻接顶点*/

{

visited[w]=TRUE;

Visit(G.vertices[w].data);

EnQueue(Q,w); /* w 入队*/

}

}

}

printf(“\n”);

}

void Display(ALGraph G)

{ /* 输出图的邻接矩阵G */

int i;

ArcNode *p;

switch(G.kind)

{ case DG: printf(“有向图\n”); break;

case DN: printf(“有向网\n”); break;

case AG: printf(“无向图\n”); break;

case AN: printf(“无向网\n”);

}

printf(“%d 个顶点:\n”,G.vexnum);

for(i=0;iG.vexnum;++i)

printf(“%s “,G.vertices[i].data);

printf(“\n%d 条弧(边):\n”,G.arcnum);

for(i=0;iG.vexnum;i++)

{

p=G.vertices[i].firstarc;

while(p)

{

if(G.kind=1) /* 有向*/

{

printf(“%s→%s “,G.vertices[i].data,G.vertices[p-adjvex].data);

if(G.kind==DN) /* 网*/

printf(“:%d “,*(p-info));

}

else /* 无向(避免输出两次) */

{

if(ip-adjvex)

{

printf(“%s-%s “,G.vertices[i].data,G.vertices[p-adjvex].data);

if(G.kind==AN) /* 网*/

printf(“:%d “,*(p-info));

}

}

p=p-nextarc;

}

printf(“\n”);

}

}

/* …………………….*/

/* …………………….*/

#include “pubuse.h”

#define MAX_NAME 3 /* 顶点字符串的最大长度+1 */

typedef int InfoType; /* 存放网的权值*/

typedef char VertexType[MAX_NAME]; /* 字符串类型*/

#include”ALGraphDef.h”

#include”ALGraphAlgo.h”

void print(char *i)

{

printf(“%s “,i);

}

void main()

{

int i,j,k,n;

ALGraph g;

VertexType v1,v2;

printf(“请选择有向图\n”);

CreateGraph(g);

Display(g);

printf(“深度优先搜索的结果:\n”);

DFSTraverse(g,print);

printf(“广度优先搜索的结果:\n”);

BFSTraverse(g,print);

DestroyGraph(g); /* 销毁图*/

}

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语言编写程序实现图的遍历操作

楼主你好,下面是源程序!

/*/////////////////////////////////////////////////////////////*/

/* 图的深度优先遍历 */

/*/////////////////////////////////////////////////////////////*/

#include stdlib.h

#include stdio.h

struct node /* 图顶点结构定义 */

{

int vertex; /* 顶点数据信息 */

struct node *nextnode; /* 指下一顶点的指标 */

};

typedef struct node *graph; /* 图形的结构新型态 */

struct node head[9]; /* 图形顶点数组 */

int visited[9]; /* 遍历标记数组 */

/********************根据已有的信息建立邻接表********************/

void creategraph(int node[20][2],int num)/*num指的是图的边数*/

{

graph newnode; /*指向新节点的指针定义*/

graph ptr;

int from; /* 边的起点 */

int to; /* 边的终点 */

int i;

for ( i = 0; i num; i++ ) /* 读取边线信息,插入邻接表*/

{

from = node[i][0]; /* 边线的起点 */

to = node[i][1]; /* 边线的终点 */

/* 建立新顶点 */

newnode = ( graph ) malloc(sizeof(struct node));

newnode-vertex = to; /* 建立顶点内容 */

newnode-nextnode = NULL; /* 设定指标初值 */

ptr = (head[from]); /* 顶点位置 */

while ( ptr-nextnode != NULL ) /* 遍历至链表尾 */

ptr = ptr-nextnode; /* 下一个顶点 */

ptr-nextnode = newnode; /* 插入节点 */

}

}

/********************** 图的深度优先搜寻法********************/

void dfs(int current)

{

graph ptr;

visited[current] = 1; /* 记录已遍历过 */

printf(“vertex[%d]\n”,current); /* 输出遍历顶点值 */

ptr = head[current].nextnode; /* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

if ( visited[ptr-vertex] == 0 ) /* 如过没遍历过 */

dfs(ptr-vertex); /* 递回遍历呼叫 */

ptr = ptr-nextnode; /* 下一个顶点 */

}

}

/****************************** 主程序******************************/

void main()

{

graph ptr;

int node[20][2] = { {1, 2}, {2, 1}, /* 边线数组 */

{1, 3}, {3, 1},

{1, 4}, {4, 1},

{2, 5}, {5, 2},

{2, 6}, {6, 2},

{3, 7}, {7, 3},

{4, 7}, {4, 4},

{5, 8}, {8, 5},

{6, 7}, {7, 6},

{7, 8}, {8, 7} };

int i;

clrscr();

for ( i = 1; i = 8; i++ ) /* 顶点数组初始化 */

{

head[i].vertex = i; /* 设定顶点值 */

head[i].nextnode = NULL; /* 指针为空 */

visited[i] = 0; /* 设定遍历初始标志 */

}

creategraph(node,20); /* 建立邻接表 */

printf(“Content of the gragh’s ADlist is:\n”);

for ( i = 1; i = 8; i++ )

{

printf(“vertex%d -“,head[i].vertex); /* 顶点值 */

ptr = head[i].nextnode; /* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

printf(” %d “,ptr-vertex); /* 印出顶点内容 */

ptr = ptr-nextnode; /* 下一个顶点 */

}

printf(“\n”); /* 换行 */

}

printf(“\nThe end of the dfs are:\n”);

dfs(1); /* 打印输出遍历过程 */

printf(“\n”); /* 换行 */

puts(” Press any key to quit…”);

getch();

}

/*//////////////////////////////////////////*/

/* 图形的广度优先搜寻法 */

/* ///////////////////////////////////////*/

#include stdlib.h

#include stdio.h

#define MAXQUEUE 10 /* 队列的最大容量 */

struct node /* 图的顶点结构定义 */

{

int vertex;

struct node *nextnode;

};

typedef struct node *graph; /* 图的结构指针 */

struct node head[9]; /* 图的顶点数组 */

int visited[9]; /* 遍历标记数组 */

int queue[MAXQUEUE]; /* 定义序列数组 */

int front = -1; /* 序列前端 */

int rear = -1; /* 序列后端 */

/***********************二维数组向邻接表的转化****************************/

void creategraph(int node[20][2],int num)

{

graph newnode; /* 顶点指针 */

graph ptr;

int from; /* 边起点 */

int to; /* 边终点 */

int i;

for ( i = 0; i num; i++ ) /* 第i条边的信息处理 */

{

from = node[i][0]; /* 边的起点 */

to = node[i][1]; /* 边的终点 */

/* 建立新顶点 */

newnode = ( graph ) malloc(sizeof(struct node));

newnode-vertex = to; /* 顶点内容 */

newnode-nextnode = NULL; /* 设定指针初值 */

ptr = (head[from]); /* 顶点位置 */

while ( ptr-nextnode != NULL ) /* 遍历至链表尾 */

ptr = ptr-nextnode; /* 下一个顶点 */

ptr-nextnode = newnode; /* 插入第i个节点的链表尾部 */

}

}

/************************ 数值入队列************************************/

int enqueue(int value)

{

if ( rear = MAXQUEUE ) /* 检查伫列是否全满 */

return -1; /* 无法存入 */

rear++; /* 后端指标往前移 */

queue[rear] = value; /* 存入伫列 */

}

/************************* 数值出队列*********************************/

int dequeue()

{

if ( front == rear ) /* 队列是否为空 */

return -1; /* 为空,无法取出 */

front++; /* 前端指标往前移 */

return queue[front]; /* 从队列中取出信息 */

}

/*********************** 图形的广度优先遍历************************/

void bfs(int current)

{

graph ptr;

/* 处理第一个顶点 */

enqueue(current); /* 将顶点存入队列 */

visited[current] = 1; /* 已遍历过记录标志置疑1*/

printf(” Vertex[%d]\n”,current); /* 打印输出遍历顶点值 */

while ( front != rear ) /* 队列是否为空 */

{

current = dequeue(); /* 将顶点从队列列取出 */

ptr = head[current].nextnode; /* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

if ( visited[ptr-vertex] == 0 ) /*顶点没有遍历过*/

{

enqueue(ptr-vertex); /* 奖定点放入队列 */

visited[ptr-vertex] = 1; /* 置遍历标记为1 */

printf(” Vertex[%d]\n”,ptr-vertex);/* 印出遍历顶点值 */

}

ptr = ptr-nextnode; /* 下一个顶点 */

}

}

}

/*********************** 主程序 ************************************/

/*********************************************************************/

void main()

{

graph ptr;

int node[20][2] = { {1, 2}, {2, 1}, /* 边信息数组 */

{6, 3}, {3, 6},

{2, 4}, {4, 2},

{1, 5}, {5, 1},

{3, 7}, {7, 3},

{1, 7}, {7, 1},

{4, 8}, {8, 4},

{5, 8}, {8, 5},

{2, 8}, {8, 2},

{7, 8}, {8, 7} };

int i;

clrscr();

puts(“This is an example of Width Preferred Traverse of Gragh.\n”);

for ( i = 1; i = 8; i++ ) /*顶点结构数组初始化*/

{

head[i].vertex = i;

head[i].nextnode = NULL;

visited[i] = 0;

}

creategraph(node,20); /* 图信息转换,邻接表的建立 */

printf(“The content of the graph’s allist is:\n”);

for ( i = 1; i = 8; i++ )

{

printf(” vertex%d =”,head[i].vertex); /* 顶点值 */

ptr = head[i].nextnode; /* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

printf(” %d “,ptr-vertex); /* 打印输出顶点内容 */

ptr = ptr-nextnode; /* 下一个顶点 */

}

printf(“\n”); /* 换行 */

}

printf(“The contents of BFS are:\n”);

bfs(1); /* 打印输出遍历过程 */

printf(“\n”); /* 换行 */

puts(” Press any key to quit…”);

getch();

}

C语言编程 图的创建与遍历

在C语言编程中,图的创建和遍历:

#includestdio.h

#define N 20

#define TRUE 1

#define FALSE 0

int visited[N];  

typedef struct    /*队列的定义*/

{

int data[N];

int front,rear;

}queue;

typedef struct    /*图的邻接矩阵*/

{

int vexnum,arcnum;

char vexs[N];

int arcs[N][N];

}

graph;

void createGraph(graph *g);  /*建立一个无向图的邻接矩阵*/

void dfs(int i,graph *g);    /*从第i个顶点出发深度优先搜索*/

void tdfs(graph *g);          /*深度优先搜索整个图*/

void bfs(int k,graph *g);    /*从第k个顶点广度优先搜索*/

void tbfs(graph *g);          /*广度优先搜索整个图*/

void init_visit();            /*初始化访问标识数组*/

void createGraph(graph *g)   /*建立一个无向图的邻接矩阵*/

{   int i,j;

char v;

g-vexnum=0;

g-arcnum=0;

i=0;

printf(“输入顶点序列(以#结束):

“);

while((v=getchar())!=’#’)

{

g-vexs[i]=v;        /*读入顶点信息*/

i++;

}

g-vexnum=i;             /*顶点数目*/

for(i=0;ig-vexnum;i++) /*邻接矩阵初始化*/

for(j=0;jg-vexnum;j++)

g-arcs[i][j]=0;

printf(“输入边的信息:

“);

scanf(“%d,%d”,i,j);  /*读入边i,j*/

while(i!=-1)              /*读入i,j为-1时结束*/

{

g-arcs[i][j]=1;

g-arcs[j][i]=1;

scanf(“%d,%d”,i,j);

}

}

void dfs(int i,graph *g) /*从第i个顶点出发深度优先搜索*/

{

int j;

printf(“%c”,g-vexs[i]);

visited[i]=TRUE;

for(j=0;jg-vexnum;j++)

if((g-arcs[i][j]==1)(!visited[j]))

dfs(j,g);

}

void tdfs(graph *g)      /*深度优先搜索整个图*/

{

int i;

printf(“

从顶点%C开始深度优先搜索序列:”,g-vexs[0]);

for(i=0;ig-vexnum;i++)

if(visited[i]!=TRUE)

dfs(i,g);

}

void bfs(int k,graph *g)  /*从第k个顶点广度优先搜索*/

{

int i,j;

queue qlist,*q;

q=qlist;

q-rear=0;

q-front=0;

printf(“%c”,g-vexs[k]);

visited[k]=TRUE;

q-data[q-rear]=k;

q-rear=(q-rear+1)%N;

while(q-rear!=q-front)

{

i=q-data[q-front];

q-front=(q-front+1)%N;

for(j=0;jg-vexnum;j++)

if((g-arcs[i][j]==1)(!visited[j]))

{

printf(“%c”,g-vexs[j]);

visited[j]=TRUE;

q-data[q-rear]=j;

q-rear=(q-rear+1)%N;

}

}

}

void tbfs(graph *g) /*广度优先搜索整个图*/

{

int i;

printf(“

从顶点%C开始广度优先搜索序列:”,g-vexs[0]);

for(i=0;ig-vexnum;i++)

if(visited[i]!=TRUE)

bfs(i,g);

printf(“

“);

}

void init_visit()   /*初始化访问标识数组*/

{

int i;

for(i=0;iN;i++)

visited[i]=FALSE;

}

int main()

{

graph ga;

int i,j;

createGraph(ga);

printf(“无向图的邻接矩阵:

“);

for(i=0;iga.vexnum;i++)

{

for(j=0;jga.vexnum;j++)

printf(“%3d”,ga.arcs[i][j]);

printf(“

“);

}

init_visit();

tdfs(ga);

init_visit();

tbfs(ga);

return 0;

}

C语言编程,顾名思义,就是用C语言来进行计算机编程工作。

C语言是国际上广泛流行的,很有发展前途的计算机高级语言.它适合作为系统描述语言,即可用来编写系统软件,也可用来编写应用软件.

C语言是一种引用广泛,并且实现灵活的一种计算机编程语言,用C语言编出来的程序,可以在很多平台上运行,可移植性强。具体的C语言编程内容请参加C或者C++等。

数据结构c语言图的遍历

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月28日 04:31:55
下一篇 2024年3月28日 04:39:10

相关推荐

  • c语言改写模式,c语言实现修改功能

    c语言程序修改? 1、这个程序有4个错误,我都加粗了,第一个是m没有赋初值,第二个是while表达式中的ch=getchar()需要括号括起来,第三个是m=m*10+ch-0中的0也需要用单引号括起来,第四个是第2个while中为m!=0。 2、define容易造成误会,因为不符合一般的编程习惯,false 0, true 1;scanf放在你的那个地方是达…

    2024年5月23日
    4100
  • c语言控制代码的换码序列,c语言交换代码

    求C语言编程大神解答一下下面这个编程代码? k==5,用5去除125余0,所以r=125%5中r为0。由于!0为1,所以执行while循环体:先打印出5(k的值),再n=n/k==125/5=25;由于251则再打印出*号。这一循环结果输出是5*。 下面是我的代码,三个函数分别对应三个问题。 在实现基本要求的前提下,拓展了可以从键盘输入的功能,以下为各题代码…

    2024年5月23日
    5800
  • c语言扫描io脚状态,c语言端口扫描

    求51单片机的上升沿和下降沿C语言检测程序列子,端口就是普通IO口。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。 单片机怎么计算1s内下降沿的个数的C语言程序或者计算两个下降沿的时间(检测脉冲频率)计算1s内下降沿的个数方法是,一个定时器设置定时1…

    2024年5月23日
    4500
  • c语言mallloc使用的简单介绍

    C语言中使用malloc必须加#includemallo.h? 1、在C语言中使用malloc函数进行动态内存分配。malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节的内存块。 2、你可以看一下C语言那本…

    2024年5月23日
    4500
  • c语言三位小数,C语言三位小数

    怎样用C++语言输出精确到小数点后三位的数? 1、用C++语言输出精确到小数点后三位的数,可以参考下面给出的代码:coutsetiosflags(ios:fixed)setprecision(3)。其中 setiosflags中set是设置的意思。ios是iostream的缩写,即输入输出流。flags是标志的意思。 2、要精确到小数点后若干位,则数据类型为…

    2024年5月23日
    7500
  • c语言21点游戏,二十一点游戏代码c语言

    如何使用C语言编写简单小游戏? 1、数学知识:长方形的面积S=a*b 长方形周长L=2*(a+b)其中a b分别为长方形的宽和高。算法分析:长方形面积及周长均依赖于宽和高,所以先要输入宽高值,然后根据公式计算,输出结果即可。 2、/*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++0、turbo…

    2024年5月23日
    6500
  • c语言当中的null,C语言当中的符号

    C/C++中,NULL和null的区别是什么? nul 和 null要看编译器,不同的编译器有所区别。 所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。 null是是什么都没有的意思。在java中表示空对象。 本意是“空的;元素只有零的”意思。计算机中通常表示空值,无结果,或是空集合。\x0d\x0a在ASCII码…

    2024年5月23日
    4700
  • 包含c语言对txt文件命名的词条

    如何在C语言编程里面修改源文件名字 如果你是在WINDOWS的话,简单了,随便用个编辑器,比如记事本,然后写c源程序,保存到你想要保存的位置。如果你在DOS下,可以用edit,写好以后,按alt键,选择文件菜单,然后保存。 用open打开文件,注意操作模式使用“修改”或者“添加” 用write或者fprintf向文件中写入你的内容。 用close关闭文件。 …

    2024年5月23日
    5000
  • 学c语言编程,学c语言编程用什么软件

    编程开发必须要学C语言吗? 1、要学习。编程开发的学习内容主要包括c语言、python和c+语言。C语言作为一种简单灵活的高级编程语言,它是一个面向过程的语言,一般是作为计算机专业的基础入门语言课程。 2、C语言。对于刚接触编程的人来说,先学习C语言是非常重要的。C语言可以说是是计算机编程语言的鼻祖,其他的编程语言几乎全是由C语言变化衍生出来的。 3、不需要…

    2024年5月23日
    3500
  • 数据结构c语言版第10章习题答案,数据结构c语言版第二版课后答案严蔚敏第十章

    数据结构(C语言版)课后习题,求大佬解答? 1、源码:includestdio.h includestdlib.h typedef int ElemType;struct BTreeNode { ElemType data;struct BTreeNode* left;struct BTreeNode* right;};//输出二叉树,可在前序遍历的基础上修…

    2024年5月23日
    3600

发表回复

登录后才能评论



关注微信