简单的实现了一下,有向图,无向图的创建及其遍历。
遍历没什么说的,dfs用栈实现,bfs用队列实现。具体就不累赘了。
用邻接表创建的是有向图,邻接矩阵创建的是无向图。均未赋权值(需要时,添加即可)
具体实现如下:
邻接表的实现,
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Max_Szie 100
typedef struct node
{
int VerInfo,Priority; // 顶点信息和权值
struct node *pNext;
}Vertex,*pVertex;
typedef struct graph
{
pVertex *List; // 图的邻接表
char *VertexInfo; // 保存顶点
int vertexnum, edge; // 保存边数和顶点数
}Graph;
pVertex AddNewNode(int VerInfo)
{
pVertex NewNode = (pVertex)malloc(sizeof(Vertex));
memset(NewNode, 0, sizeof(Vertex));
NewNode->VerInfo = VerInfo;
return NewNode;
}
void InputVertexNumAndEdgeNum(Graph *G)
{
int i;
printf("请输入图的顶点数和边数(用空格隔开):");
scanf("%d %d", &G->vertexnum, &G->edge);
G->List = (pVertex *)malloc(G->vertexnum * sizeof(pVertex));
for (i = 0; i < G->vertexnum; i++)
G->List[i] = AddNewNode(i);
}
void InputEdge(Graph *G)
{
int i, t1, t2;
pVertex p = NULL;
printf("\n请输入图的每条边\n");
for (i = 0; i < G->edge; i++)
{
printf("图的第%d条边:", i + 1);
scanf("\n%d %d", &t1, &t2);
p = G->List[--t1];
while ( p->pNext != NULL)
{
p = p->pNext;
}
p->pNext = AddNewNode(--t2);
}
}
void CreateGraph(Graph *G)
{
InputVertexNumAndEdgeNum(G);
InputEdge(G);
}
void DisplayGraph(Graph *G)
{
int i;
printf("\n图的邻接矩阵表示为\n");
for (i = 0; i < G->vertexnum; i++)
{
pVertex p = G->List[i];
while (p != NULL)
{
printf("%d ", p->VerInfo +1);
p = p->pNext;
}
printf("\n");
}
}
void bfs(Graph *G,int start)
{
int vis[Max_Szie] = { 0 };
pVertex Queue[Max_Szie] = { 0 };
int rear = 0, front = 0;
Queue[rear++] = G->List[start];
vis[G->List[start]->VerInfo] = 1;
while (front != rear)
{
pVertex v = Queue[front++];
printf("%d ", v->VerInfo + 1);
pVertex temp = G->List[v->VerInfo];
while (temp != NULL)
{
if (!vis[temp->VerInfo])
{
vis[temp->VerInfo] = 1;
Queue[rear++] = temp;
}
temp = temp->pNext;
}
}
}
void dfs(Graph *G, int start)
{
pVertex Stack[Max_Szie] = { 0 };
int vis[Max_Szie] = { 0 };
int base = -1;
Stack[++base] = G->List[start];
pVertex p = G->List[start];
while (-1!= base || p!= NULL)
{
while (p != NULL)
{
if (1 == vis[p->VerInfo])
{
p = p->pNext;
}
else
{
vis[p->VerInfo] = 1;
printf("%d ", p->VerInfo + 1);
Stack[++base] = p;
p = G->List[p->VerInfo];
}
}
if (base > -1)
{
p = Stack[base--];
p = p->pNext;
}
}
}
int main()
{
Graph G;
CreateGraph(&G);
DisplayGraph(&G);
printf("图的深度优先搜索为:");
bfs(&G,0);
printf("\n\n图的广度优先搜索为:");
dfs(&G, 0);
printf("\n");
system("pause");
return 0;
}
邻接表,
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int *vis = NULL;
typedef struct node
{
char *vertex;
int **AdjMatrix;
int vertexnum,edge;
}Graph;
void InputVertexNumAndEdgeNum(Graph *G)
{
int i, j;
printf("请输入图的顶点数和边数(用空格隔开):");
scanf("%d %d", &G->vertexnum, &G->edge);
G->AdjMatrix = (int **)malloc(G->vertexnum * sizeof(int));
for (i = 0; i < G->vertexnum; i++)
G->AdjMatrix[i] = (int *)malloc(G->vertexnum * sizeof(int));
for (i = 0; i < G->vertexnum; i++)
{
for (j = 0; j < G->vertexnum; j++)
G->AdjMatrix[i][j] = 0;
}
}
void InputVertx(Graph *G)
{
int i;
G->vertex = (char *)malloc((G->vertexnum + 1) * sizeof(char));
printf("\n请输入图的每个顶点:");
for (i = 0; i < G->vertexnum; i++)
{
scanf("\n%c", &(G->vertex[i]));
}
}
// 将输入的顶点转变成图的内部编号。
void Hash(Graph *G,char ch1,char ch2,int *t1,int *t2)
{
int i;
for (i = 0; i < G->vertexnum; i++)
{
if (G->vertex[i] == ch1)
*t1 = i;
if (G->vertex[i] == ch2)
*t2 = i;
}
}
void InputEdge(Graph *G)
{
int i, t1 , t2;
char ch1, ch2;
fflush(stdin);
printf("\n请输入图的每条边\n");
for (i = 0; i < G->edge; i++)
{
printf("图的第%d条边:", i + 1);
scanf("\n%c %c", &ch1, &ch2);
Hash(G, ch1, ch2, &t1, &t2);
G->AdjMatrix[t1][t2] = 1;
G->AdjMatrix[t2][t1] = 1;
}
}
void CreateGraph(Graph *G)
{
InputVertexNumAndEdgeNum(G);
InputVertx(G);
InputEdge(G);
}
void DisplayGraph(Graph *G)
{
printf("\n图的邻接矩阵表示为:\n\n");
int i, j;
for (i = 0; i < G->vertexnum; i++)
{
for (j = 0; j < G->vertexnum; j++)
printf("%4d ", G->AdjMatrix[i][j]);
printf("\n");
}
printf("\n");
}
void bfs(Graph *G,int start)
{
int i, n = G->vertexnum;
int *queue = (int *)malloc(n * sizeof(int));
memset(queue, 0, n * sizeof(int));
int rear = 0, front = 0;
queue[rear++] = start;
vis[start] = 1;
while (front != rear)
{
int v = queue[front++];
printf("%c ", G->vertex[v]);
for (i = 0; i < G->vertexnum; i++)
{
if (1 == G->AdjMatrix[v][i] && !vis[i])
{
queue[rear++] = i;
vis[i] = 1;
}
}
}
free(queue);
}
void dfs(Graph *G, int start ,int *vis)
{
int i;
printf("%c ", G->vertex[start]);
vis[start] = 1;
for (i = 0; i < G->vertexnum; i++)
{
if (1 == G->AdjMatrix[start][i] && !vis[i])
{
dfs(G, i, vis);
}
}
}
void InitVis(int n)
{
vis = (int *)malloc(n * sizeof(int));
memset(vis, 0, n * sizeof(int));
}
void DestoryGraph(Graph *G)
{
int i;
free(G->vertex);
for (i = 0; i < G->vertexnum; i++)
free(G->AdjMatrix[i]);
free(G->AdjMatrix);
free(vis);
}
int main()
{
Graph G;
CreateGraph(&G);
DisplayGraph(&G);
printf("图的广度优先搜索结果为:");
InitVis(G.vertexnum);
bfs(&G, 0);
printf("\n图的深度优先搜索结果为:");
memset(vis, 0, G.vertexnum * sizeof(int));
dfs(&G, 0,vis);
printf("\n\n");
DestoryGraph(&G);
system("pause");
return 0;
}
写的不太好,只能凑合着看了。。。