大学数据结构实验(五.图型结构的应用一)

大学程序实验.数据结构.图型结构的应用一.邻接矩阵一

0 目录

5 图型结构的应用

5.1 邻接矩阵一

5.1.1 题目

1、图的建立
从键盘输入数据建立图,并打印
实验要求:在程序中定义下述函数,并实现要求的函数功能:
CreateGraph(): 按从键盘输入数据建立图
PrintGrah():打印图
实验提示:
图的存储可采用邻接矩阵或邻接表;
打印出每一个顶点信息和邻接矩阵或邻接表
注意问题:
有向图,无向图,有向网,无向网任选一种。
2、深度优先遍历以及广度优先遍历
问题描述:从键盘输入数据建立图并打印深度优先遍历序列和广度优先遍历序列。
实验提示:
图的存储可采用邻接矩阵或邻接表;
有向图,无向图,有向网,无向网任选一种。
5、求一条从顶点 v 到顶点 s 的简单路径
实验提示:图的存储可采用邻接矩阵或邻接表;

5.1.2 源码

// MGraph.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "malloc.h" 

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXVEX 100
#define MAXSIZE 100
#define INFINITY INT_MAX

typedef int Status;
typedef char VertexType[10];
typedef int EdgeType;
typedef int Boolean;
typedef int QElemType;

typedef struct 
{
	VertexType vexs[MAXVEX];
	EdgeType arc[MAXVEX][MAXVEX];
	int numVertexs,numEdges;
}MGraph;

//广度遍历用队列结构体
typedef struct
{
	QElemType data[MAXSIZE];
    int front;
    int rear;
}Queue;

void CreateMGraph(MGraph *G)
{
	int i,j,k,w;
	printf("请输入顶点数和边数:\n");
	scanf("%d%d",&G->numVertexs,&G->numEdges);
	printf("\n");
	
	for(i=0;i<G->numVertexs;i++)
	{
		printf("顶点%d:",i+1);
        scanf("%s",G->vexs[i]);
	}

	for(i=0;i<G->numVertexs;i++)
	{
        for(j=0;j<G->numVertexs;j++)
		{
            G->arc[i][j]=0;//邻接矩阵初始化   
		}
	}
	printf("\n");

	for(k=0;k<G->numEdges;k++)
	{
        printf("请输入第%d条边(vi,vj)上的下标i,下标j和权w:\n",k+1);
		scanf("%d%d%d",&i,&j,&w);
		G->arc[i-1][j-1]=w;
		G->arc[j-1][i-1]=G->arc[i-1][j-1];//无向网
	}
}

void PrintMGraph(MGraph G)
{
	int i,j;
	printf("图的顶点为:\n");
	for(i=0;i<G.numVertexs;i++)
	{
        printf("顶点%d:%s\n",i+1,G.vexs[i]);
	}
    printf("\n");
    
	printf("邻接矩阵为:\n");
	for(i=0;i<G.numVertexs;i++)
	{ 
        for(j=0;j<G.numVertexs;j++)
		{
            printf(" %d",G.arc[i][j]);//打印图
		}
		printf("\n");
	}
}


Boolean visited[MAXSIZE];

void DFS(MGraph G,int i)//深度优先
{
    int j;
	visited[i]=TRUE;
	printf(" %s",G.vexs[i]);
	
	for(i=0;i<G.numVertexs;i++)
	{
        if(G.arc[i][j]==1&&!visited[j])
		{
             DFS(G,j);
		}
	}
}

void DFSTraverse(MGraph G)
{
	int i;
	for(i=0;i<G.numVertexs;i++)
	{
        visited[i]=FALSE;
	}

	for(i=0;i<G.numVertexs;i++)
	{
        if(!visited[i])
		{
            DFS(G,i);
		}
	}
}


//队列
Status InitQueue(Queue *Q)
{
    Q->front=0;
	Q->rear=0;
	return OK;
}

Status EnQueue(Queue *Q,QElemType e)
{
    if((Q->rear+1)%MAXSIZE==Q->front)
	{
		return ERROR;
	}
	Q->data[Q->rear]=e;
	Q->rear=(Q->rear+1)%MAXSIZE;

	return OK;
}

