邻接矩阵的深度优先遍历

废话不多说,直接看代码

t#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INFINITY INT_MAX
#define  MAX_VERTEX_NUM 20
bool visted[MAX_VERTEX_NUM]; 
typedef char VertexType; 
typedef int VRType; 
typedef int QElemType;
typedef enum {
DG,DN,AG,AN
}Graphkind;
typedef struct ArcCell{//表征图的连接关系  
VRType adj;            //连接关系  
ArcCell *info;         //附加信息  
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{VertexType vexs[MAX_VERTEX_NUM];//顶点的类型 AdjMatrix arcs;//邻接矩阵 int vexnum,arcnum;//图的顶点数,边数 Graphkind kind;//图的类型 
}Mgraph;
typedef struct QNode{//队列节点 QElemType data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;//队列指针 void InitQueue(LinkQueue *Q) {//初始化队列 (*Q).rear= (*Q).front=(QueuePtr)malloc(sizeof(QNode)) ;if(!(*Q).front)exit(-1);(*Q).front->next=NULL;}void EnQueue(LinkQueue *Q,QElemType e){//入队操作 //if(((*Q).rear+1)%MAXQSIZE==(*Q).front)//exit(-1);QueuePtr p;(p)=(QueuePtr)malloc(sizeof(QNode)) ;p->data=e;p->next=NULL;(*Q).rear->next=p;(*Q).rear=p;}void DeQueue(LinkQueue *Q,QElemType *e){//出队操作 //	if((*Q).front==(*Q).rear)//	exit(-1);QueuePtr p;if((*Q).front==(*Q).rear)exit(-1);p=(*Q).front->next;(*e)=p->data;(*Q).front->next=p->next;if((*Q).rear==p){(*Q).rear=(*Q).front;free(p);}}int QueueEmpty(LinkQueue Q){//判断队列是否为空 if((Q).front==(Q).rear)return 1;return 0;}
void CreateG(Mgraph &G,int kind)             //创建图  
{  int i,j;  printf("Construct the Graph...\n");  if(kind ==1){G.vexnum=8;  G.arcnum=9; G.kind= AG;
}else{G.vexnum=8;  G.arcnum=12; G.kind= DG;}for(i=0;i<MAX_VERTEX_NUM;i++)    //邻接矩阵的初始化  {  for(j=0;j<MAX_VERTEX_NUM;j++)  {  G.arcs[i][j].adj=0;  G.arcs[i][j].info=NULL;  }  }  G.vexs[0]='a';                //顶点赋值  G.vexs[1]='b';  G.vexs[2]='c';  G.vexs[3]='d';  G.vexs[4]='e';  G.vexs[5]='f';  G.vexs[6]='g';  G.vexs[7]='h';  if(kind ==1){G.arcs[0][1].adj=1;             //邻接矩阵赋值  G.arcs[0][1].info=NULL;  G.arcs[1][0].adj=1;  G.arcs[1][0].info=NULL;  G.arcs[1][3].adj=1;  G.arcs[1][3].info=NULL;  G.arcs[3][1].adj=1;  G.arcs[3][1].info=NULL;  G.arcs[3][7].adj=1;  G.arcs[3][7].info=NULL;  G.arcs[7][3].adj=1;  G.arcs[7][3].info=NULL;  G.arcs[4][7].adj=1;  G.arcs[4][7].info=NULL;  G.arcs[7][4].adj=1;  G.arcs[7][4].info=NULL;  G.arcs[4][1].adj=1;  G.arcs[4][1].info=NULL;  G.arcs[1][4].adj=1;  G.arcs[1][4].info=NULL;  G.arcs[0][2].adj=1;  G.arcs[0][2].info=NULL;  G.arcs[2][0].adj=1;  G.arcs[2][0].info=NULL;  G.arcs[2][5].adj=1;  G.arcs[2][5].info=NULL;  G.arcs[5][2].adj=1;  G.arcs[5][2].info=NULL;  G.arcs[2][6].adj=1;  G.arcs[2][6].info=NULL;  G.arcs[6][2].adj=1;  G.arcs[6][2].info=NULL;  G.arcs[5][6].adj=1;  G.arcs[5][6].info=NULL;  G.arcs[6][5].adj=1;  G.arcs[6][5].info=NULL;  }else{G.arcs[0][1].adj=1;             //邻接矩阵赋值  G.arcs[0][1].info=NULL;  G.arcs[0][3].adj=1;             //邻接矩阵赋值  G.arcs[0][3].info=NULL;  G.arcs[1][2].adj=1;  G.arcs[1][2].info=NULL; G.arcs[2][5].adj=1;  G.arcs[2][5].info=NULL; G.arcs[2][3].adj=1;  G.arcs[2][3].info=NULL; G.arcs[3][4].adj=1;  G.arcs[3][4].info=NULL; G.arcs[4][2].adj=1;  G.arcs[4][2].info=NULL; G.arcs[4][6].adj=1;  G.arcs[4][6].info=NULL; G.arcs[5][4].adj=1;  G.arcs[5][4].info=NULL; G.arcs[5][7].adj=1;  G.arcs[5][7].info=NULL; G.arcs[6][7].adj=1;  G.arcs[6][7].info=NULL;G.arcs[7][4].adj=1;  G.arcs[7][4].info=NULL; } printf("Construction of Graph OK!\n\n");  return;  
}
void ShowAdjMat(Mgraph G)           //邻接矩阵的显示  
{  int i,j;  printf("The adjacent matrix is:\n");  for(i=0;i<G.vexnum;i++)  {  for(j=0;j<G.vexnum;j++)  {  printf("%d ",G.arcs[i][j].adj);  }  printf("\n");  }  printf("\n");  return;  
}  
int GetNextVertex(Mgraph G,int v)   //获取下一顶点  
{  int i;  for(i=0;i<G.vexnum;i++)  {  if(G.arcs[v][i].adj==1&& visted[i]==false)  {  return i;  }  }  return -1;  
}  
void DFS(Mgraph G,int v)            //深度优先搜索  
{  int i;  int nextid;  printf("%c ",G.vexs[v]);  visted[v]=true;  while(1)  {  nextid=GetNextVertex(G,v);  if(nextid!=-1 && visted[nextid]==false)  {  DFS(G,nextid);  }  else  {  break;  }  }  }  void DFSTraverse(Mgraph G)          //深度优先搜索  
{  int i;  printf("The depth first traverse result is:\n");  for(i=0;i<G.vexnum;i++)  {  visted[i]=false;  }  for(i=0;i<G.vexnum;i++)  {  if(visted[i]!=true)  {  DFS(G,i);  }  }  
}  void BFSTraverse(Mgraph G){int v,w,u;LinkQueue Q; for(v=0;v<G.vexnum;++v) visted[v]=false;InitQueue(&Q); //置空的辅助队列Qprintf("The depth first traverse result is:\n");  for(v=0;v<G.vexnum;++v)if(!visted[v]) { //v尚未访问visted[v]=true;printf("%c ",G.vexs[v]); EnQueue(&Q,v);while(!QueueEmpty(Q)) {DeQueue(&Q,&u);//队头元素出队并置为ufor(w=u; w>=0; w=GetNextVertex(G,u))if(!visted[w]) { //w为u的尚未访问的邻接顶点visted[w]=true;printf("%c ",G.vexs[w]); EnQueue(&Q,w);}//if}//while}//if
}int main()  
{  Mgraph G,G2;  printf("无向图:\n");CreateG(G,1);  ShowAdjMat(G);  DFSTraverse(G);  printf("\n\n");printf("有向图:\n");  CreateG(G2,2);  ShowAdjMat(G2);  BFSTraverse(G2);  printf("\n\n"); system("pause");  return 0;  
}  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中使用GDB调试NS2

在使用ns2过程中&#xff0c;避免不了要修改或者添加一些模块&#xff0c;对C代码进行改动。编写好自己的功能模块以后&#xff0c;进行编译执行。但通常不会这么容易通过&#xff0c;经常会出现编译可以通过&#xff0c;但执行是会出错。比较常见的是“段错误”&#xff0c;因…

LeetCode 291. 单词规律 II(回溯)

文章目录1. 题目2. 解题1. 题目 给你一种规律 pattern 和一个字符串 str&#xff0c;请你判断 str 是否遵循其相同的规律。 这里我们指的是 完全遵循&#xff0c;例如 pattern 里的每个字母和字符串 str 中每个 非空 单词之间&#xff0c;存在着双向连接的对应规律。 示例1:…

python中的可迭代对象

迭代是访问集合元素的⼀种⽅式。迭代器是⼀个可以记住遍历的位置的对象。迭代器对象从集合的第⼀个元素开始访问&#xff0c;直到所有的元素被访问完结束。迭代器只能往前不会后退。 1. 可迭代对象 我们已经知道可以对list、tuple、str等类型的数据使⽤for...in...的循环语…

二叉排序树删除子节点以及遍历

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef int TElemType; int m,n; typedef struct BiTNode {//树节点的建立 TElemType data ;struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; int SearchBST(BiTree T,int key,BiTree f,BiTr…

LeetCode 1548. The Most Similar Path in a Graph(动态规划)

文章目录1. 题目2. 解题1. 题目 We have n cities and m bi-directional roads where roads[i] [ai, bi] connects city ai with city bi. Each city has a name consisting of exactly 3 upper-case English letters given in the string array names. Starting at any city…

UAC执行批处理,进行提示

很简单&#xff0c;直接在批处理文件中前面加入下面这段 echo off:: BatchGotAdmin :------------------------------------- REM --> Check for permissions >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system…

python中的iter()函数与next()函数

list、tuple等都是可迭代对象&#xff0c;我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使⽤next()函数来获取下⼀条数据。iter()函数实际上就是调⽤了可迭代对象的 __iter__ ⽅法。 >>> li [11, 22, …

vs.net打包生成可执行文件的方法

用vs.net对应用打包:1.打开VS.NET开发环境;2."文件"->"新建"->"项目";3."项目类型"选"安装和部署项目","模板"选"Web安装项目",然后填写"名称"和"位置",最后"确定"…

LeetCode 358. K 距离间隔重排字符串(贪心+优先队列)

文章目录1. 题目2. 解题1. 题目 给你一个非空的字符串 s 和一个整数 k&#xff0c;你要将这个字符串中的字母进行重新排列&#xff0c;使得重排后的字符串中相同字母的位置间隔距离至少为 k。 所有输入的字符串都由小写字母组成&#xff0c;如果找不到距离至少为 k 的重排结果…

python中的迭代器Iterator

迭代器是⽤来帮助我们记录每次迭代访问到的位置&#xff0c;当我们对迭代器使⽤next()函数的时候&#xff0c;迭代器会向我们返回它所记录位置的下⼀个位置的数据。实际上&#xff0c;在使⽤next()函数的时候&#xff0c;调⽤的就是迭代器对象的 __next__ ⽅法&#xff08…

建立一颗二叉排序树,并删除该二叉排序树上的某个节点

设计并验证如下算法&#xff1a;而擦函数采用二叉链表结构表示&#xff0c;按输入的关键字序列建立一颗二叉排序树&#xff0c;并删除该二叉排序树上的某个节点。 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int TElemType; int m,n…

LeetCode 1153. 字符串转化(哈希)

文章目录1. 题目2. 解题1. 题目 给出两个长度相同的字符串&#xff0c;分别是 str1 和 str2。请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化后变成字符串 str2。 每一次转化时&#xff0c;将会一次性将 str1 中出现的 所有 相同字母变成其他 任何 小写英文字母&#x…

使用数据库恢复专家,修复数据库

参考文章: http://www.cnblogs.com/arcer/admin/EditPosts.aspx?postid3118718&update1转载于:https://www.cnblogs.com/arcer/archive/2013/06/05/3118823.html

for循环利用可迭代对象与迭代器完成工作的本质

for循环工作本质 for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable 的迭代器&#xff0c;然后对获取到的迭代器不断调⽤next()⽅法来获取下⼀个值并将其 赋值给item&#xff0c;当遇到StopIteration的异常后循环结束。 li [100, 200, 300] #…

哈希表的构造和查找算法

实现哈希表的构造和查找算法&#xff0c;要求&#xff1a;用除留余数法构造哈希函数&#xff0c;分别用一次探测再散列、二次探测再散列解决冲突。 #include<stdio.h> #include<stdlib.h> #include<math.h> /*typedef struct {ElemType *elem;int count;int …

LeetCode 727. 最小窗口子序列(滑动窗口)

文章目录1. 题目2. 解题1. 题目 给定字符串 S and T&#xff0c;找出 S 中最短的&#xff08;连续&#xff09;子串 W &#xff0c;使得 T 是 W 的 子序列 。 如果 S 中没有窗口可以包含 T 中的所有字符&#xff0c;返回空字符串 “”。 如果有不止一个最短长度的窗口&#x…

利用python自定义完整版迭代器

classMyList(object): """自定义的可迭代对象,迭代器 容器""" def __init__(self): self.container [] self.i 0 def add(self, item): """向对象中添加数据""" self.container.append(item) def __next__(self…

GHOSTXP_SP3电脑公司快速安装机版V2013

GHOSTXP_SP3电脑公司快速安装机版V2013下载地址&#xff1a;http://www.xiazaijidi.com/xp/dngs/1.html文件名称:GHOSTXP_SP3电脑公司特别版_V2012_05.iso文件大小:683.74MD5: 6182CC641025BA15AC43689E04ED5961SHA1: D5675FF901CBDCC27FDB9B5DD937DE145FEE8B33CRC32: C5B13EF2…

LeetCode 1035. 不相交的线(最长公共子序列DP)

文章目录1. 题目2. 解题1. 题目 我们在两条独立的水平线上按给定的顺序写下 A 和 B 中的整数。 现在&#xff0c;我们可以绘制一些连接两个数字 A[i] 和 B[j] 的直线&#xff0c;只要 A[i] B[j]&#xff0c;且我们绘制的直线不与任何其他连线&#xff08;非水平线&#xff0…

python中迭代器的应用场景

1.迭代器的应用场景 1). 如果数列的数据规模巨大 2). 数列有规律&#xff0c;但是依靠列表推导式描述不出来 2.数学中有个著名的斐波拉契数列&#xff08;Fibonacci&#xff09;&#xff0c;数列中第⼀个数0&#xff0c;第⼆个数1&#xff0c;其后的每⼀个数都可由前两个数相…