C语言数据结构之图的遍历实例详解

C语言数据结构之图的遍历实例详解

输入一组顶点,建立无向图的邻接矩阵。输入一组顶点,建立有向图的邻接表。分别对无向图和有向图进行DFS(深度优先遍历)和BFS(广度优先遍历)。写出深度优先遍历的递归和非递归算法。根据建立的有向图,判断该图是否是有向无环图,若是,则输出其一种拓扑有序序列。

实现代码:

#include <stdio.h>
#include <stdlib.h>
#define MAX 20 

typedef struct ArcNode{
  int adjvex;
  struct ArcNode *nextarc;
}ArcNode; 

typedef struct{
  char data;
  ArcNode *firstarc;
}AdjList[MAX]; 

typedef struct{
  AdjList vertices;
  int vexnum;
  int arcnum;
}ALGraph; 

typedef struct{
  int *base;
  int front,rear;
}CqQueue; 

void InitQueue(CqQueue &Q)
{//初始化一个队列
  Q.base=(int*)malloc(MAX*sizeof(int));
  Q.front=Q.rear=0;
} 

int QueueEmpty(CqQueue Q)
{//判断队列是否为空
  if(Q.rear==Q.front)
    return 1;
  return 0;
} 

void EnQueue(CqQueue &Q,int e)
{//入队操作
  if((Q.rear+1)%MAX==Q.front)
    return;
  Q.base[Q.rear]=e;
  Q.rear=(Q.rear+1)%MAX;
} 

void DeQueue(CqQueue &Q,int &e)
{//出队操作
  if(Q.rear==Q.front)
    return;
  e=Q.base[Q.front];
  Q.front=(Q.front+1)%MAX;
} 

int LocateVex(ALGraph G,char v)
{//查找顶点v在图G中的位置
  for(int i=0;i<G.vexnum;i++)
    if(G.vertices[i].data==v)
      return i;
  return -1; 

  for(int i=0;i<G.vexnum;i++)
    if(G.vexs[i]==v)
      return i;
  return -1;
} 

void CreateAdjList(ALGraph &G)
{//建立无向图的邻接表
  int v,i,j,k;
  char v1,v2;
  ArcNode *p,*s;
  printf("输入无向图的顶点数和边数:\n");
  scanf("%d%d",&G.vexnum,&G.arcnum);
  getchar();
  printf("输入图的顶点信息:\n");
  for(v=0;v<G.vexnum;v++){
    scanf("%c",&G.vertices[v].data);getchar();
    G.vertices[v].firstarc=NULL;
  } 

  printf("输入无向图的边:\n");
  for(k=0;k<G.vexnum;k++){
    scanf("%c%c",&v1,&v2);
    getchar();
    i=LocateVex(G,v1);
    j=LocateVex(G,v2);
    s=(ArcNode*)malloc(sizeof(ArcNode));
    s->adjvex=j;
    s->nextarc=NULL;
    if(!G.vertices[i].firstarc)
      G.vertices[i].firstarc=s;
    else{
      p=G.vertices[i].firstarc;
      while(p->nextarc)
        p=p->nextarc;
      p->nextarc=s;
    }
    s=(ArcNode*)malloc(sizeof(ArcNode));
    s->adjvex=i;
    s->nextarc=NULL;
    if(!G.vertices[j].firstarc)
      G.vertices[j].firstarc=s;
    else{
      p=G.vertices[j].firstarc;
      while(p->nextarc)
        p=p->nextarc;
      p->nextarc=s;
    }
  }
} 

int visited[MAX]; 

void DFS(ALGraph G,int v)
{//从顶点v开始对图G进行深度优先搜索
  ArcNode *p;
  printf("%3c",G.vertices[v].data);
  visited[v]=1;
  for(p=G.vertices[v].firstarc;p;p=p->nextarc)
    if(!visited[p->adjvex])
      DFS(G,p->adjvex);
} 

void DFSTraverse(ALGraph G)
{//对用邻接表存储的无向图G进行深度优先遍历
  int v;
  for(v=0;v<G.vexnum;v++)
    visited[v]=0;
  for(v=0;v<G.vexnum;v++)
    if(!visited[v])
      DFS(G,v);
} 

void BFSTraverse(ALGraph G)
{//对用邻接表存储的无向图G进行深度优先遍历
  int u,v;
  CqQueue Q;
  ArcNode *p;
  for(v=0;v<G.vexnum;v++)
    visited[v]=0;
  InitQueue(Q);
  for(v=0;v<G.vexnum;v++)
    if(!visited[v]){
      printf("%3c",G.vertices[v].data);
      visited[v]=1;
      EnQueue(Q,v);
      while(!QueueEmpty(Q)){
        DeQueue(Q,u);
        for(p=G.vertices[u].firstarc;p;p=p->nextarc)
          if(!visited[p->adjvex]){
            printf("%3c",G.vertices[p->adjvex].data);
            visited[p->adjvex]=1;
            EnQueue(Q,p->adjvex);
          }
      }
    }
} 