Status DeQueue(Queue *Q,QElemType *e)
{
    if(Q->front==Q->rear)
	{
        return ERROR;
	}

	*e=Q->data[Q->front];
	Q->front=(Q->front+1)%MAXSIZE;

	return OK;
}

Status QueueEmpty(Queue *Q)
{
	if(Q->front==Q->rear)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

void BFSTraverse(MGraph G)
{
    int i,j;
	Queue Q;

	for(i=0;i<G.numVertexs;i++)
	{
        visited[i]=FALSE;
	}

	//初始化队列
	InitQueue(&Q);

	for(i=0;i<G.numVertexs;i++)
	{
        if(!visited[i])
		{
            visited[i]=TRUE;
			printf(" %s",G.vexs[i]);
			EnQueue(&Q,i);
			while(!QueueEmpty(&Q))
			{  
                DeQueue(&Q,&i);
				for(j=0;j<G.numVertexs;j++)
				{
                    if(G.arc[i][j]==1&&!visited[j])
					{
                        visited[j]=TRUE;
						printf(" %s",G.vexs[j]);
						EnQueue(&Q,j);
					}
				}
			}
		}
	}
}

Status DFS_FindSimPath(MGraph G,VertexType *Path,int v,int s,int value)
{
    int i;
    visited[v]=TRUE;
	strcpy(Path[value],G.vexs[v]);//将顶点值存放数组中
	value++;

	if(v==s)
	{
		for(i=0;i<value;i++)
		{
            if(strcmp(Path[i],"\0")!=0)//比较字符串
			{
                printf("%s ",Path[i]);
			}
		}
		printf("\n");
	}
	else
	{
		for(i=0;i<G.numVertexs;i++)
		{
            if(G.arc[v][i]!=0&&G.arc[v][i]!=INFINITY&&!visited[i])
			{
                DFS_FindSimPath(G,Path,i,s,value);
			}
		}
	}
	visited[v]=FALSE;
	value--;

	return OK;
}

Status MGraphMenu()
{ 
    int value;
    
    printf("\n");
    printf(" ________图的操作________ \n");
    printf("|                        |\n");
    printf("|  1.打印顶点与邻接矩阵  |\n");
	printf("|  2.深度优先遍历打印    |\n");
	printf("|  3.广度优先遍历打印    |\n");
	printf("|  4.求v-s的简单路径     |\n");
	printf("|  5.退出                |\n");
	printf("|________________________|\n");
    printf("请输入你要进行的操作:");
    
	scanf("%d",&value); 
	return value;
}  

Status main()
{
	MGraph G;int RET;

	CreateMGraph(&G);
	printf("\n"); 
	
	label:
	RET=MGraphMenu();
	
	if(RET==1)
	{
		PrintMGraph(G);
		printf("\n");
		goto label; 
	}
	else if(RET==2)
	{
	    printf("\n");
 	    printf("深度优先遍历:\n");
	    DFSTraverse(G);
	    printf("\n");
	    goto label;
	}
	else if(RET==3)
	{
		printf("\n");
		printf("广度优先遍历:\n");
	    BFSTraverse(G);
	    printf("\n");
	    goto label;
	}
    else if(RET==4)
	{
	    int i,v,s,value;
	    VertexType a,b;
	    VertexType Path[G.numVertexs];
    	printf("请输入出发顶点:\n");
    	scanf("%s",a);
    	printf("请输入到达顶点:\n");
    	scanf("%s",b);
    	value=0;
	
    	for(i=0;i<G.numVertexs;i++)
    	{
            if(strcmp(G.vexs[i],a)==0)
    		{
    			v=i;
    		}
    		if(strcmp(G.vexs[i],b)==0)
    		{   
                s=i;
    		}
    	}

        for(i=0;i<G.numVertexs;i++)
    	{
            visited[i]=FALSE;
    	}
    	for(i=0;i<G.numVertexs;i++)
    	{ 
            strcpy(Path[i],"\0");
    	}
        DFS_FindSimPath(G,Path,v,s,value);
		goto label;	
    }
	else
	{
		printf("退出!\n");
	}
	
	return OK;
}

1.1.3 下载

链接地址: 5.1_MGRAPH.CPP

2 下一章

博客地址: 大学数据结构实验(五.图型结构的应用二)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mozhimen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值