首页 > 其他分享 >图子系统

图子系统

时间:2024-07-06 11:52:29浏览次数:5  
标签:adjlist EdgeNode int vi adjvex printf 子系统

#include "stdio.h"
#include "malloc.h"
#define MAX 100
typedef char VertexType;
int visited[MAX];

typedef struct node
{
	int adjvex;
	struct node *next;
}EdgeNode;

typedef struct vexnode
{
	VertexType data;
	EdgeNode *firstedge;
}VHeadNode;

typedef struct
{
	VHeadNode adjlist[MAX];
	int n,e;	
}AdjList;

void CreateAGraph(AdjList *g,int flag){
	int i,j,k;
	EdgeNode *p;
	if(flag == 0)
		printf("\n将建立一个无向图。\n");
	else
		printf("\n将建立一个有向图。\n");
	printf("请输入图的顶点数:");
	scanf("%d",&g->n);
	printf("请输入图的边数:");
	scanf("%d",&g->e);
	printf("请输入图的各顶点信息:\n");
	for(i = 0; i < g->n; i++){
		printf("第%d个顶点信息:",i+1);
		scanf("\n%c",&(g->adjlist[i].data));
		g->adjlist[i].firstedge = NULL;
	}
	printf("\n请输入边的信息,输入格式为:序号1,序号2(序号依次为0,1,2...):\n");
	for(k = 0;k < g->e ;k++){
		printf("请输入第%d条边:",k);
		scanf("\n%d,%d",&i,&j);
		p = (EdgeNode *) malloc (sizeof(EdgeNode));
		p->adjvex = j;
		p->next = g->adjlist[i].firstedge;
		g->adjlist[i].firstedge = p;
		if(flag == 0){
			p = (EdgeNode *) malloc (sizeof(EdgeNode));
			p->adjvex = i;
			p->next = g->adjlist[j].firstedge;
			g->adjlist[j].firstedge = p;
		}
	}	
}
void DispAGraph(AdjList *g){
	int i;
	EdgeNode *p;
	printf("\n图的邻接表表示如下:\n");
	for(i = 0;i < g->n; i++){
		printf("%2d [%c]",i,g->adjlist[i].data);
		p = g->adjlist[i].firstedge;
		while(p != NULL){
			printf("-->[%d]",p->adjvex);
			p = p->next;
		}
		printf("\n"); 
	}
}
void DFS(AdjList *g,int vi){
	EdgeNode *p;
	printf("(%d,",vi);
	printf("%c)",g->adjlist[vi].data);
	visited[vi] = 1;
	p = g->adjlist[vi].firstedge;
	while(p != NULL){
		if(visited[p->adjvex] == 0)
			DFS(g,p->adjvex);
		p = p->next;
	}
}
void BFS(AdjList *g,int vi)
{
	int i,v,visited[MAX];
	int qu[MAX],front = 0,rear = 0;
	EdgeNode *p;
	for(i = 0;i < g->n;i++)
		visited[i] = 0;
	printf("(%d,",vi);
	printf("%c)",g->adjlist[vi].data);
	visited[vi] = 1;
	rear = (rear+1) % MAX;
	qu[rear] = vi;
	while(front != rear){
		front = (front+1) % MAX;
		v = qu[front];
		p = g->adjlist[v].firstedge;
		while(p != NULL)
		{
			if(visited[p->adjvex] == 0)
			{
				visited[p->adjvex] = 1;
					printf("(%d,",p->adjvex);
				printf("%c)",g->adjlist[p->adjvex].data);
				rear = (rear+1) % MAX;
				qu[rear] = p->adjvex;
			}
			p = p->next;
		}
	}
}
void MenuGraph()
{ 	
	printf("\n                         图子系统");
	printf("\n ================================================");
	printf("\n                     1--更新邻接表     	        |");
	printf("\n                     2--深度优先遍历            |");
	printf("\n                     3--广度优先遍历            |");	
	printf("\n                     0--返回                    |");
	printf("\n ================================================");
	printf("\n请输入菜单号(0-3):"); 
}

main()
{
	int i,f;
	char ch1,ch2,a;
	AdjList g;
	ch1='y';
	while(ch1=='y' || ch1=='y')
	{
		MenuGraph();
		scanf("%c",&ch2);
		getchar();
		switch(ch2)
		{
			case '1':
				printf("要建立的是有向图(1)还是无向图(0),请选择(输入1或0):");
				scanf("%d",&f);
				CreateAGraph(&g,f);
				DispAGraph(&g);
				break;
			case '2':
				printf("请输入开始进行深度优先遍历的顶点序号(序号从0开始编号):");
				scanf("%d",&f);
				printf("\n从顶点%d开始的深度优先遍历序列为: ",f);
				for(i = 0;i < g.n;i++)
					visited[i] = 0;
				DFS(&g,f); 
				break; 
			case '3':
				printf("请输入开始进行广度优先遍历的顶点序号(序号从0开始编号):");
				scanf("%d",&i);
				printf("\n从顶点%d开始的深度优先遍历序列为: ",i);
				BFS(&g,i);
				break;					
			default:
				printf("输入有错误,请输入0~3进行选择!");
		}
		if(ch2!='0')
		{
			printf("\n按回车键继续,按任意键返回主菜单!\n");
			a=getchar();
			if(a!='\xA')
			{
				getchar();ch1='n';
			}
		}
	}
}

 

