实验六 图的应用及其实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六图的应用及其实现
一、实验目的
1.进一步功固图常用的存储结构。
2.熟练掌握在图的邻接表实现图的基本操作。
3.理解掌握AOV网、AOE网在邻接表上的实现以及解决简单的应用问题。
二、实验内容
从键盘上输入AOV网的顶点和有向边的信息,建立其邻接表存储结构,然后对该图拓扑排序,并输出拓扑序列. 试设计程序实现上述AOV网的类型定义和基本操作,完成上述功能。
相关常量及结构定义:
typedef int InfoType;
typedef char VertexType;
typedef int SElemType;
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STAXKINCREMENT 10 //存储空间分配增量
#define MAX_VERTEX_NUM 20
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
InfoType *info;
}ArcNode;
typedef struct VNode
{
VertexType data;
struct ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct ALGraph
{
AdjList vertices;
int vexnum, arcnum;
int kind;
}ALGraph;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
设计相关函数声明:
int CreateDG(ALGraph &G)
int InitStack(SqStack &S)
int Push(SqStack &S,SElemType e)
int Pop(SqStack &S,SElemType &e)
int StackEmpty(SqStack S)
void FindInDegree(ALGraph G,int *indegree)
int TopologicalSort(ALGraph G)
三、数据结构与核心算法的设计描述
1.创建AOV网
int CreateDG(ALGraph &G)
{
int i,j,k,v1,v2;
cout<<"请输入该图的顶点数:"<<"请输入该图的边数:"< cin>>G.vexnum>>G.arcnum; for(i=0;i { G.vertices[i].data=i; G.vertices[i].firstarc=NULL; } cout<<"请输入一条边的始点和终点:"< for(k=0;k { cout<<"请输入第"< cin>>v1>>v2; i=v1; j=v2; while(i<1||i>G.vexnum||j<1||j>G.vexnum) { cout<<"请输入第"< cin>>v1>>v2; i=v1; j=v2; } i--;j--; ArcNode *p; p=(ArcNode *)malloc(sizeof(ArcNode)); if(!p) return -1; p->adjvex=j; p->nextarc=G.vertices[i].firstarc; p->info=NULL; G.vertices[i].firstarc=p; G.vertices[i]; } return 0; } 2.初始化栈 int InitStack(SqStack &S) { S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit (-1); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return 0; } 3.入栈 int Push(SqStack &S,SElemType e) { if(S.top-S.base>=S.stacksize) { S.base=(SElemType*)realloc(S.base,(S.stacksize+STAXKINCREME NT)*sizeof(SElemType)); if(!S.base) exit (-1); S.top=S.base+S.stacksize; S.stacksize+=STAXKINCREMENT; } *S.top++=e; return 0; } 4.出栈 int Pop(SqStack &S,SElemType &e) { if(S.top==S.base) return -1; e=*--S.top; return 0; } 5.判断栈是否为空 int StackEmpty(SqStack S) { if(S.top==S.base) return -1; else return 0;