浙大城院数据结构实验报告report13

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浙江大学城市学院实验报告
课程名称数据结构基础
实验项目名称实验十三图的基本操作—邻接表存储结构
学生姓名专业班级学号
实验成绩指导老师(签名)日期
头文件AdjLink.h,在该文件中定义图的邻接表存储结构,并编写图的初始化、建立图、输出图、输出图的每个顶点的度图的深度优先遍历函数与广度优先遍历函数等基本操作实现函数。

同时在主函数文件test5_2.cpp中调用这些函数进行验证。

三. 函数的功能说明及算法思路
(包括每个函数的功能说明,及一些重要函数的算法实现思路)
这里针对的都是无向无权图
结构类型定义
//边表结点//顶点表结点//图类型
typedef struct node typedef struct { typedef struct {
{ int adjvex; //邻接点域V ertexType vertex; //顶点域AdjList adjlist; //邻接表node *next; //链域EdgeNode *firstedge; //边表头指针int n,e; //图中当前顶点数和边数
}EdgeNode; }VertexNode; } ALGraph; //图类型
typedef VertexNode AdjList[MaxVertexNum]; //AdjList是邻接表类型
基本面函数
1.void CreatALGraph(ALGraph *G)//构造图
{ 定义边表结点s;
读入顶点数和边数;
读入顶点信息,并将边表置为空;
依次读入<入度点vi,出度点vj>边的信息直到输入的边数达到要求{
为s开辟新空间,邻接点序号为j,并将邻接点指针为i顶点的头指针值,将新结点*S插入顶点Vi的边表头部
为s再开辟新空间,邻接点序号为i,并将邻接点指针为j顶点的头指针值,将新结点*S插入顶点Vj的边表头部} }
2.void DFS(ALGraph *G,int i) //以Vi为出发点对邻接链表表示的图G进行DFS搜索
3.void DFSTraverseM(ALGraph *G)//对整个图进行深度搜索
4.void BFS(ALGraph *G,int k) //以Vk为源点对用邻接链表表示的图G进行广度优先搜索
5.void BFSTraverseM(ALGraph *G){//对整个图进行广度搜索
广度搜索时要建立队列并写队列的相应函数
6.void PrintALGraph(ALGraph *G){//输出表
四. 实验结果与分析
(包括运行结果截图、结果分析等)
五. 心得体会
(记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。

)失败点:1.scanf();输入格式上面出错,没有严格按照要求输出所以常常运行到一半就出错误
2.在刚开始的时候以为顶点Vertexnode中VerTex输入的是地址值,
学习点:1.typedef enum{FALSE,TRUE}Boolean;
声明了一个枚举类型一般形式为:enum [枚举名] {枚举元素列表};
也可以声明没有枚举名的枚举类型,就是像你给的那种,后边的bool是枚举类型的变量,可以对其进行赋值,不过只能用FALSE 或者TRUE进行赋值。

【附录----源程序】
test5_2.cpp
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include "AdjLink.h"
void main()
{
int i;
ALGraph *G=(ALGraph *)malloc(sizeof(ALGraph));
CreatALGraph(G);
PrintALGraph(G);
printf("Print Graph DFS:\n ");
DFSTraverseM(G);
printf("\n");
printf("Print Graph BFS:\n ");
BFSTraverseM(G);
printf("\n");
}
AdjLink.h
#include"stdio.h"
#include"stdlib.h"
#define MaxVertexNum 100
#define QueueSize 30
typedef enum{FALSE,TRUE}Boolean;
Boolean visited[MaxVertexNum];
typedef char VertexType;
typedef int EdgeType;
typedef struct node//边表结点
{ int adjvex; //邻接点域
node *next; //链域
}EdgeNode;
typedef struct
{ //顶点表结点
VertexType vertex; //顶点域
EdgeNode *firstedge; //边表头指针
}VertexNode;
typedef VertexNode AdjList[MaxVertexNum]; //AdjList是邻接表类型
typedef struct {
AdjList adjlist; //邻接表
int n,e; //图中当前顶点数和边数
} ALGraph; //图类型
/*=========建立无向图邻接表算法=======*/
void CreatALGraph(ALGraph *G)
{
int i,j,k;
EdgeNode *s; //定义边表结点
printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n ");
scanf("%d,%d",&(G->n),&(G->e)); //读入顶点数和边数
printf("请输入顶点信息(输入格式为:顶点号<CR>)每个顶点以回车作为结束:\n");
for(i=0;i<G->n;i++) //建立边表
{
scanf("\n%c",&(G->adjlist[i].vertex)); //读入顶点信息
G->adjlist[i].firstedge=NULL; //边表置为空表
}
printf("请输入边的信息(输入格式:i,j):\n");
for(k=0;k<G->e;k++) { //建立边表
scanf("\n%d,%d",&i,&j); //读入边(Vi,Vj)的顶点对序号
s=new EdgeNode;
s->adjvex=j; //邻接点序号为j
s->next=G->adjlist[i].firstedge;
G->adjlist[i].firstedge=s; //将新结点*S插入顶点Vi的边表头部
s=new EdgeNode;
s->adjvex=i; //邻接点序号为i
s->next=G->adjlist[j].firstedge;
G->adjlist[j].firstedge=s; //将新结点*S插入顶点Vj的边表头部}
}
void PrintALGraph(ALGraph *G){//输出表
int i;
for(i=0;i<G->n;i++){
printf("%d->",i);
while(G->adjlist[i].firstedge!=NULL){
printf("%d->",G->adjlist[i].firstedge->adjvex);
G->adjlist[i].firstedge=G->adjlist[i].firstedge->next;
}
printf("\n");}
}
/*=======深度优先遍历的递归算法======*/
void DFS(ALGraph *G,int i)
{ //以Vi为出发点对邻接链表表示的图G进行DFS搜索
EdgeNode *p;
printf("vsit vertex:%c\n",G->adjlist[i].vertex); //访问顶点Vi
visited[i]=TRUE; //标记Vi已访问
p=G->adjlist[i].firstedge; //取Vi边表的头指针
while(p) { //依次搜索Vi的邻接点Vj,这里j=p->adjvex if(! visited[p->adjvex]) //若Vj尚未被访问
DFS(G,p->adjvex); //则以Vj为出发点向纵深搜索p=p->next; //找Vi的下一个邻接点
}
}
void DFSTraverseM(ALGraph *G)
{
int i;
for(i=0;i<G->n;i++)
visited[i]=FALSE; //标志向量初始化
for(i=0;i<G->n;i++)
if(!visited[i]) //Vi未访问过
DFS(G,i); //以Vi为源点开始DFS搜索
}
/*==========BFS:广度优先遍历=========*/
typedef struct{
int front;
int rear;
int count;
int data[QueueSize];
}CirQueue;
void InitQueue(CirQueue *Q)
{
Q->front=Q->rear=0;
Q->count=0;
}
int QueueEmpty(CirQueue *Q)
{
return Q->count=QueueSize;
}
int QueueFull(CirQueue *Q)
{
return Q->count==QueueSize;
}
void EnQueue(CirQueue *Q,int x)
{
if(QueueFull(Q))
printf("Queue overflow");
else
Q->count++;
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%QueueSize;
}
}
int DeQueue(CirQueue *Q)
{
int temp;
if(QueueEmpty(Q))
{
printf("Queue underflow");
return NULL;
}
else
{
temp=Q->data[Q->front];
Q->count--;
Q->front=(Q->front+1)%QueueSize;
return temp;
}
}
void BFS(ALGraph *G,int k) { //以Vk为源点对用邻接链表表示的图G进行广度优先搜索int i;
CirQueue Q;
EdgeNode *p;
InitQueue(&Q);//队列初始化
printf("Visit vertex:%c\n",G->adjlist[k].vertex);
visited[k]=TRUE;
EnQueue(&Q,k);
while(!QueueEmpty(&Q)){
i=DeQueue(&Q);
p=G->adjlist[i].firstedge;
while(p){
if(!visited[p->adjvex]){
printf("vsit vertex:%c\n",G->adjlist[p->adjvex].vertex);
visited[p->adjvex]=TRUE;
EnQueue(&Q,p->adjvex);
}
p=p->next;
}
}
}
void BFSTraverseM(ALGraph *G){//对整个图进行广度搜索
for(i=0;i<G->n;i++)visited[i]=FALSE; for(i=0;i<G->n;i++)
if(!visited[i])
BFS(G,i);
}。

相关文档
最新文档