图的遍历,帮忙看看
#include<stdio.h>#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define size 100
char visited[size];
typedef struct QNode{
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
int data[size];
}LinkQueue;
typedef int Status;
typedef int VertexType;
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{
VertexType data;//顶点信息
ArcNode *firstarc;//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{ //图的定义
AdjList vertices;
int vexnum,edgenum;//图的当前顶点数和弧数
int kind;
}ALGraph;
LinkQueue InitQueue(int n)
{
LinkQueue Q;int i;QueuePtr p;
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
printf("存储分配失败");
Q.front->next=NULL;
for(i=0;i<n;i++)
{
p=(QueuePtr)malloc(sizeof(QNode));
scanf("%d",&p->data);
Q.rear->next=p;
Q.rear=p;
}
Q.rear->next = NULL;
return Q;
}
void EnQueue(LinkQueue Q,int e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
printf("存储分配失败");
p->data=e;p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
int DeQueue(LinkQueue Q,int e)
{
QueuePtr p;
if(Q.front==Q.rear) return 0;
p=Q.front->next;e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return 1;
}
void CreateALGraph(ALGraph &G)//邻接表的建立
{
int i;
printf("请输入该树的顶点: ");
scanf("%d",&G.vexnum);
printf("请输入该树的边: ");
scanf("%d",&G.edgenum);
for(i=0;i<G.vexnum;i++)// 输入顶点信息
{
printf("第%d个顶点的信息为: ",i);
scanf("%d",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
}
for(i=0;i<G.vexnum;i++)//生成树
{
int index=-1;
ArcNode *r,*p;//r指向当前链表的最后一个表结点;
while(true)
{
printf("输入第%d个顶点的邻接点下标",i);
scanf("%d",&v);
p=(ArcNode *)malloc(sizeof(ArcNode)); //建单链表
p->nextarc=NULL;
p->adjvex=index;
if(G.vertices[i].firstarc==NULL) r=p;
else
{ r->nextarc=p; r=r->nextarc;}//尾插法建单链表储存弧来建立图
}
}
}
int FirstAdjVex(ALGraph G,int v)
{
if(G.vertices[v].firstarc!=NULL)
return G.vertices[v].firstarc->adjvex;
else return ERROR;
}
int NextAdjVex(ALGraph G,int v,int w)
{
ArcNode *q;
q=G.vertices[v].firstarc;
while(q)
{
if(G.vertices[q->adjvex].data==w)
if(q->nextarc) return G.vertices[q->nextarc->adjvex].data;
else return ERROR;
q=q->nextarc;
}
return ERROR;
} //查找G中第v个顶点的单链表中,值为w的下一个表结点的值,若没有则返回-1.
void BFSTraverse(ALGraph G)
{
LinkQueue Q;
int v;
for(int v=0;v<G.vexnum;v++)
visited[v]=false;
InitQueue(20);
for(v=0;v<G.vexnum;v++){
int u;
if(!visited[v]){
visited[v]=true;
printf("%d",G.vertices[v].data);
EnQueue(Q,v);//将v入队
while(Q.front!=Q.rear){
DeQueue(Q,u);//出队一个元素放到u中
for(int w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w)){
if(!visited[w]){
visited[w]=true;
printf("%d",G.vertices[w].data);
EnQueue(Q,w);
}
}
}
}
}
}
void DFS(ALGraph G, int v){
visited[v]=TRUE;
int w;
printf("%d",G.vertices[v].data);
for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
if(!visited[w])
DFS(G,w);
}
void DFSTraverse(ALGraph G){
int v;
for(v=0;v<G.vexnum;++v)
visited[v]=FALSE;
for(v=0;v<G.vexnum;++v)
if(!visited[v]) DFS(G,v);
}
int main(void){
ALGraph G;
CreateALGraph(G);//采用邻接表存储图
printf("深度优先遍历图");
DFSTraverse(G);//深度优先遍历图
printf("广度优先遍历图");
BFSTraverse(G);//广度优先遍历图
return 0;
}
[ 本帖最后由 qinj13178952 于 2013-5-16 23:39 编辑 ]