初学者。如果有误请指正,欢迎联系QQ2684162190
#include<stdio.h>
#include<stdlib.h>
typedef int VertexType;
typedef int EdgeType;
#define MAXVEX 100
#define INFINITY 65535
typedef int Boolean;
Boolean visited[MAXVEX];
#define MAXSIZE 100
typedef struct EdgeNode //边表节点
{
int adjvex; //邻接点域,储存该顶点对应的下标
struct EdgeNode* next;
}EdgeNode; //链域,指向下一个邻接点
typedef struct VertexNode //顶点表节点
{
VertexType date; //顶点域
EdgeNode *firstedge; //边表头指针
}VertexNode,AdjList[MAXVEX];
//循环队列的顺序储存结构
typedef struct
{
int date[MAXSIZE];
int front;
int rear;
}SqQueue;
typedef struct
{
AdjList adjlist;
int numVertexes,numEdges; //图中当前定点数和边数
}GraphAdjList;
//图邻接表的建立
void CreateALGraph(GraphAdjList *G)
{
// int i,j,k;
// EdgeNode *e;
// printf("输入顶点数和边数\n");
// scanf("%d%d",&G->numVertexes,&G->numEdges);
// printf("输入顶点数据:\n");
// for(i = 0;i < G->numVertexes;i++) //建立顶点表
// {
// getchar();
// scanf("%c",&G->adjlist[i].date);
// G->adjlist[i].firstedge = NULL;
// }
// for(k = 0;k < G->numEdges;k++)
// {
// printf("输入边(vi,vj)上的顶点序号:\n"); //输入边(vi,vj)边的顶点序号
// scanf("%d%d",&i,&j); //申请空间,生成边表节点
// e = (EdgeNode*)malloc(sizeof(EdgeNode));
// e->adjvex = j; //邻接序号为J
// e->next = G->adjlist[i].firstedge; //将指针e指向当前顶点指向的节点
// G->adjlist[i].firstedge = e; //将当前顶点指向e
// e = (EdgeNode*)malloc(sizeof(EdgeNode)); //邻接序号为i
// e->adjvex = i;
// e->next = G->adjlist[i].firstedge;
// G->adjlist[i].firstedge = e;
// }
int i,j,k;
EdgeNode *e;
G->numVertexes = 10;
G->numEdges = 12;
for(i = 0;i < G->numVertexes;i++) //建立顶点表
{
G->adjlist[i].date = i;
G->adjlist[i].firstedge = NULL;
}
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 8;e->next = G->adjlist[0].firstedge;G->adjlist[0].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 0;e->next = G->adjlist[8].firstedge;G->adjlist[8].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 2;e->next = G->adjlist[8].firstedge;G->adjlist[8].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 9;e->next = G->adjlist[8].firstedge;G->adjlist[8].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 8;e->next = G->adjlist[2].firstedge;G->adjlist[2].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 1;e->next = G->adjlist[2].firstedge;G->adjlist[2].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 4;e->next = G->adjlist[2].firstedge;G->adjlist[2].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 8;e->next = G->adjlist[9].firstedge;G->adjlist[9].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 1;e->next = G->adjlist[9].firstedge;G->adjlist[9].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 2;e->next = G->adjlist[1].firstedge;G->adjlist[1].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 9;e->next = G->adjlist[1].firstedge;G->adjlist[1].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 3;e->next = G->adjlist[1].firstedge;G->adjlist[1].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 7;e->next = G->adjlist[1].firstedge;G->adjlist[1].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 2;e->next = G->adjlist[4].firstedge;G->adjlist[4].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 3;e->next = G->adjlist[4].firstedge;G->adjlist[4].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 1;e->next = G->adjlist[3].firstedge;G->adjlist[3].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 4;e->next = G->adjlist[3].firstedge;G->adjlist[3].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 5;e->next = G->adjlist[3].firstedge;G->adjlist[3].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 1;e->next = G->adjlist[7].firstedge;G->adjlist[7].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 6;e->next = G->adjlist[7].firstedge;G->adjlist[7].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 7;e->next = G->adjlist[6].firstedge;G->adjlist[6].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 5;e->next = G->adjlist[6].firstedge;G->adjlist[6].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 6;e->next = G->adjlist[5].firstedge;G->adjlist[5].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 3;e->next = G->adjlist[5].firstedge;G->adjlist[5].firstedge = e;
}
//邻接表的深度优先算法
void DFS(GraphAdjList* GL,int i)
{
EdgeNode* p;
visited[i] = 1;
printf("%d ",GL->adjlist[i].date);
p = GL->adjlist[i].firstedge;
while(p)
{
if(!visited[p->adjvex])
DFS(GL,p->adjvex);
p = p->next;
}
}
void DFSTraverse(GraphAdjList* GL)
{
int i;
for(i = 0;i < GL->numVertexes;i++)
visited[i] = 0;
for(i = 0;i < GL->numVertexes;i++)
if(!visited[i])
DFS(GL,i);
}
//初始化一个空队列
int InitQueue(SqQueue *Q)
{
Q->front=0;
Q->rear=0;
return 1;
}
//返回Q元素个数,也就是队列长度
int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
//若队列未满,则插入e为新的队尾元素
int EnQueue(SqQueue *Q,int e)
{
if((Q->rear+1)%MAXSIZE==Q->front) //队列已满的判断
return 0; //当队列front与rear相差一个位置时记队列为满
Q->date[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXSIZE;
return 1; //rear指针后移一位,若到队尾则移到队列头部
}
//若队列不空,则删除Q中队头元素,并用E返回他的值
int DeQueue(SqQueue *Q,int *e)
{
if(Q->front==Q->rear) //队列为空的判断
return 0;
*e = Q->date[Q->front];
Q->front=(Q->front+1)%MAXSIZE; //front 指针后移如果是在队尾则转到数组头部
return 1;
}
//将队列清空
void ClearQueue(SqQueue *Q)
{
Q->front=0;
Q->rear=0;
}
//队列存在则将他销毁
int DestoryQueue(SqQueue *Q)
{
free(Q);
return 1;
}
//若队列为空返回1否则返回0
int QueueEmpty(SqQueue Q)
{
if(Q.rear==Q.front)
return 1;
return 0;
}
void BFSTraverse(GraphAdjList* GL)
{
int i,j;
EdgeNode *p;
SqQueue Q;
for(i = 0;i < GL->numVertexes;i++)
visited[i] = 0;
InitQueue(&Q);
for(i = 0;i < GL->numVertexes;i++)
{
if(!visited[i])
{
visited[i] = 1;
printf("%d ",GL->adjlist[i].date);
EnQueue(&Q,i);
while(!QueueEmpty(Q))
{
DeQueue(&Q,&j);
p = GL->adjlist[j].firstedge;
while(p)
{
if(!visited[p->adjvex])
{
visited[p->adjvex] = 1;
printf("%d ",GL->adjlist[p->adjvex].date);
EnQueue(&Q,p->adjvex);
}
p = p->next;
}
}
}
}
}
int main()
{
GraphAdjList* G = (GraphAdjList*)malloc(sizeof(GraphAdjList));
CreateALGraph(G);
printf("深度优先遍历算法:");
DFSTraverse(G);
printf("\n广度优先遍历算法:");
BFSTraverse(G);
return 0;
}