#include<stdio.h>
#include<stdlib.h>
#define MaxVertices 100
typedef char DataType;
typedef struct node
{
int adjvex;
struct node *nextarc;
int info;
}ArcNode;
typedef struct
{
DataType data[MaxVertices];
ArcNode *firstarc;
}VerNode;
typedef struct
{
VerNode adjlist[MaxVertices];
int n;
int e;
}ALGraph;
void CrateGraph(ALGraph *G)
{
int i, k;
int v1, v2;
int weight;
printf_s("请输入邻接表的总顶点数和边数:");
scanf_s("%d %d", &G->n, &G->e);
fflush(stdin);
printf_s("请输入顶点(回车结束一个输入)\n");
for (i = 0; i < G->n; i++)
{
gets_s(G->adjlist[i].data, MaxVertices);
G->adjlist[i].firstarc = NULL;
}
printf_s("请根据顶点的位置从1开始输入两两相邻的边和权值(中间用空格隔开)\n");
for (k = 0; k < G->e; k++)
{
fflush(stdin);
printf_s("第%d个连接点:", k + 1);
scanf_s("%d %d %d", &v1, &v2, &weight);
v1--; v2--;
ArcNode *s = (ArcNode *)malloc(sizeof(ArcNode));
s->info = weight;
s->adjvex = v2;
s->nextarc = G->adjlist[v1].firstarc;
G->adjlist[v1].firstarc = s;
s = (ArcNode *)malloc(sizeof(ArcNode));
s->adjvex = v1;
s->info = weight;
s->nextarc = G->adjlist[v2].firstarc;
G->adjlist[v2].firstarc = s;
}
}
void DisGraph(ALGraph *G)
{
int i;
printf_s("序号\t顶点名称\t\t边表\n");
for (i = 0; i < G->n; i++)
{
printf_s("%d\t", i + 1);
printf_s("%s\t\t->", G->adjlist[i].data);
while (G->adjlist[i].firstarc)
{
printf_s("%d(%d)->", G->adjlist[i].firstarc->adjvex + 1, G->adjlist[i].firstarc->info);
G->adjlist[i].firstarc = G->adjlist[i].firstarc->nextarc;
}
printf_s("NULL\n");
}
}
int visited[MaxVertices];
typedef struct LoopQueue
{
int data[MaxVertices];
int front;
int rear;
}Queue, *LQueue;
void InitQueue(LQueue Q){
Q->front = Q->rear = 0;
}
int QueueisFull(LQueue Q){
if ((Q->rear + 1) % MaxVertices == Q->front){
return -1;
}
else{
return 1;
}
}
int QueueisEmpty(LQueue Q){
if (Q->front == Q->rear){
return -1;
}
return 1;
}
void EnQueue(LQueue Q, int i){
if (!QueueisFull(Q)){
Q->data[Q->rear] = i;
Q->rear = (Q->rear + 1) % MaxVertices;
}
}
void DeQueue(LQueue Q, int *k){
if (!QueueisEmpty(Q)){
*k = Q->data[Q->front];
Q->front = (Q->front + 1) % MaxVertices;
}
}
void BFS(ALGraph *G)
{
Queue Q;
for (int i = 0; i < G->n; i++)
{
visited[i] = 0;
}
InitQueue(&Q);
for (int i = 0; i < G->n; i++)
{
visited[i] = 1;
printf("%s ", G->adjlist[i].data);
EnQueue(&Q, i);
while (!QueueisEmpty(&Q))
{
DeQueue(&Q, &i);
ArcNode *e = G->adjlist[i].firstarc;
while (e)
{
if (!visited[e->adjvex])
{
visited[e->adjvex] = 1;
printf("\t%s", G->adjlist[e->adjvex].data);
EnQueue(&Q, e->adjvex);
}
e = e->nextarc;
}
printf_s("\n");
}
}
}
int visited1[MaxVertices];
void DFS(ALGraph *G, int i)
{
ArcNode *p;
visited1[i] = 1;
printf_s("%s ", G->adjlist[i].data);
p = G->adjlist[i].firstarc;
while (p)
{
if (!visited1[p->adjvex])
{
DFS(G, p->adjvex);
}
p = p->nextarc;
}
}
void DFSTravel(ALGraph *G)
{
int i;
for (i = 0; i < G->n; i++)
{
visited1[i] = 0;
}
for (i = 0; i < G->n; i++)
{
if (!visited1[i])
{
DFS(G, i);
}
}
}
void main()
{
ALGraph G;
CrateGraph(&G);
printf_s("\n");
printf_s("广度优先遍历:");
BFS(&G);
printf_s("\n\n");
printf_s("深度优先遍历:");
DFSTravel(&G);
printf_s("\n\n邻接表:\n");
DisGraph(&G);
}
