1、数据结构 图的遍历演示中南民族大学学生实验报告院 系: 数学与统计学学院 专 业: 统计学 年 级: 2008级 课程名称: 数据结构 学 号: 姓 名: 指导教师: 2010年 12 月 8日年级2008级班号学号专业统计学姓名实验名称图的遍历演示实验类型设计型综合型创新型 实 验 目 的或要求要求: l1 图采用领接表的存储结构 l2 深度优先搜索图 l3 广度优先搜索图 实验原理(算法流程)#include #include #define MAX_VERTEX_NUM 20#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#defi
2、ne TRUE 1#define OK 1#define FALSE 0#define ERROR 0#define OVERFLOW -2typedef enumDG,DN,UDG,UDNGraphKind;/有向图,有向网,无向图,无向网bool visitedMAX_VERTEX_NUM;typedef struct ArcNode int adjvex;/该弧所指向的顶点在数组中的下标 struct ArcNode *nextarc; int *info;/该弧相关信息的指针ArcNode;typedef struct VNode int data;/顶点信息 ArcNode *fir
3、starc;/指向第一条依附该顶点的弧的指针VNode,AdjListMAX_VERTEX_NUM;typedef struct AdjList vertices; int vexnum,arcnum;/图的当前顶点数和弧数 int kind;/图的种类标志ALGraph;typedef struct int *base; int *top; int stacksize;SqStack;typedef struct QNode int data; struct QNode *next;QNode,*QueuePtr;typedef struct QueuePtr front; QueuePtr
4、 rear;LinkQueue;int LocateVex(ALGraph G,int v)/返回数组下标值 int i; for(i=0;iMAX_VERTEX_NUM;+i) if(G.verticesi.data=v) return i; return -1;void CreateDN(ALGraph &G)/采用邻接表存储表示,构造有向图G(G.kind=DN) int i,j,k;ArcNode *p;int v1,v2; G.kind=DN; printf( 输入顶点数:); scanf(%d,&G.vexnum); printf( 输入弧数:); scanf(%d,&G.arcn
5、um); printf( 输入顶点:n); for(i=0;iG.vexnum;+i) /构造表头向量 scanf(%d,&G.verticesi.data); G.verticesi.firstarc=NULL;/初始化指针 for(k=0;kadjvex=j;p-nextarc=G.verticesi.firstarc; G.verticesi.firstarc=p; scanf(%d,&p-info); /forint Push(SqStack &S,int e) /插入元素e为新的栈顶元素 if(S.top-S.base=S.stacksize) /栈满,追加存储空间 S.base=(
6、int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int); if(!S.base)exit(OVERFLOW); /存储分配失败 S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; *S.top+=e; return OK;int InitStack(SqStack &S) /栈的初始化 S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int); if(!S.base)exit(OVERFLOW); /存储分配失败 S.top=S.ba
7、se; S.stacksize=STACK_INIT_SIZE; return OK;int Pop(SqStack &S,int &e) /删除栈顶元素/若栈不空,则删除S的栈顶元素,用e返回其值 if(S.top=S.base) return ERROR; e=*-S.top; return OK;int GetTop(SqStack S,int &e) /取栈顶元素/若栈不空,则用e返回S的栈顶元素 if(S.top=S.base) return ERROR; e=*(S.top-1); return OK;int StackEmpty(SqStack S) /栈空 if(S.top=S
8、.base) return TRUE; else return FALSE;int InitQueue(LinkQueue &Q) /队列初始化 Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode); if(!Q.front)exit(OVERFLOW); Q.front-next=NULL; return OK;int EnQueue(LinkQueue &Q,int e) /插入/插入元素e为Q的新的队尾元素 QueuePtr p=(QueuePtr)malloc(sizeof(QNode); if(!p)exit(OVERFLOW); p-data=
9、e;p-next=NULL; Q.rear-next=p; Q.rear=p; return OK;int DeQueue(LinkQueue &Q,int &e) 若队列不空,则删除Q的队头元素,用e返回其值 if(Q.front=Q.rear) return ERROR; QueuePtr p=Q.front-next; e=p-data; Q.front-next=p-next; if(Q.rear=p)Q.rear=Q.front; free(p); return OK;int QueueEmpty(LinkQueue Q) /队列空 if(Q.front=Q.rear) return
10、 TRUE; else return FALSE;int FirstAdjVex(ALGraph G,int u) if(!G.verticesu.firstarc) return -1; return LocateVex(G,G.verticesu.firstarc-adjvex);int NextAdjVex(ALGraph G,int u,int w) ArcNode *p=G.verticesu.firstarc; while(p&LocateVex(G,p-adjvex)!=w) p=p-nextarc; if(!p) return FirstAdjVex(G,u); p=p-nex
11、tarc; if(!p) return -1; return LocateVex(G,p-adjvex);void Visit(ALGraph G,int v) printf(%2d,G.verticesv.data);void DFSTraverse(ALGraph G)/按深度优先非递归遍历图G,使用辅助栈S和访问标志数组visited int v,w;SqStack S; for(v=0;vG.vexnum;v+) visitedv=FALSE; InitStack(S); for(v=0;v=0;w=NextAdjVex(G,v,w) if(!visitedw) Visit(G,w);
12、 visitedw=TRUE; Push(S,w); GetTop(S,v); /if /for Pop(S,v); GetTop(S,v); /while /if printf(n); void BFSTraverse(ALGraph G)/按广度优先非递归遍历图G,使用辅助队列Q和访问标志数组visited int v,u,w;LinkQueue Q; for(v=0;vG.vexnum;+v) visitedv=FALSE; InitQueue(Q); for(v=0;v=0;w=NextAdjVex(G,u,w) if(!visitedw) /w为u的尚未访问的邻接顶点 visited
13、w=TRUE;Visit(G,w); EnQueue(Q,w); /if /while /if printf(n);void PrintDN(ALGraph G) /图的显示 int i;ArcNode *p; printf(顶点:n); for(i=0;iG.vexnum;+i) printf(%2d,G.verticesi.data); printf(n弧:n); for(i=0;iadjvex,p-info); p=p-nextarc; printf(n); /if /forvoid main() ALGraph G; printf(*题目:图的遍历*nn); CreateDN(G); PrintDN(G); printf( 深度优先遍历:); DFSTraverse(G); printf(n 广度优先遍历:); BFSTraverse(G);组内分工(可 选) 0 8 2 2 1 6 7 3 1 6 4 5 4 3 9 5 7 (所要遍历的图) 主程序实 验结果分析及心 得 体 会 实验结果成绩评定 教师签名: 2010年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1