数据结构代码(用C语言) 图的遍历操作

作者&投稿:店将 (若有异议请与网页底部的电邮联系)
用C语言实现 图的邻接表和邻接矩阵数据结构的定义、创建;图的深度优先遍历、广度优先遍历。~

/* 程序1:邻接表的dfs,bfs 其中n是点的个数,m是边的个数,你需要输入m条有向边,如果要无向只需要反过来多加一遍即可。*/#include #include #define MAXM 100000#define MAXN 10000int next[MAXM],first[MAXN],en[MAXM],n,m,flag[MAXN],pd,dl[MAXN],head,tail;void input_data(){ scanf("%d%d",&n,&m); int i,x,y; for (i=1;i#include #define MAXN 1000int n,m,w[MAXN][MAXN],flag[MAXN],pd,dl[MAXN];void input_data(){ scanf("%d%d",&n,&m); int i; for (i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); w[x][0]++; w[x][w[x][0]]=y; }}void pre(){ memset(flag,0,sizeof(flag)); pd=0;}void dfs(int x){ flag[x]=1; if (!pd) { pd=1; printf("%d",x); }else printf(" %d",x); int i; for (i=1;i<=w[x][0];i++) { int y=w[x][i]; if (!flag[y]) dfs(y); }}void bfs(int t){ int head=0,tail=1; dl[1]=t;flag[t]=1; while (head<tail) { int x=dl[++head]; if (!pd) { pd=1; printf("%d",x); }else printf(" %d",x); int i; for (i=1;i<=w[x][0];i++) { int y=w[x][i]; if (!flag[y]) { flag[y]=1; dl[++tail]=y; } } }}int main(){ input_data(); printf("图的深度优先遍历结果:"); pre(); int i; for (i=1;i<=n;i++) if (!flag[i]) dfs(i); printf("
---------------------------------------------------------------
"); printf("图的广度优先遍历结果:"); pre(); for (i=1;i<=n;i++) if (!flag[i]) bfs(i); printf("
-----------------------------end--------------------------------
"); return 0;}

对的
深度优先顾名思义就是先向深的地方遍历
按照你上面的图来说,就是这样的
广度优先的话就是先搜索相邻节点
顺序是a b c d--这个是广度优先
深度优先的图最好不要存在环...那样会出现问题

