#include <stdio.h>
#include "windows.h"
#define MaxVertex 6
typedef char C;
typedef struct Node {
int edge;
struct Node *next;
} *node;
typedef struct Head {
C element;
struct Node *next;
} *head;
typedef struct matrixGraph {
int vertexCount, edgeCount;
struct Head vertex[MaxVertex];
} *Graph;
Graph create() {
Graph graph = malloc(sizeof(struct matrixGraph));
graph->vertexCount = graph->edgeCount = 0;
return graph;
}
void addVertex(Graph graph, C element) {
if (graph->vertexCount != MaxVertex) {
graph->vertex[graph->vertexCount].element = element;
graph->vertex[graph->vertexCount++].next = NULL;
}
}
void addEdge(Graph graph, int a, int b) {
node tmp = graph->vertex[a].next;
node E = malloc(sizeof(struct Node));
E->edge = b;
E->next = NULL;
while (tmp) {
if (tmp->edge == b) return;
if (!tmp->next) {
tmp->next = E;
graph->edgeCount++;
return;
}
tmp = tmp->next;
}
graph->vertex[a].next = E;
graph->edgeCount++;
}
typedef int E;
struct LNode {
E element;
struct LNode *Next;
};
typedef struct LNode *Node;
struct Queue {
Node front, rear;
};
typedef struct Queue *LQueue;
BOOL initQueue(LQueue queue) {
queue->front = queue->rear = malloc(sizeof(struct LNode));
if (queue->front == NULL) return 0;
return 1;
}
BOOL pushQueue(LQueue queue, E element) {
Node NewNode = malloc(sizeof(struct LNode));
if (NewNode == NULL) return 0;
NewNode->element = element;
queue->rear->Next = NewNode;
queue->rear = NewNode;
return 1;
}
BOOL isEmpty(LQueue queue) {
return queue->rear == queue->front;
}
E popQueue(LQueue queue) {
if (isEmpty(queue)) return -1;
queue->front = queue->front->Next;
return queue->front->element;
}
void f(Graph graph) {
for (int i = 0; i < graph->vertexCount; ++i) {
printf("%d | %c", i, graph->vertex[i].element);
node tmp = graph->vertex[i].next;
while (tmp) {
printf("-> %d", tmp->edge);
tmp = tmp->next;
}
printf("\n");
}
}
BOOL dfs(Graph graph, int startVertex, int targetVertex, int *visited) {
visited[startVertex] = 1;
if (startVertex == targetVertex) return 1;
node node1 = graph->vertex[startVertex].next;
while (node1) {
if (!visited[node1->edge])
if (dfs(graph, node1->edge, targetVertex, visited))
return 1;
node1 = node1->next;
}
return 0;
}
BOOL bfs(Graph graph, int startVertex, int targetVertex, int *visited, LQueue queue){
pushQueue(queue,startVertex);
visited[startVertex] = 1;
while (!isEmpty(queue)){
int next = popQueue(queue);
printf("%c ->",graph->vertex[next].element);
node node1 = graph->vertex[next].next;
while (node1){
if (targetVertex == node1->edge) return 1;
if (!visited[node1->edge]){
pushQueue(queue,node1->edge);
visited[node1->edge] = 1;
}
node1 = node1->next;
}
}
return 0;
}
int main() {
Graph graph = create();
for (int i = 'A'; i <= 'F'; i++) {
addVertex(graph, (char) i);
}
addEdge(graph, 0, 1);
addEdge(graph, 1, 2);
addEdge(graph, 1, 3);
addEdge(graph, 1, 4);
addEdge(graph, 4, 5);
int v[graph->vertexCount];
for (int i = 0; i < graph->vertexCount; ++i) {
v[i] = 0;
}
struct Queue queue;
initQueue(&queue);
printf("\n%d",bfs(graph,0,5,v,&queue));
}