#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;
}
在这里插入代码片
输入
输出
图