标签:adjlist,EdgeNode,int,vi,adjvex,printf,子系统
From: https://www.cnblogs.com/vayenge/p/17904878.html

相关文章

  • Linux remoteproc子系统(基于STM32MP157)概览
    remoteproc(RemoteProcessorFramework)用于管理异构远程处理器设备。这些设备通常在非对称多处理(AsymmetricMultiProcessing,AMP)配置中,可能运行不同的操作系统实例,包括Linux或其他实时操作系统的变体。remoteproc框架允许不同平台或架构控制远程处理器(例如,开启电源、加载固件......
  • 内存管理-11-buddy伙伴子系统-2-Per-CPU页帧缓存
    基于msm-5.4一、概述1.实现背景buddy子系统管理的物理页面,绝大多数都是放在zone::free_area[]中的链表中,少部分放在zone::lowmem_reserve[]中。还有少量页面放在zone::__percpupageset这个每CPU变量中,每种迁移类型也都对应一个链表,但是没有order,都是单页大小的内存块。......
  • 内存管理-11-buddy伙伴子系统-1-初探
    基于msm-5.4一、伙伴系统概述1.简介伙伴系统是物理内存的三大管理机制之一,另外两个是slab缓存和per-cpu页帧缓存。#####管理物理内存实际上就是管理page结构,将page添加到不同链表上进行管理。当用户申请内存的时候,从链表上拿一个page返还给用户,然后用户根据page可以找到对......
  • 不用虚拟机在Windows上安装Linux子系统(win11)
    打开终端输入以下命令查看是否支持安装systeminfo最底下是4个yes代表支持 在开始菜单输入如下搜索 打开拉到最底下,勾选这两个选项 按照提示重启电脑 打开终端输入以下命令会自动安装最新的Ubuntu发行版wsl--install可以通过如下命令查看其他版本wsl--list......
  • 如何在Windows11下部署Linux子系统中安装GCC编译器
    GCC编译器安装:1:gcc出现命令找不到2.直接按照提示来安装。会发现链接找不到服务器原因是因为默认的服务器在国外,无法直接进行访问,需要切换成国内的服务器3.切换软件源——换成国内的服务器注意:软件源要与版本号一致!演示所用均为22.04版本号,可根据版本号找对应的软件......
  • Linux驱动开发笔记(九)IIC子系统及其驱动
    文章目录前言一、IIC驱动框架二、总线驱动2.1iic总线的运行机制2.2重要数据结构2.2.1i2c_driver结构体2.2.2i2c总线结构体2.3匹配规则三、设备树的修改四、设备驱动的编写4.1相关API函数4.1.1i2c_add_adapter()4.1.2i2c_register_driver()4.1.3i2c_transfer......
  • 移植案例与原理 - startup子系统之bootstrap_lite服务启动引导部件(1)
    bootstrap_lite服务启动引导组件提供了各服务和功能的启动入口标识。在SAMGR(Systemabilitymanager,系统服务管理)启动时,会调用bootstrap_lite标识的入口函数,并启动系统服务。本文介绍下移植开发板时如何适配服务启动引导部件bootstrap_lite,并介绍下相关的运行机制原理。bo......
  • 嵌入式linux系统中SPI子系统driver与device分析02
       大家好,本篇文件继续分析,linux系统重SPI数据结构体,它的实际运行原理与方法。第一:SPI层次第二:SPI子系统结构体关系图spi_master(spi_controller):对Soc的SPI控制器的抽象spi_bus_type:spi的bus_type,代表了硬件上的SPIBusspi_device:spi从设备spi_driver:......
  • 使用pkg -r 命令选项向jail虚拟子系统里安装软件@FreeBSD
    刷FreeBSD论坛的时候,看到这样一招:使用pkg-r选项,往jail等虚拟机子系统里安装软件。jails-Howtoinstallapkgofflineintoajail?|TheFreeBSDForumsroot@fbhost:~#pkgpkg:notenoughargumentsUsage:pkg[-v][-d][-l][-N][-j<jailnameorid>|-c<chro......
  • 现在做一个圈子系统的优势,圈子系统基础玩法
    优势圈子是一个万能的信息聚合模型,可以复制扩展成各种商圈、黄页、部落、学校、家族等等,也有附近的圈子功能。这几年最火的是什么.就是微信群.但是现在群信群暴露出来的诸多的问题第一,里边信息混乱,虽然当时可以很方便的讨论一个话题,但是过后,别人不方便再继续讨论这个......