#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請輸入圖的各頂點資訊: \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,visied[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;
case'0':
ch1='n';break;
default:
printf("輸入有誤,請輸入0-3進行選擇!");
}
if(ch2!='0')
{ printf("\n按回車鍵繼續,按任意鍵回傳主選單! \n");
a=getchar();
if(a!='\xA');
{
getchar();ch1='n';
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/238696.html
標籤:C++ 語言
上一篇:arduino小車除錯不成功
下一篇:各位大佬,幫忙看看唄