int main(){
  ALGraph G;
  printf("建立无向图的邻接表:\n");
  CreateAdjList(G);
  printf("无向图的深度优先遍历序列如下:\n");
  DFSTraverse(G);
  printf("\n\n无向图的广度优先遍历序列如下:\n");
  BFSTraverse(G);
  printf("\n");
  return 0;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C语言数据结构实现银行模拟

    C语言数据结构实现银行模拟 实现代码: #include <stdio.h> #include <stdlib.h> #include <windows.h> #define MAX_WIN 20 #define MAX_STAY 100 typedef struct customer *link; struct customer { int stay; link next; }; link GUY(int stay, link next) { link c = mal

  • C语言数据结构之双向循环链表的实例

    数据结构之双向循环链表 实例代码: #include <stdlib.h> #include <stdio.h> #include <malloc.h> typedef struct Node{ struct Node *pNext; int data; struct Node *prior; } NODE,*PNODE; PNODE CreatList(); void TreNode(PNODE pHead); bool isEmpty(PNODE pHead); i

  • C语言数据结构树的双亲表示法实例详解

    1.树的双亲表示法: 树的双亲表示法 2./* bo6-4.c 树的双亲表存储(存储结构由c6-4.h定义)的基本操作(14个) */ Status InitTree(PTree *T) { /* 操作结果: 构造空树T */ (*T).n=0; return OK; } void DestroyTree() { /* 由于PTree是定长类型,无法销毁 */ } typedef struct { int num; TElemType name; }QElemType; /* 定义队列元素类型

  • C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 #include <stdio.h> /* 将两个数据交换 */ void swap(int* Ina , int* Inb) { int temp = *Ina; *Ina = *Inb; *Inb = temp; } /* 进行一趟的快速排序,把一个序列分为两个部分 */ int getPart

  • C语言 数据结构链表的实例(十九种操作)

    C语言 数据结构链表的实例(十九种操作) #include <stdio.h> #include <string.h> #include <stdlib.h> /*************************************************************************************/ /* 第一版博主 原文地址 http://www.cnblogs.com/renyuan/archive/2013/05/21/30915

  • C语言数据结构树之后序遍历的实现

    后续遍历的实现: 数据结构树中的后续遍历,这里提供简单实例,代码中有注释,大家参考下! 看下实现效果: 题目及分析 给定树的先序遍历和中序遍历,求后续遍历 输入 abdec dbeac 输出 debca 三.实现代码: #include <iostream> #include <string> using namespace std; string s1="abdec";//先序遍历 string s2="dbeac";//中序遍历 void

  • C语言中数据结构之链表归并排序实例代码

    C语言中数据结构之链表归并排序实例代码 问题 设有两个无头结点的单链表,头指针分别为ha,hb,链中有数据域data,链域next,两链表的数据都按递增排序存放,现要求将hb表归到ha表中,且归并后ha仍递增序,归并中ha表中已有的数据若hb中也有,则hb中的数据不归并到ha中,hb的链表在算法中不允许破坏. 源程序 #include <stdio.h> #include<stdlib.h> #define N1 6 /*链表La的长度*/ #define N2 6 /*链表Lb的

  • C语言数据结构之循环链表的简单实例

     C语言数据结构之循环链表的简单实例 实例代码: # include <stdio.h> # include <stdlib.h> typedef struct node //定义链表中结点的结构 { int code; struct node *next; }NODE,*LinkList; /*错误信息输出函数*/ void Error(char *message) { fprintf(stderr,"Error:%s/n",message); exit(1)

  • C语言数据结构之图的遍历实例详解

    C语言数据结构之图的遍历实例详解 输入一组顶点,建立无向图的邻接矩阵.输入一组顶点,建立有向图的邻接表.分别对无向图和有向图进行DFS(深度优先遍历)和BFS(广度优先遍历).写出深度优先遍历的递归和非递归算法.根据建立的有向图,判断该图是否是有向无环图,若是,则输出其一种拓扑有序序列. 实现代码: #include <stdio.h> #include <stdlib.h> #define MAX 20 typedef struct ArcNode{ int adjvex; st

  • Go语言数据结构之单链表的实例详解

    目录 任意类型的数据域 实例01 快慢指针 实例02 反转链表 实例03 实例04 交换节点 实例05 任意类型的数据域 之前的链表定义数据域都是整型int,如果需要不同类型的数据就要用到 interface{}. 空接口 interface{} 对于描述起不到任何的作用(因为它不包含任何的method),但interface{}在需要存储任意类型的数值的时候相当有用,因为它可以存储任意类型的数值. 一个函数把interface{}作为参数,那么它可以接受任意类型的值作为参数:如果一个函数返回i

  • C#数据结构之单链表(LinkList)实例详解

    本文实例讲述了C#数据结构之单链表(LinkList)实现方法.分享给大家供大家参考,具体如下: 这里我们来看下"单链表(LinkList)".在上一篇<C#数据结构之顺序表(SeqList)实例详解>的最后,我们指出了:顺序表要求开辟一组连续的内存空间,而且插入/删除元素时,为了保证元素的顺序性,必须对后面的元素进行移动.如果你的应用中需要频繁对元素进行插入/删除,那么开销会很大. 而链表结构正好相反,先来看下结构: 每个元素至少具有二个属性:data和next.data

  • Python数据结构之图的存储结构详解

    一.图的定义 图是一种比树更复杂的一种数据结构,在图结构中,结点之间的关系是任意的,任意两个元素之间都可能相关,因此,它的应用极广.图中的数据元素通常被称为顶点 ( V e r t e x ) (Vertex) (Vertex), V V V是顶点的有穷非空集合, V R VR VR是两个顶点之间的关系的集合(可以为空),可以表示为图 G = { V , { V R } } G=\{V,\{VR\}\} G={V,{VR}}. 二.相关术语 2.1 无向图 给定图 G = { V , { E }

  • C语言中枚举与指针的实例详解

     C语言中枚举与指针的实例详解 总结一下, 定义枚举,用typedef enum关键字, 比如 typedef enum{Red,Green,Blue} Color3; 枚举到数值的转换,如果没有指定代表数值就是从0开始算, 比如 Color3 c=Red; printf("%d",c);会显示0, 除非指定 如typedef enum{Red=3,Green=5,Blue=10} Color3; 关于类型指针的定义, 定义的时候在变量名左边加*代表此变量只是一个空指针而已, 若需要赋

  • Bootstrap carousel轮转图的使用实例详解

    图片轮播效果在Web中常常能看到,很多人也称之为幻灯片.其主要显示的效果就是多幅图片轮回播放,从右向左播放,鼠标悬停在图片时会暂停播放,如果鼠标悬停或单击右下角圆点时,会显示对应的图片. 这种图片轮播效果,在Bootstrap框架中是通过Carousel插件来实现 演示效果截图: 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <!-- <link rel=&q

  • C语言模拟实现atoi函数的实例详解

    C语言模拟实现atoi函数的实例详解 atoi函数,主要功能是将一个字符串转变为整数,例如将"12345"–>12345.但在实现过程中,我们难免会因为考虑不够全面而漏掉比较重要的几点,今天就总结一下实现atoi函数需要注意的地方. 1.指针为NULL 2.字符串为空字符串 3.空白字符 4.正号与负号问题 5.溢出问题 6.异常字符处理 接下来看代码:(具体几种问题处理都在代码的注释中说明) #define _CRT_SECURE_NO_WARNINGS 1 #include

  • C语言实现静态顺序表的实例详解

    C语言实现静态顺序表的实例详解 线性表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. 接下来看看静态的顺序表,直接上代码: SeqList.h #define _CRT_SECURE_NO_WARNINGS 1 #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include <stdio.h> #include <stdlib.h&g

  • R语言对数据库进行操作的实例详解

    数据是关系数据库系统以规范化格式存储. 因此,要进行统计计算,我们将需要非常先进和复杂的Sql查询. 但R语言可以轻松地连接到许多关系数据库,如MySql,Oracle,Sql服务器等,并从它们获取记录作为数据框. 一旦数据在R语言环境中可用,它就变成正常的R语言数据集,并且可以使用所有强大的包和函数来操作或分析. 在本教程中,我们将使用MySql作为连接到R语言的参考数据库. RMySQL包 R语言有一个名为"RMySQL"的内置包,它提供与MySql数据库之间的本地连接. 您可以使

  • Android sqlite cursor的遍历实例详解

    查询并获得了cursor对象后,用while(corsor.moveToNext()){}遍历,当corsor.moveToNext()方法调用,如果发现没有对象,会返回false public List<MMImage> getAll() { List<MMImage> list = new ArrayList<MMImage>(); Cursor c = null; try { c = database.query(TABLE, null, null, null,

随机推荐