教学计划数据结构课程设计说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中北大学
数据结构
课程设计说明书
20XX年12月20日
1设计目的
《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的:
1)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4)训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
…………………………..
2.设计内容和要求
设计内容:
(1) 设定专业开设课程(不少于30门,可参考本专业课程计划),及课程之间的依赖关系(如离散数学应在数据结构之前开设)。
(2)制定课程安排计划,并满足各学期课程数目大致相同。
设计要求:
(1) 符合课题要求,实现相应功能;
(2) 要求界面友好美观,操作方便易行;
(3) 注意程序的实用性、安全性;
…………………………
3.本设计所采用的数据结构
邻接表存储图结构,拓扑排序实现课程的先修依赖关系
……………………….
4.功能模块详细设计
4.1详细设计思想
1.程序主要包括五个模块
1)、图的邻接表的存储表示,即结构体的定义
typedef char VertexType[MAX_NAME];
typedef struct ArcNode
{
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针}ArcNode; // 链表结点
typedef struct //链接表
{
VertexType data; //顶点信息
int grades; //存储学分信息
ArcNode *firstarc; //指向第一条依附该顶点的弧的指针}VNode, AdjList[MAX_VERTEX_NUM]; // 头结点
typedef struct
{
AdjList vertices; //vertices 存储课程名
int vexnum, arcnum; // 图的当前顶点数和边数}ALGraph;
2)、利用前插法,建立图的邻接链表
printf("请输入下列课程的先修课程(无先修课程输入0结束后也输入0)\n");
for (k=0;k { printf("%s的先修课程:",G.vertices[k].data); scanf("%s",va); while (va[0]!='0') { i = LocateVex(G, va);//弧头 j = k; //弧尾 p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjvex = j; p->nextarc = G.vertices[i].firstarc; // 插在表头 G.vertices[i].firstarc = p; scanf("%s",va); } } 3)、输出图的顶点和边 printf("%d个顶点", G.vexnum); for (i = 0;i < G.vexnum;++i) printf("%4s", G.vertices[i].data); printf(" \n%d条弧边:\n",G.arcnum); for (i = 0;i < G.vexnum;i++) { p = G.vertices[i].firstarc; while (p) { printf("%s--->%s\n",G.vertices[i].data,G.vertices[p->adjvex].data); p = p->nextarc; } } 4)、通过栈实现拓扑排序 FindInDegree(G, indegree); // 对各顶点求入度 InitStack(S); // 初始化栈 for (i = 0;i < G.vexnum;++i) //建零入度顶点栈S if (!indegree[i]) Push(S, i); // 入度为0者进栈 count = 0; // 对输出顶点计数 while (!StackEmpty(S)) { Pop(S, i); printf("%s(%d分),",G.vertices[i].data,G.vertices[i].grades); Temp[j++] = G.vertices[i]; //将当前的拓扑序列保存起来 ++count; // 输出i号顶点并计数 for (p =G.vertices[i].firstarc; p; p=p->nextarc)// 对i号顶点的每个邻接点的入度减1 { k = p->adjvex; if (!(--indegree[k])) // 若入度减为0,则入栈 Push(S, k); } } if (count < G.vexnum) { printf("此有向图有回路无法完成拓扑排序"); return ERROR; } else printf( " 为一个拓扑序列"); printf("\n"); Return OK Return ERROR