c语言小白,写文章方便自己记忆复习
无论是DFS还是BFS,使用邻接表时间复杂度为O(v+e),使用邻接矩阵时间复杂度为O(v^2)
#include<stdio.h>
#include<stdlib.h>
//边的定义
struct Enode
{
int v1, v2;
int weight;
};
typedef struct Enode* Edge;
//图的定义
struct Gnode
{
int Nv, Ne;
int** GL;
};
typedef struct Gnode* Graph;
int visit[100];
//图的初始化
Graph createGraph(int Nv)
{
Graph G;
G = (Graph)malloc(sizeof(struct Gnode));
G->Nv = Nv;
G->Ne = 0;
G->GL = (int **)malloc(sizeof(int*)*Nv);
int i, j, k;
for (i = 0; i < Nv; i++)
{
G->GL[i] = (int *)malloc(sizeof(int)*Nv);
}
for (j = 0; j < Nv; j++)
{
for ( k = 0; k < Nv; k++)
{
G->GL[j][k] = 0;
}
}
return G;
}
//插入边
void insertGraph(Graph G,Edge E)
{
G->GL[E->v1][E->v2] = E->weight;
G->GL[E->v2][E->v1] = E->weight;
printf("插入成功");
}
//构建一个图
Graph buildGraph(int Nv,int Ne)
{
int i;
Graph G;
G = createGraph(Nv);
if(Ne != 0)
{
printf("请依次输入边的两个顶点和权值");
for (i = 0; i < Ne; i++)
{
Edge E = (Edge)malloc(sizeof(struct Enode));
scanf("%d %d %d", &(E->v1), &(E->v2), &(E->weight));
printf("赋值成功");
insertGraph(G, E);
free(E);
}
}
printf("构建成功");
return G;
}
bool isEmpty(Graph G, int a, int b)
{
return G->GL[a][b]>0 ? true : false;
}
//寻找第一个的邻接点
int FirstAdjVex(Graph G, int i)
{
int v;
if (i<0 || i >= G->Nv)return -1;
for (v = 0; v<G->Nv; v++)
if (G->GL[i][v] == 1)return v;
return -1;
}
//寻找下一个邻接点
int NextAdjVex(Graph G, int i, int j)
{
if (i<0 || i >= G->Nv)return -1;
if (j<0 || j >= G->Nv)return -1;
for (int v = j + 1; v<G->Nv; v++)
if (G->GL[i][v] == 1)return v;
return -1;
}
void DFS(Graph G,int s)
{
printf("%d",s);
visit[s]=1;
int w = FirstAdjVex(G,s);
while(w!=-1)
{
if(visit[w]==0)
DFS(G,w);
w=NextAdjVex(G,s,w);
}
}
void main()
{
int v, e;
printf("先输入图的节点数和变数");
scanf("%d %d",&v,&e);
Graph G;
G = buildGraph(v,e);
DFS(G,0);
printf("完结撒花");
}