1、课程设计报告模板算法与数据结构课程设计报告题目: 教学计划编制问题 专业: 网络工程 班级: 2 学号: 1030040259 姓名: 魏益松 指导教师: 姜忠海 完成日期:2012年 6月 24日一、课程设计目的本课程设计的目标就是要达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,并培养基本的、良好的程序设计技能以及合作能力。设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结
2、构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。二、课程设计内容针对计算机系本科课程,依据其相互依赖关系制定课程安排计划,其相互依赖关系如下图所示,并要求各学期课程数目大致相同且搭配适当。基本要求(1)求解上图的拓扑排序结果。(2)上述课程在4学期上完,要求每学期上课的门数大致一样。三、课程设计过程1需求分析根据课程间的依赖关系,制定课程安排计划。按照用户的输入建立一个邻接表,输出拓扑排序结果。按照用户输入的课程数,学期数,课程间的先后关系数目以及课程间两两间的先后关系,程序执行后会给出每学期
3、应学的课程。(1) 输入的形式和输入值的范围:输入间用空格隔开。要求用户输入的课程数小于20,学期数小于或是等于20,课程名的长度小于等于20个字符。(2) 输出的形式:输出本程序使用的课程及先后关系表,输出各个顶点的入读数和邻接点,输出一个拓扑排序结果;输出各个学期应学的课程代号。(3) 程序所能达到的功能:按照用户的输入,输出拓扑排序结果。按照用户的输入,给出每学期应学的课程。2概要设计1.头文件#include #include #include #include using namespace std;#define MAX_VERTEX_NUM 20 /最大顶点个数2. 定义链式队列
4、typedef int ElemType;typedef struct QNode ElemType data; struct QNode *next; QNode,*QueuePtr;typedef struct QueuePtr front; QueuePtr rear; LinkQueue;3. 初始化链式队列void InitQueue(LinkQueue *Q) Q-front=Q-rear=(QueuePtr)malloc(sizeof(QNode); if (!(Q-front) exit(0); Q-front-next=NULL; 4. 判断空队列int QueueEmpty
5、(LinkQueue Q) if(Q.front=Q.rear) return 1; else return 0; 5. 入队列void EnQueue(LinkQueue *Q, ElemType e) QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode); if (!p) exit(0); p-data=e; p-next=NULL; Q-rear-next=p; Q-rear=p; 6.出队列void DeQueue(LinkQueue *Q, ElemType *e) QueuePtr p; if(Q-front!=Q-rear) p=Q-front
6、-next; *e=p-data; Q-front-next=p-next; if (Q-rear=p) Q-rear=Q-front; free(p); 7.图与邻接表typedef char VertexType20; /顶点信息(名称)/* 图的类型定义(邻接表存储结构) */typedef struct ArcNode /链表结点 int vexpos; /该弧所指向的顶点在数组中的位置 struct ArcNode *next; /指向当前起点的下一条弧的指针 ArcNode;typedef struct VNode /头结点 VertexType name; /顶点信息(名称) i
7、nt indegree; /顶点入度 ArcNode *firstarc; /指向当前顶点的第一条弧的指针 VNode,AdjListMAX_VERTEX_NUM;typedef struct AdjList vexhead; /邻接表头结点数组 int vexnum,arcnum; /图的顶点数和弧数 ALGraph8.定位顶点的头节点int LocateVex(ALGraph G,VertexType v) int i; for(i=0;iG.vexnum;i+) if(strcmp(v,G.vexheadi.name)=0) break; return i; 9. 建立邻接表int Cr
8、eateGraph(ALGraph *G) /成功建立返回1,不成功则返回0 int i,j,k; VertexType v1,v2;ArcNode *newarc; printf(n输入有向图顶点数和弧数vexnum,arcnum:); /输入顶点数和弧数 scanf(%d,%d,&(*G).vexnum,&(*G).arcnum); /输入并判断顶点数和弧数是否正确 if(*G).vexnum0|(*G).arcnum(*G).vexnum*(*G).vexnum-1) printf(n顶点数或弧数不正确,有向图建立失败!n);return 0; printf(n输入 %d 个顶点:,(*
9、G).vexnum); /输入顶点名称 for(i=0;i(*G).vexnum;i+) scanf(%s,(*G).vexheadi.name); printf(n顶点列表:n共有%d个顶点: ,(*G).vexnum);/输出顶点名称 for(i=0;i(*G).vexnum;i+) printf(%s ,(*G).vexheadi.name); for(i=0;i(*G).vexnum;i+) /邻接表初始化 (*G).vexheadi.firstarc=NULL; (*G).vexheadi.indegree=0; printf(nn输入 %d 条边:vi vjn,(*G).arcnu
10、m); /输入有向图的边 for(k=0;k=(*G).vexnum) printf(顶点%s不存在,有向图建立失败!n,v1);return 0; if(j=(*G).vexnum) printf(顶点%s不存在,有向图建立失败!n,v2);return 0; newarc=(ArcNode*)malloc(sizeof(ArcNode); /前插法建顶点链表 newarc-vexpos=j; if(*G).vexheadi.firstarc=NULL) newarc-next=NULL; (*G).vexheadi.firstarc=newarc; else newarc-next=(*G
11、).vexheadi.firstarc-next; (*G).vexheadi.firstarc-next=newarc; (*G).vexheadj.indegree+; /对应顶点入度计数加1 printf(n有向图建立成功!n); return 1;10. 按邻接表方式输出有向图void PrintGraph(ALGraph G) int i;ArcNode *p; printf(n输出有向图:n); for(i=0; ivexpos.name); p=p-next; printf(n); 11. 输出本程序使用的课程及先后关系表int CreateGraph2(ALGraph *G)
12、/* 输出本程序使用的课程及先后关系表 */ cout课程及先修课程关系表endl; coutendl; cout课程代号 课程名称 先修课程 endl; coutendl; coutc1 高等数学 无 endl; coutendl; coutc2 程序设计 无 endl; coutendl; coutc3 离散数学 c1 endl; coutendl; coutc4 数据结构 c2 c3 endl; coutendl; coutc5 编译原理 c2 c4 endl; coutendl; coutc6 操作原理 c4 c7 endl; coutendl; coutc7 计算机组成原理 c2 e
13、ndl; coutendl; system(PAUSE); (*G).vexnum=8; (*G).arcnum=16; return 0;12. 按邻接表方式输出课程图void PrintGraph2(ALGraph G) int i;ArcNode *p; printf(n输出有向图:n); for(i=0; ivexpos.name); p=p-next; printf(n); 13.拓扑排序void TopologicalSort(ALGraph G) int i,k,count;ElemType e;ArcNode *p; LinkQueue Q; /*定义队列*/ InitQueu
14、e(&Q); for(i=0; inext) /遍历当前课程的邻接点 k=p-vexpos; /邻接点位置 if(!(-G.vexheadk.indegree) /每个邻接点入度减1后若为零则入队列 EnQueue(&Q,k); printf(n); if(countG.vexnum) printf(n该有向图有回路,无法完成拓扑排序!n); 14. 主函数void main() ALGraph G; int menu,menu2; while(1) printf(n *n); printf( * 1.输出课程及先修课程关系表 *n); printf( * 2.建立有向图并求一个拓扑排序序列
15、*n); printf( * 3.退出 *n); printf( *n); printf( 请输入你的选择:); scanf(%d,&menu); switch(menu) case 1: if(CreateGraph2(&G) /有向图建成则执操作 system(PAUSE); PrintGraph2(G); system(PAUSE); break; case 2: if(CreateGraph(&G) /有向图建成则执操作 system(PAUSE); PrintGraph(G);system(PAUSE); TopologicalSort(G); break; case 3: retu
16、rn; 3详细设计1.教学计划编程问题,主要是根据不同课程之间的依赖关系来分配先后顺序。是拓扑排序的应用,邻接表为主要存储结构,队列为辅助结构。利用宏定义来完成一些变量的赋值:2、本程序包含 8个函数:( 1 )主函数 main( )( 2 )创建一个队列InitQueue ( )( 3 ) 判断空队列QueueEmpty ( ) ( 4 )入队操作 enqueue( ) ( 5 )出队操作 dequeue( ) ( 6 )定位顶点 LocateVex ( )(7)创建邻接表CreateGraph()(8)输出有向图 PrintGraph()(9)拓扑排序 TopologicalSort()
17、(10 )菜单操作 menu( )4调试分析 调试过程中遇到很多问题,大多是和同学讨论共同修改。由于只输出拓扑排序结果,没有输出学期安排,用队列存储不知道怎么实现学期安排,又编写了一个用栈来存储的学期输出程序,在附录中有。5用户使用说明根据提示输入。6测试结果7附录#include #include #include #include #include #define TRUE 1 #define FALSE 0 typedef int Status; typedef int Boolean; #define MAX_NAME 10 #define MAXCLASS 100 int Z=0;
18、int X=0; int xqzs,q=1,xfsx; typedef int InfoType; typedef char VertexTypeMAX_NAME; /* 字符串类型*/ /* 图的邻接表存储表示*/ #define MAX_VERTEX_NUM 100 typedef enumDGGraphKind; typedef struct ArcNode int adjvex; struct ArcNode *nextarc; InfoType *info; ArcNode; typedef struct VertexType data; /* 顶点信息*/ ArcNode *fir
19、starc; /* 第一个表结点的地址,指向第一条依附该顶点的弧的指针*/ VNode,AdjListMAX_VERTEX_NUM; /* 头结点*/ typedef struct AdjList vertices,verticestwo; int vexnum,arcnum; /* 图的当前顶点数和弧数*/ int kind; /* 图的种类标志*/ ALGraph;/* 图的邻接表存储的基本操作*/ int LocateVex(ALGraph G,VertexType u) /* 初始条件: 图G存在,u和G中顶点有相同特征*/ /* 操作结果: 若G中存在顶点u,则返回该顶点在图中位置;
20、否则返回-1 */ int i; for(i=0;iG.vexnum;+i) if(strcmp(u,G.verticesi.data)=0) return i; return -1;Status CreateGraph(ALGraph *G) /* 采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造种图) */ int i,j,k; VertexType va,vb; ArcNode *p; (*G).vexnum=7; printf(请输入拓扑排序所形成的课程先修关系的边数: ); scanf(%d,&(*G).arcnum); printf(请输入7个课程的代表值(7个字符):n
21、,(*G).vexnum,MAX_NAME); for(i=0;i(*G).vexnum;+i) /* 构造顶点向量*/ scanf(%s,(*G).verticesi.data); (*G).verticesi.firstarc=NULL; printf(请输入每条弧(边)的弧头和弧尾(以空格作为间隔):n); for(k=0;kadjvex=j; p-info=NULL; /* 图*/ p-nextarc=(*G).verticesi.firstarc; /* 插在表头*/ (*G).verticesi.firstarc=p; return OK; void Display(ALGraph
22、 G) /* 输出图的邻接矩阵G */ int i; ArcNode *p; switch(G.kind) case DG: printf(有向图n); printf(%d个顶点:n,G.vexnum); for(i=0;iG.vexnum;+i) printf(%s ,G.verticesi.data); printf(n%d条弧(边):n,G.arcnum); for(i=0;iadjvex.data); p=p-nextarc; printf(n); void FindInDegree(ALGraph G,int indegree) /* 求顶点的入度,算法调用*/ int i; Arc
23、Node *p; for(i=0;iG.vexnum;i+) indegreei=0; /* 赋初值*/ for(i=0;iadjvex+; p=p-nextarc; typedef int SElemType; /* 栈类型*/ /*栈的顺序存储表示*/ #define STACK_INIT_SIZE 10 /* 存储空间初始分配量*/ #define STACKINCREMENT 2 /* 存储空间分配增量*/ typedef struct SqStack SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */ SElemType *top; /* 栈顶指针*/ int stacksize; /* 当前已分配的存储空间,以元素为单位*/ SqStack; /* 顺序栈*/ /* 顺序栈的基本操作*/ Status InitStack(SqSta
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1