2021-06-15 C语言邻接表实现图的深度遍历

#include<stdio.h>
#include<malloc.h> 
#include<stdlib.h>
#include<string.h>
#define MAX 100


//次级结点存储信息
typedef struct ArcNode{
	int adjvex; //节点编号 
	struct ArcNode *next; 
}ArcNode;
//初级结点存储信息
typedef struct VNode{
	char vertex[5];//结点信息 
	ArcNode *link;
}VNode;
//边结点信息,用来表示一条边
typedef struct Bian{
	char one[5];
	char two[5];
}Bian;
typedef struct{
	VNode adjList[MAX];
	int vexnum; //顶点数 
	int arcnum; //边数 
	Bian bian[MAX];// 
}ALGraph;
int visit[MAX];
//返回的是第几个顶点
int PanDuan(char n[5],ALGraph &G) 
{
	for(int i = 0;i<G.vexnum;i++)
	{
		if(strcmp(n,G.adjList[i].vertex)==0)
		return i;
	}
	printf("没有找到相关顶点,图的信息有误!\n");
	return 0;
}
//输入图的相关信息
ALGraph Input(ALGraph G)
{
	int i;
	char haha[4];
	printf("请输入图的顶点数:");
	scanf("%d",&G.vexnum);
	printf("请输入图的所有顶点信息:(顶点名字:例如V1,V2)");
	for(i = 0;i<G.vexnum;i++)
	{
		scanf("%s",G.adjList[i].vertex);
		G.adjList[i].link = NULL;
	}
	printf("请输入图的边数:");
	scanf("%d",&G.arcnum);
	printf("请输入图的所有边信息:(两个顶点表示边,点中间空格隔开,边之间空格隔开)\n");
	for(i=0;i<G.arcnum;i++)
	{
		scanf("%s %s",G.bian[i].one,G.bian[i].two);
		getchar();
	}
	printf("输入完毕\n\n");
	return G;
} 

//构成结点
void Jiedian(int n,int n1,ALGraph &G)
{
	ArcNode *p,*q;
     q=(ArcNode *)malloc(sizeof(ArcNode));      //开辟 节点 空间
      if(!q)                      //判断开辟节点 是否 成功
      {
        printf("节点生成错误!返回主函数\n");
        return;
      }
      q->adjvex = n1;
      q->next = NULL;
    if(G.adjList[n].link==NULL)
    {
      //结点是否第一次使用
      G.adjList[n].link=q;
    }
    else
    {
      p = G.adjList[n].link;
      while(p->adjvex<q->adjvex&&p->next!=NULL)
      {
      	 p = p->next;
	  }
	  q->next = p->next;
	  p->next = q;
	}
 } 
//构成图的邻接表存储结构
void CreateMGraph(ALGraph &G)
{
	int i,one1,two1;
	for(i = 0;i<G.arcnum;i++)
	{
		one1 = PanDuan(G.bian[i].one,G);
		two1 = PanDuan(G.bian[i].two,G);
		Jiedian(one1,two1,G);
		Jiedian(two1,one1,G);	
	}	
	printf("图的邻接表构成完毕!\n\n"); 
} 
//输出图的邻接表存储信息
void OutputMGraph(ALGraph &G)
{
	ArcNode  *p;
	for(int i = 0;i<G.vexnum;i++)
	{
		p = G.adjList[i].link;
		printf("序号|%d|顶点|%s|的连接点有:",i+1,G.adjList[i].vertex);
		while(p)
		{
			printf("-->序号|%d|",p->adjvex+1);
			p = p->next;	
		}
		printf("\n"); 
	}
	printf("图的邻接表输出完毕!\n");
 }
//输出图的深度遍历优先遍历顺序
void DFS(int i,ALGraph &G)
{
	printf("%s  ",G.adjList[i].vertex);//输出初级结点信息
	visit[i] = 1;//遍历过的点进行标记 
	ArcNode *p;
	p = G.adjList[i].link;//用于遍历次级结点
	while(p != NULL)
	{
		if(G.adjList[i].link && visit[p->adjvex]!=1)
		{
			DFS(p->adjvex,G);
		}
		p = p->next;
	}
}

void DFStraversal(ALGraph &G)
{
	char haha[5];
	printf("请输入开始便利的第一个结点:");
	scanf("%s",haha);
	printf("深度优先遍历的结果为:");
	int i;
	for(i = 0;i<G.vexnum;i++)
	{
		//找到开始遍历的第一个结点开始遍历 
		if(strcmp(G.adjList[i].vertex,haha)==0)
		{
			DFS(i,G);
			break;
	    }
	}
	for(i = 0;i<G.vexnum;i++)//消去被标记的点
	{
		visit[i] = 0;
	}
	printf("遍历完成!\n"); 
}

//退出
void TuiChu()
{
	printf("成功退出!\n");	
}
//主函数 
int main()
{
 	int choice;
 	printf("请输入你的选择:");
 	ALGraph G;
    while(true)                  //无限 使用 本程序
    {
      printf("********欢迎使用图的深度优先遍历程序********\n");   //用户界面
      printf("*****输入图的相关信息,构成邻接表    请输入 1*****\n");
      printf("*****输出图的邻接表存储信息  请输入 2*****\n");
      printf("*****输出图的深度优先遍历顺序  请输入 3*****\n");
      printf("*****退出        请输入 0*****\n");
      printf("请输入您的选择:");
      scanf("%d",&choice);
      if(choice>3||choice<0)          //异常判断   不要这个 也行
      {
        printf("请输入0~4之间的数字!请重新输入!\n\n");
        continue;
      }
      switch(choice)        //选择哪一个操作
      {
      case 1:       G=Input(G);
      				CreateMGraph(G);
        break;
      case 2:      OutputMGraph(G);
        break;
      case 3:      DFStraversal(G);
      
        break;
      case 0:      TuiChu();
        exit(0);
      }
    }
    return 0;
}

在这里插入代码片

输入在这里插入图片描述
输出
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值