#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等*/
#include<limits.h> /* INT_MAX 等*/
#include<stdio.h> /* EOF(=^Z 或F6),NULL */
#include<stdlib.h> /* atoi() */
#include<io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */
#include<process.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 enumGraphKind; /* */
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;i<G.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;i<G.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;k<G.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;i<G.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||v<0)
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(p&&p->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;v<G.vexnum;v++)
visited[v]=FALSE; /* 访问标志数组初始化*/
for(v=0;v<G.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;v<G.vexnum;++v)
visited[v]=FALSE; /* 置初值*/
InitQueue(Q); /* 置空的辅助队列Q */
for(v=0;v<G.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;i<G.vexnum;++i)
printf("%s ",G.vertices[i].data);
printf("\n%d 条弧(边):\n",G.arcnum);
for(i=0;i<G.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(i<p->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语言写:定义一个学生结构体(包含姓名,学号,语文,数学,外语,总分...
include <stdio.h>struct student { char name[20]; int idnum; float score[3]; \/\/分别存三科成绩 double total; \/\/ 总分};struct student * highscore(struct student *s, int n){ int i; struct student * high = s; for(i = 0; i < n; i++) { (s...

请用C语言编写代码,输入10个字符串,输出其中的最大字符串以及它的长度...
printf("其中最长的字符串是:%s\\n长度为:%d\\n",strs[mIndex]->str,strs[mIndex]->len); return 0;}SINFO *inputStr()\/\/输入任意长度字符串,返回字符串及其长度的数据结构{ int size=1; char inputc,*strSave=NULL; SINFO *newStr=(SINFO *)malloc(sizeof(...

c语言数据结构里的false、error、overflow、infeasible用法好像啊...
infeasible其意思是不可行的,一般在某个判断中,如果什么什么不可行,就会returninfeasible例如:求后继元素时,如果是最后一个元素,则求其后继是不可行的,此时就会returninfeasible;很多函数的返回类型都是Status,这里Status是用typedef定义的intl类型即:typedefintStatus;在这样的函数中根据不同情况返回...

C语言程序结构的特点是什么?由哪些基本部分组成??
2、源程序中可以有预处理命令(include命令仅为其中的一种),预处理命令通常应放在源文件或源程序的前面。每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。3、一个C语言源程序可以由一个或多个源文件组成。每个源文件可由一个或多个函数组成。一个源...

C语言基础知识总结大全
注意:void函数中可以有执行代码块,但是不能有返回值,另void函数中如果有return语句,该语句只能起到结束函数运行的功能。其格式为:return; 11.递归 12.变量存储类别 ! 12.1.生存周期划分存储方式 C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式。 静态存储方式:是指在程序运行期间分配固定的存...

代码是用什么写的
1. 这些代码是用C语言编写的。C语言是一种面向过程的编程语言,与Java这种面向对象的编程语言不同。根据图片所示的代码结构,可以判断这些代码是面向过程的,因此它们很可能是用C语言写成的。2. 在嵌入式系统中,大部分底层开发仍然依赖于C语言和汇编语言。尽管C++和Java在嵌入式应用中也有一定的使用,...

我现在大一,上学期刚学完C语言,这学期学数据结构,一打代码,感觉自己作...
如果一个计算机专业的不能流利地写C语言,真的说不过去。除非你想混,我还是建议你抓住学习数据结构的契机,学好C语言。我认为编程能力是计算机专业的必备技能,是理论转化为实际的桥梁。以后的课程都牵涉到编程。觉得编程有困难,还是因为练得太少,只要你有决心,真的不难。首先学会写一些基础的程序,...

严蔚敏 吴伟民的数据结构C语言版是用什么编译器编译的?
支持C的编译器应该都可以,因为数据结构用的是伪代码,只是给你描述算法思路的,不是照搬就可以的。应该理解以后,用C语言来实现,你试试。

C语言代码组成 - BSS、Data、Stack、Heap、Code、Const
即汇总下来,代码可以分为6部分组成,包括:BSS区(未初始化的全局变量\/静态变量区)、Data区(实始化的全局变量区)、Stack区(栈区)、heap区(堆区)、Code区(代码区)、const区(常量区)。一、BSS区和Data区 C语言编程中定义的全局变量、静态局部变量,就是分配在全局变量\/静态变量区域,但是...

用C语言编程?
代码文本:include "stdio.h"int main(int argc,char *argv[]){ double s,py;printf("Please enter your monthly salary...\\npy=");if(scanf("%lf",&py)==1 && py>0){ s=(py-5000)*0.03*12;printf("Should pay personal income tax totaled %.2f yuan in 2025.\\n",s);} else...

大姚县15624451841: 诚求用C语言编一个实现图的创建及两种遍历的代码. -
谯庭亿菲: /* 首先访问出发点v,并将其标记为已访问过; 然后依次从v出发搜索v的每个邻接点w. 若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止. 若此...

大姚县15624451841: c语言图的遍历,邻接表存储,深度,广度优先遍历 -
谯庭亿菲: (1) 图的建立,按采用邻接表作为存储结构.(2) 从指定顶点出发进行深度优先搜索遍历.(3) 从指定顶点出发进行广度优先搜索遍历.#include"stdio.h"#include"string.h"#include"stdlib.h"#include"math.h"#define MAX_INT 1000#define ...

大姚县15624451841: 数据结构 图的遍历演示.c++语言 -
谯庭亿菲: 程序编程如下:#include#define INFINITY 32767 #define MAX_V 20 //最多顶点个数 #define QUEUE_SIZE (MAX_V+1) //队列长度 using namespace std; bool *visited; //访问标志数组 typedef struct //图的邻接矩阵存储结构 { char *vexs; //顶点向...

大姚县15624451841: 数据结构的二叉树的遍历 -
谯庭亿菲: 三种遍历:1、先根遍历,根→左→右;2、中根遍历,左→根→右;3、后根遍历,左→右→根; 限于字数,代码发不上来,要代码百度Hi我

大姚县15624451841: 用数据结构(C语言版)编一程序能实现先序、中序、后序遍历二叉树并能打印出运行结果. -
谯庭亿菲: #include <stdio.h> #include <stdlib.h> #define STACK_MAX_SIZE 30 #define QUEUE_MAX_SIZE 30 #ifndef elemType typedef char elemType; #endif /************************************************************************/ /* 以下是关于二叉树操作的11...

大姚县15624451841: C语言数据结构“遍历二叉树” -
谯庭亿菲: [答案]: ////////////////////////////////////////////////// 使用方法: 输入树的节点,输入0结束 1 2 3 4 5 6 7 8 9 0 中序打印 1->2->3->4->5->6->7->8->9-> 后序打印 9->8->7->6->5->4->3->2->1-> 前序打印 1->2->3->4->5->6->7->8->9-> 程序原码: ////////////////////////////////...

大姚县15624451841: 数据结构课程设计题目,图的建立以及遍历. -
谯庭亿菲: //图的遍历算法程序 //图的遍历是指按某条搜索路径访问图中每个结点,使得每个结点均被访问一次,而且仅被访问一次.图的遍历有深度遍历算法和广度遍历算法,程序如下: #include <iostream> //#include <malloc.h> #define INFINITY 32767 ...

大姚县15624451841: C语言 数据结构 二叉树层次遍历 -
谯庭亿菲: #include "stdio.h" #include "stdlib.h"typedef struct btnode//二叉链表类型定义 {char data;struct btnode *lchild,*rchild; }bintree,*Bintree; typedef struct LinkQueueNode//链队列类型定义 {bintree *data;struct LinkQueueNode *next; }LKQueNode...

大姚县15624451841: C语言图的遍历. -
谯庭亿菲: #include <iostream> #define INFINITY 32767 #define MAX_VEX 20 //最大顶点个数 #define QUEUE_SIZE (MAX_VEX+1) //队列长度 using namespace std; bool *visited; //访问标志数组 //图的邻接矩阵存储结构 typedef struct{ char *vexs; //顶点...

大姚县15624451841: 用c语言编一个算法 按层次遍历二叉树的结点? -
谯庭亿菲: #include#include// 定义队列的最大长度#define QUEUE_LENGTH 100//// 二叉树与双向链表数据结构定义,// typedef struct struNode { int data; struct struNode *lchild; //二叉树中的左子树或双向链表中的前向指针 struct struNode*rchild; //二叉树...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网