song.cpp

来自「1)自选存储结构,输入含n个顶点(用字符表示顶点)和e 条边的图G; (2」· C++ 代码 · 共 374 行

CPP
374
字号
// song.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include "stdio.h" 
typedef int datatype; /*假定线性表元素的类型为整型*/ 
#define maxsize 1024 /*假定线性表的最大长度为1024*/ 
#define max 10
# define n 100 /* 图的顶点最大个数 */ 
typedef char VEXTYPE; /* 顶点的数据类型 */ 
typedef float ADJTYPE; /* 权值类型 */ 
typedef struct 
{ VEXTYPE vexs[n] ; /* 顶点信息数组 */ 
ADJTYPE arcs[n][n] ; /* 边权数组 */ 
int num; /* 顶点的实际个数 */ 
}GRAPH; 

/***********************置空图**********************/ 
void GraphInit(GRAPH *L) 
{ 
L->num=0; 
} 

/***********************求结点数**********************/ 
int GraphVexs(GRAPH *L) 
{ 
return(L->num); 
} 

/***********************创建图**********************/ 
void GraphCreate(GRAPH *L) 
{ int a[max],b[max];
int i,j; 
int c[max];
for(i=0;i<max;i++)
{a[i]=0;
b[i]=0;
c[i]=0;}
GraphInit(L); 
printf("请输入顶点数目(小于十个顶点):"); 
scanf("%d",&L->num); 
printf("请输入各顶点的信息(单个符号):"); 
for(i=0;i<L->num;i++) 
{ 
fflush(stdin); 
scanf("%c",&L->vexs[i]); 
} 
printf("请输入边权矩阵的信息:"); 
for(i=0;i<L->num;i++) 
{ 
for(j=0;j<L->num;j++) 
{
scanf("%f",&L->arcs[i][j]); 
if(L->arcs[i][j]!=0)
{a[i]++;
b[j]++;}

} 
} 
for (i=0;i<L->num;i++)
c[i]=a[i]+b[i];
printf("图已经创建完毕!\n"); 
for(i=0;i<L->num;i++)
printf("第%d个顶点的度是%d",i+1,c[i]);
} 

/***********************图的输出**********************/ 
void GraphOut(GRAPH L) 
{ 
int i,j; 
printf("\n图的顶点数目为:%d",L.num); 
printf("\n图的各顶点的信息为:\n"); 
for(i=0;i<L.num;i++) 
printf("%c ",L.vexs[i]); 
printf("\n图的边权矩阵的信息为:\n"); 
for(i=0;i<L.num;i++) 
{ 
for(j=0;j<L.num;j++) 
{ 
printf("%6.2f ",L.arcs[i][j]); 
} 
printf("\n"); 
} 
printf("图已经输出完毕!\n"); 
} 

/***********************1.图的深度周游**********************/ 
void DFS(GRAPH g,int qidian,int mark[]) 
//从第qidian个点出发深度优先周游图g中能访问的各个顶点 
{ 
int v1; 
mark[qidian]=1; 
printf("%c ",g.vexs[qidian]); 
for(v1=0;v1<g.num;v1++) 
{ 
if(g.arcs[qidian][v1]!=0&&mark[v1]==0) 
DFS(g,v1,mark); 
} 
} 
/***********************1.图的深度周游**********************/ 
void GraphDFS(GRAPH g) 
//深度优先周游图g中能访问的各个顶点 
{ 
int qidian,v,v1,mark[maxsize]; 
printf("\n深度周游:"); 
printf("\n请输入起点的下标:"); 
scanf("%d",&qidian); 
for(v=0;v<g.num;v++) 
{ 
mark[v]=0; 
} 
for(v=qidian;v<g.num+qidian;v++) 
{ 
//printf("v=%d ",v); 
v1=v%g.num; 
if(mark[v1]==0) 
DFS(g,v1,mark); 
} 
} 
typedef int DATATYPE; //队列元素的数据类型 
typedef struct 
{ 
DATATYPE data[maxsize]; //队中元素 
int front,rear; //队头元素下标、队尾元素后面位置的下标 
} SEQQUEUE; 
/*****************************************************************************/ 
void QueueInit(SEQQUEUE *sq) 
//将顺序循环队列sq置空(初始化) 
{ 
sq->front=0; 
sq->rear=0; 
} 
/*****************************************************************************/ 
int QueueIsEmpty(SEQQUEUE sq) 
//如果顺序循环队列sq为空,成功返回1,否则返回0 
{ 
if (sq.rear==sq.front) 
return(1); 
else 
return(0); 
} 
/*****************************************************************************/ 
int QueueFront(SEQQUEUE sq,DATATYPE *e) 
//将顺序循环队列sq的队头元素保存到e所指地址,成功返回1,失败返回0 
{ 
if (QueueIsEmpty(sq)) 
{ printf("queue is empty!\n");return 0;} 
else 
{ *e=sq.data[(sq.front)]; return 1;} 
} 
/*****************************************************************************/ 
int QueueIn (SEQQUEUE *sq,DATATYPE x) 
//将元素x入队列sq的队尾,成功返回1,失败返回0 
{ 
if (sq->front==(sq->rear+1)%maxsize) 
{ 
printf("queue is full!\n"); 
return 0; 
} 
else 
{ 
sq->data[sq->rear]=x; 
sq->rear=(sq->rear+1)%maxsize; 
return(1); 
} 
} 
/*****************************************************************************/ 
int QueueOut(SEQQUEUE *sq) 
//将队列sq队首元素出队列,成功返回1,失败返回0 
{ 
if (QueueIsEmpty(*sq)) 
{ 
printf("queue is empty!\n"); 
return 0; 
} 
else 
{ 
sq->front=(sq->front+1)%maxsize; 
return 1; 
} 
} 
/***********************2.图的广度周游**********************/ 
void BFS(GRAPH g,int v,int mark[]) 
//从v出发广度优先周游图g中能访问的各个顶点 
{ 
int v1,v2; 
SEQQUEUE q; 
QueueInit(&q); 
QueueIn(&q,v); 
mark[v]=1; 
printf("%c ",g.vexs[v]); 
while(QueueIsEmpty(q)==0) 
{ 
QueueFront(q,&v1); 
QueueOut(&q); 
for(v2=0;v2<g.num;v2++) 
{ 
if(g.arcs[v1][v2]!=0&&mark[v2]==0) 
{ 
QueueIn(&q,v2); 
mark[v2]=1; 
printf("%c ",g.vexs[v2]); 
} 
} 
} 
} 
/***********************2.图的广度周游**********************/ 
void GraphBFS(GRAPH g) 
//深度优先周游图g中能访问的各个顶点 
{ 
int qidian,v,v1,mark[maxsize]; 
printf("\n广度周游:"); 
printf("\n请输入起点的下标:"); 
scanf("%d",&qidian); 
for(v=0;v<g.num;v++) 
{ 
mark[v]=0; 
} 
for(v=qidian;v<g.num+qidian;v++) 
{ 
v1=v%g.num; 
if(mark[v1]==0) 
BFS(g,v1,mark); 
} 
} 
/************************3.查找*********************/


void search(GRAPH L)
{int t,i,j;
 char m;
	printf("请输入您要查找的顶点信息:");
    scanf("%c",&m);  
	for(i=0;i<L.num;i++)
	
	if(L.vexs[i]==m){
		t=i;
		for(i=t;i<L.num;i++)
	 L.vexs[i]=L.vexs[i+1];
	 //L->num=L->num-1;
//	}

	for(i=0;i<L.num;i++)
	for(j=t;j<L.num;j++)
	 L.arcs[i][j]=L.arcs[i][j+1];
	for(i=t;i<L.num;i++)
	for(j=0;j<L.num;j++)
	 L.arcs[i][j]=L.arcs[i+1][j];
	L.num=L.num-1;

 printf("\n查找后图的顶点数目为:%d",L.num); 
printf("\n查找后图的各顶点的信息为:\n"); 
for(i=0;i<L.num;i++) 
printf("%c ",L.vexs[i]); 
printf("\n图的边权矩阵的信息为:\n"); 
for(i=0;i<L.num;i++) 
{ 
for(j=0;j<L.num;j++) 
{ 
printf("%6.2f ",L.arcs[i][j]); 
} 
printf("\n"); 
} 
printf("图已经输出完毕!\n"); 
	 }
//  
if (i==L.num)
		printf("没有找到您想查找的顶点");





}
/**********************4.连通性***********************/
int panduan(GRAPH L,int v)
{ 
//int a[L.num];
int mark[max];
int v1,v2,t; 
SEQQUEUE q; 
QueueInit(&q); 
QueueIn(&q,v);
//a[0]=v;
//t=1;

mark[v]=1; 
//printf("%c ",L.vexs[v]); 
t=1;
while(QueueIsEmpty(q)==0) 
{ 
QueueFront(q,&v1); 
QueueOut(&q); 
for(v2=0;v2<L.num;v2++) 
{ 
if(L.arcs[v1][v2]!=0&&mark[v2]==0) 
{ 
QueueIn(&q,v2); 
//a[t]=v2;
//t++;
mark[v2]=1; 
//printf("%c ",g.vexs[v2]); 
t++;
} 
} 
} 

 return t;
} 

void liantong(GRAPH L)
{int j;

//for(i=0;i<L.num;i++)
// panduan(GRAPH L, L.vexs[i],int mark[]);

for(j=0;j<L.num;j++){
 //   if(L.vexs[i]!=L.vexs[j])
//	  if(L.arcs[i][j]!=0)
	if (panduan(L,j)<L.num)
	 printf("否");

	

if(j==L.num)
 printf("yes");
}
//	break;

}




/***********************主函数**********************/ 

void main() 
{ GRAPH tu;
 GraphCreate(&tu); 
 GraphOut(tu);
  int ch2;

printf("\t\t******************************************************\n");
printf("\t\t*          1-------深度优先遍历                      *\n");
printf("\t\t*          2-------广度优先遍历                      *\n");
printf("\t\t*          3-------查找顶点x                         *\n");
printf("\t\t*          4-------是否连通                          *\n");
//printf("\t\t*          5-------退出                              *\n");
printf("\t\t******************************************************\n");
printf("\t\t请选择菜单号(1--4):");
scanf("%d",&ch2);     getchar();

switch(ch2)
{
case 1: GraphDFS(tu); break;
case 2: GraphBFS(tu); break;
case 3: search(tu)  ; break;
case 4: liantong(tu); break;
//case 5: return;
}
//main();
/*printf("\n输入10退出:");
  char aa[10];
scanf("%s",&aa);
if(aa=="exit")

return;
else
main();*/
}


			 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?