《数据结构》上机实验报告—有向图的邻接表的建立及遍历

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
int FirstAdjVex(ALGraph G,char v)//返回v的第一个邻接顶点的序号
{
int i;
ArcNode *p;
i=LocateVex(G,v);//i为顶点v在图G中的序号
if(i==-1)
return -1;
p=G.vertices[i].firstarc;
if(p)
return p- -1;
}
int NextAdjVex(ALGraph G,char v,char w)//返回v的(相对于w)的下一个邻接顶点的序号
{
int i,j;
ArcNode *p,*q;
i=LocateVex(G,v);
j=LocateVex(G,w);
if(i==-1||j==-1||i==j)
struct ArcNode *nextarc;//指向下一条弧的指针
char *info;//该弧相关信息的指针
}ArcNode;
typedef struct VNode//头结点
{
char data;//顶点信息
ArcNode *firstarc;//第一个表结点的地址,指向第一条依附顶点的弧的指针
return q->adjvex;//返回v的(相对于w)的下一个邻接顶点的序号
}
else
return -1;//没有找到w或w是v的最后一个邻接顶点
}
int Visit(char v)
{
printf("%c ",v);
return OK;
}
int CreateDG(ALGraph &G)//采用邻接表表示,构造有向图G
}VNode,AdjList[MAX_VERTEX_NUM]; //头结点,头结点的顺序表AdjList[]类型
typedef struct//图结构
{
AdjList vertices;
int vexnum,arcnum;//图的当前顶点数与弧数
}ALGraph;
typedef struct QNode//用于BFS遍历的附设链队列结点结构
return OK;
}
int DFSTraverse(ALGraph G) //深度优先搜索遍历图G
{
int i;
for(i=0;i<G.vexnum;i++)
visited[i]=0;
for(i=0;i<G.vexnum;i++)
if(!visited[i])
DFS(G,i);
return OK;
#define MAX_VERTEX_NUM 20
#define OK 1
#define ERROR 0
#define OVERFLOW 0
int visited[MAX_VERTEX_NUM];
typedef struct ArcNode//表结点
{
int adjvex;//该弧所指向的顶点的位置
{
int v,e,i,j,t;
ArcNode *p,*q;
char tail,head;
printf("输入顶点个数:");
scanf("%d",&v);
if(v<0)
return ERROR;
G.vexnum=v;
printf("输入弧的条数:");
scanf("%d",&e);
if(e<0)
returnERROR;
DFSTraverse(G);
printf("\n");
printf("广度优先搜索的顺序:");
BFSTraverse(G,Visit);
}
printf("\n");
}
【结果截图】
福州大学数计学院
《数据结构》上机实验报告
专业和班级:信息计算科学与应用数学6班
学号
姓名
成绩
实验名称
图的有关操作
实验内容
有向图的邻接表的建立及遍历







【实验目的】
1.掌握图的存储思想及其存储实现。
2.掌握图的深度、广度优先遍历算法思想及其程序实现。
3.掌握图的常见应用算法的思想及其程序实现。
if(!visited[w])
{
visited[w]=1;
Visit(G.vertices[w].data);
EnQueue(Q,w);
}
}
}
return OK;
}
void main()
{
ALGraph G;
printf("建立有向图G\n");
if(CreateDG(G))
{
printf("深度优先搜索的顺序:");
{
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct//链队列
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int InitQueue(LinkQueue &Q)//初始化链队
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
return -1;
p=G.vertices[i].firstarc; //p指向v的邻接顶点链表中的第一个邻接顶点
while(p->nextarc&&p->adjvex!=j)//找到邻接顶点w
p=p->nextarc;
if(p->nextarc)//找到邻接顶点w,且w非v的最后一个邻接顶点
{
q=p->nextarc;









【实验内容】
1.键盘输入数据,建立一个有向图的邻接表。
2.在有向图的邻接表的基础上计算各顶点的度。
3.采用邻接表存储实现有向图的深度优先遍历。
4.采用邻接表存储实现有向图的广度优先遍历。
【主要程序】
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
G.arcnum=e;
printf("建立DG:\n");
for(t=0;t<G.vexnum;t++)//建立头结点顺序表
{
fflush(stdin);
printf("输入%d的信息:",t+1);
scanf("%c",&G.vertices[t].data);
G.vertices[t].firstarc=NULL;//初始化该头结点指针域
}
int BFSTraverse(ALGraph G,int(*visit)(char v))
{
LinkQueue Q;
int v,w,u;
for(v=0;v<G.vexnum;v++)
visited[v]=0;
InitQueue(Q);
for(v=0;v<G.vexnum;v++)
{
if(!visited[v])
if(!Q.front) exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
int EnQueue(LinkQueue &Q,int e)//元素e入队
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
if(i==-1||j==-1||i==j)
return ERROR;
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->info=NULL;
p->nextarc=NULL;
if(!G.vertices[i].firstarc)
G.vertices[i].firstarc=p;
return 1;
return 0;
}
int LocateVex(ALGraph G,char v)//查找值为v的顶点在顶点向量G.vexs[]中的位置
{
int i;
for(i=0;i<G.vexnum;i++)
if(v==G.vertices[i].data)
return i;
return -1;
}
for(t=0;t<G.arcnum;t++)//建立表结点链表(每个顶点的邻接顶点链表)
{
fflush(stdin);
printf("输入弧的信息(弧尾-弧头)");
scanf("%c%*c%c",&tail,&head);
i=LocateVex(G,tail);
j=LocateVex(G,head);
{
visited[v]=1;
Visit(G.vertices[v].data);
}
EnQueue(Q,v);
while(!EmptyQueue(Q))
{
DeQueue(Q,u);
for(w=FirstAdjVex(G,G.vertices[u].data);w>0;w=NextAdjVex
(G,G.vertices[u].data,G.vertices[w].data))
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
returnOK;
}
int EmptyQueue(LinkQueue Q)//判断队列Q是否为空
{
if(Q.front==Q.rear)
else
{//找尾结点
for(q=G.vertices[i].firstarc;q->nextarc;q=q->nextarc);
q->nextarc=p;//插入到链表尾
}
}
}
int DFS(ALGraph G,int v)//从第v个顶点出发,递归的深度优先遍历有向图G
{
int w;
visited[v]=-1;
p->next=NULL;
p->data=e;
Q.rear->next=p;
Q.rear=p;
return OK;
}
int DeQueue(LinkQueue &Q,int &e)//队首元素出队,由e返回其值
{
QueuePtr p;
if(Q.front==Q.rear) exit(OVERFLOW);
printf("%c ",G.vertices[v].data);
w=FirstAdjVex(G,G.vertices[v].data);
for(;w>=0;w=NextAdjVex(G,G.vertices[v].data,G.vertices[w].data))
if(!visited[w])
DFS(G,w);//对v的尚未访问的邻接顶点w递归调用DFS()
相关文档
最新文档