图的邻接表的建立和深度优先遍历,递归与非递归
下边代码块是邻接表的建立
typedef enum{DG,UDG}GraphKind;
typedef struct ArcNode
{
int adjvex;
struct ArcNode *next;
}ArcNode;
typedef struct VertexNode
{
char vexdata;
ArcNode *head;
}VertexNode;
typedef struct
{
VertexNode vertex[MAX_VER_NUM];
int vexnum,arcnum;
GraphKind Type;
}LGraph;
int index(char vex,LGraph *lg)
{
int i;
for(i=1;i<=lg->vexnum;i++)
{
if(lg->vertex[i].vexdata == vex)
{
return i;
}
}
return 0;
}
void Creat_LG(LGraph *lg)
{
int i,j,v1_index,v2_index,type;
char v1,v2;
ArcNode *p1,*p2;
printf("please input graph type 0.DG 1.UDG. input nums:");
scanf("%d",&type);
if(type == 0)
{
lg->Type = DG;
}
else if(type == 1)
{
lg->Type = UDG;
}
else
{
printf("please input 0 or 1!!!");
return;
}
printf("Please input vexnum:");
scanf("%d",&lg->vexnum);
printf("Please input arcnum:");
scanf("%d",&lg->arcnum);
getchar();
for (i=1;i<=lg->vexnum;i++)
{
lg->vertex[i].head = NULL;
printf("Please input %d vex:",i);
scanf("%c",&lg->vertex[i].vexdata);
getchar();
}
for (j=1;j<=lg->arcnum;j++)
{
printf("Please input %d arc(vex1 vex2):",j);
scanf("%c %c",&v1,&v2);
getchar();
v1_index = index(v1,lg);
v2_index = index(v2,lg);
if (lg->Type == 1)
{
p1 = (ArcNode *)malloc(sizeof(ArcNode));
p1->adjvex = v2_index;
p1->next = lg->vertex[v1_index].head;
lg->vertex[v1_index].head = p1;
p2 = (ArcNode *)malloc(sizeof(ArcNode));
p2->adjvex = v1_index;
p2->next = lg->vertex[v2_index].head;
lg->vertex[v2_index].head = p2;
}
else
{
p1 = (ArcNode *)malloc(sizeof(ArcNode));
p1->adjvex = v2_index;
p1->next = lg->vertex[v1_index].head;
lg->vertex[v1_index].head = p1;
}
}
}
void Print_LG(LGraph *lg)
{
int i;
ArcNode *p;
if(lg->Type == 0)
printf("Is Direct Graph\n");
else
printf("Is UNDirect Graph\n");
for(i=1;i<=lg->vexnum;i++)
{
printf("%c",lg->vertex[i].vexdata);
p=lg->vertex[i].head;
while(p)
{
printf("->%c",lg->vertex[p->adjvex].vexdata);
p = p->next;
}
printf("\n");
}
}
深度优先遍历递归
int visit1[MAX_VER_NUM];
void visit(LGraph *lg,int v)
{
printf("%c",lg->vertex[v].vexdata);
}
void DFS1(LGraph *lg,int v0)
{
ArcNode *p;
visit1[v0] = 1;
visit(lg,v0);
p = lg->vertex[v0].head;
while(p)
{
if(!visit1[p->adjvex])
DFS1(lg,p->adjvex);
p = p->next;
}
}
void DFS1Traverse(LGraph *lg)
{
int v;
for(v=1;v<=lg->vexnum;v++)
visit1[v]=0;
for(v=1;v<=lg->vexnum;v++)
{
if(!visit1[v])
DFS1(lg,v);
}
}
图的深度优先遍历非递归
用的是数组栈比较低级但是代码更简单
void DFS2(LGraph *lg,int v0)
{
int stack[MAX_VER_NUM];
ArcNode *p;
int visit[MAX_VER_NUM]={0},top=-1,v;
p = lg->vertex[v0].head;
stack[++top]=v0;
while(top!=-1)
{
v = stack[top--];
if(!visit[v])
{
printf("%c",lg->vertex[v].vexdata);
visit[v] = 1;
}
p = lg->vertex[v].head;
while(p)
{
if(!visit[p->adjvex])
{
stack[++top] = p->adjvex;
}
p = p->next;
}
}
}
完整代码
#include<stdio.h>
#include<stdlib.h>
#define MAX_VER_NUM 20
typedef enum{DG,UDG}GraphKind;
typedef struct ArcNode
{
int adjvex;
struct ArcNode *next;
}ArcNode;
typedef struct VertexNode
{
char vexdata;
ArcNode *head;
}VertexNode;
typedef struct
{
VertexNode vertex[MAX_VER_NUM];
int vexnum,arcnum;
GraphKind Type;
}LGraph;
int index(char vex,LGraph *lg)
{
int i;
for(i=1;i<=lg->vexnum;i++)
{
if(lg->vertex[i].vexdata == vex)
{
return i;
}
}
return 0;
}
void Creat_LG(LGraph *lg)
{
int i,j,v1_index,v2_index,type;
char v1,v2;
ArcNode *p1,*p2;
printf("please input graph type 0.DG 1.UDG. input nums:");
scanf("%d",&type);
if(type == 0)
{
lg->Type = DG;
}
else if(type == 1)
{
lg->Type = UDG;
}
else
{
printf("please input 0 or 1!!!");
return;
}
printf("Please input vexnum:");
scanf("%d",&lg->vexnum);
printf("Please input arcnum:");
scanf("%d",&lg->arcnum);
getchar();
for (i=1;i<=lg->vexnum;i++)
{
lg->vertex[i].head = NULL;
printf("Please input %d vex:",i);
scanf("%c",&lg->vertex[i].vexdata);
getchar();
}
for (j=1;j<=lg->arcnum;j++)
{
printf("Please input %d arc(vex1 vex2):",j);
scanf("%c %c",&v1,&v2);
getchar();
v1_index = index(v1,lg);
v2_index = index(v2,lg);
if (lg->Type == 1)
{
p1 = (ArcNode *)malloc(sizeof(ArcNode));
p1->adjvex = v2_index;
p1->next = lg->vertex[v1_index].head;
lg->vertex[v1_index].head = p1;
p2 = (ArcNode *)malloc(sizeof(ArcNode));
p2->adjvex = v1_index;
p2->next = lg->vertex[v2_index].head;
lg->vertex[v2_index].head = p2;
}
else
{
p1 = (ArcNode *)malloc(sizeof(ArcNode));
p1->adjvex = v2_index;
p1->next = lg->vertex[v1_index].head;
lg->vertex[v1_index].head = p1;
}
}
}
void Print_LG(LGraph *lg)
{
int i;
ArcNode *p;
if(lg->Type == 0)
printf("Is Direct Graph\n");
else
printf("Is UNDirect Graph\n");
for(i=1;i<=lg->vexnum;i++)
{
printf("%c",lg->vertex[i].vexdata);
p=lg->vertex[i].head;
while(p)
{
printf("->%c",lg->vertex[p->adjvex].vexdata);
p = p->next;
}
printf("\n");
}
}
int visit1[MAX_VER_NUM];
void visit(LGraph *lg,int v)
{
printf("%c",lg->vertex[v].vexdata);
}
void DFS1(LGraph *lg,int v0)
{
ArcNode *p;
visit1[v0] = 1;
visit(lg,v0);
p = lg->vertex[v0].head;
while(p)
{
if(!visit1[p->adjvex])
DFS1(lg,p->adjvex);
p = p->next;
}
}
void DFS1Traverse(LGraph *lg)
{
int v;
for(v=1;v<=lg->vexnum;v++)
visit1[v]=0;
for(v=1;v<=lg->vexnum;v++)
{
if(!visit1[v])
DFS1(lg,v);
}
}
void DFS2(LGraph *lg,int v0)
{
int stack[MAX_VER_NUM];
ArcNode *p;
int visit[MAX_VER_NUM]={0},top=-1,v;
p = lg->vertex[v0].head;
stack[++top]=v0;
while(top!=-1)
{
v = stack[top--];
if(!visit[v])
{
printf("%c",lg->vertex[v].vexdata);
visit[v] = 1;
}
p = lg->vertex[v].head;
while(p)
{
if(!visit[p->adjvex])
{
stack[++top] = p->adjvex;
}
p = p->next;
}
}
}
void main()
{
LGraph LG;
Creat_LG(&LG);
Print_LG(&LG);
printf("DFS1:");
DFS1Traverse(&LG);
printf("\n");
printf("DFS2:");
DFS2(&LG,1);
printf("\n");
return;
}