数据结构教学计划编制1.docx
- 文档编号:16899378
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:12
- 大小:17.20KB
数据结构教学计划编制1.docx
《数据结构教学计划编制1.docx》由会员分享,可在线阅读,更多相关《数据结构教学计划编制1.docx(12页珍藏版)》请在冰点文库上搜索。
数据结构教学计划编制1
主要设计程序
#include
#include
#include
#include
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineMAX_NAME3
#defineMAXCLASS100 //顶点字符串的最大长度
#defineMAX_VERTEX_NUM100 //最大顶点数
#defineN12
typedefcharVertexType[MAX_NAME];
intTotalTerms; //学期总数
intMaxScores; //学分上限
/*----图的邻接表存储表示----*/
typedefstructArcNode
{
intadjvex; //该弧所指向的顶点的位置弧的节点结构
structArcNode*nextarc; //指向下一条弧的指针
}ArcNode; //链表结点
typedefstruct //链接表
{
VertexTypedata; //顶点信息
intgrades; //存储学分信息
ArcNode*firstarc; //指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VERTEX_NUM]; //头结点
typedefstruct
{
AdjListvertices; //vertices存储课程名
intvexnum,arcnum; //图的当前顶点数和弧数
}ALGraph;
voidOUTPUT()
{
ints;
printf("\t\t 教学计划编制菜单 \n");
printf("\t\t课程代码 |课程名称 |优先课程 \n");
printf("\t\tC1 |程序设计基础 |无 \n");
printf("\t\tC2 |离散数学 |C1 \n");
printf("\t\tC3 |数据结构 |C1,C2 \n");
printf("\t\tC4 |汇编语言 |C1 \n");
printf("\t\tC5 |语言的设计和分析|C3,C4 \n");
printf("\t\tC6 |计算机原理 |C11 \n");
printf("\t\tC7 |编译原理 |C5,C3 \n");
printf("\t\tC8 |操作系统 |C3,C6 \n");
printf("\t\tC9 |高等数学 |无 \n");
printf("\t\tC10 |线性代数 |C9 \n");
printf("\t\tC11 |普通物理 |C9 \n");
printf("\t\tC12 |数值分析 |C9,C10,C1\n");
printf("pressanynumkeytocontinue:
");
scanf("%d",&s);
}
/*查找图中某个顶点位置*/
intLocateVex(ALGraphG,VertexTypeu)
{
inti;
for(i=0;i if(strcmp(u,G.vertices[i].data)==0) returni; return-1; } /*采用邻接表存储结构*/ intCreateGraph(ALGraph&G) { inti,j,k; VertexTypeva; ArcNode*p; printf("请输入教学计划的课程数: "); scanf("%d",&G.vexnum); printf("请输入各个课程的先修课程的总和(弧总数): "); scanf("%d",&G.arcnum); printf("请输入%d个课程的课程号(最多%d个字符,数字+字母): ",G.vexnum,MAX_NAME); for(i=0;i { scanf("%s",&G.vertices[i].data); G.vertices[i].firstarc=NULL; } printf("请输入%d个课程的学分值: ",G.vexnum); for(i=0;i { scanf("%d",&G.vertices[i].grades); } 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); } } returnOK; } /*输出图G的信息*/ voidDisplay(ALGraphG) { inti; ArcNode*p; printf("有向图\n"); printf("%d个顶点",G.vexnum); for(i=0;i printf("%4s",G.vertices[i].data); printf("\n%d条弧边: \n",G.arcnum); for(i=0;i { p=G.vertices[i].firstarc; while(p) { printf("%s--->%s\n",G.vertices[i].data,G.vertices[p->adjvex].data); p=p->nextarc; } } } /*求顶点的入度*/ voidFindInDegree(ALGraphG,intindegree[]) { inti; ArcNode*p; for(i=0;i for(i=0;i { p=G.vertices[i].firstarc; while(p) { indegree[p->adjvex]++; p=p->nextarc; } } } structName { charc[20]; }name; voidpuanduan(VertexTypestr,structNamename[],intn) { if(strcmp(str,name[0].c)==0) printf("程序设计基础"); if(strcmp(str,name[1].c)==0) printf("离散数学"); if(strcmp(str,name[2].c)==0) printf("数据结构"); if(strcmp(str,name[3].c)==0) printf("汇编语言"); if(strcmp(str,name[4].c)==0) printf("语言的设计和分析"); if(strcmp(str,name[5].c)==0) printf("计算机原理"); if(strcmp(str,name[6].c)==0) printf("编译原理"); if(strcmp(str,name[7].c)==0) printf("操作系统"); if(strcmp(str,name[8].c)==0) printf("高等数学"); if(strcmp(str,name[9].c)==0) printf("线性代数"); if(strcmp(str,name[10].c)==0) printf("普通物理"); if(strcmp(str,name[11].c)==0) printf("数值分析"); // } } /*栈定义*/ typedefintSElemType; //栈类型 #defineStack_NUM20 //存储空间初始分配量 #defineStack_MoreNUM5 //存储空间分配增量 typedefstructSqStack { SElemType*base; SElemType*top; intstacksize; //分配的存储空间 }SqStack; /*栈的初始化*/ intInitStack(SqStack&S) { S.base=(SElemType*)malloc(Stack_NUM*sizeof(SElemType)); if(! S.base) exit(-1); S.top=S.base; S.stacksize=Stack_NUM; returnOK; } /*判空*/ intStackEmpty(SqStackS) { if(S.top==S.base) returnTRUE; else returnFALSE; } /*出栈*/ intPop(SqStack&S,SElemType&e) { if(S.top==S.base) returnERROR; e=*--S.top; returnOK; } /*入栈*/ intPush(SqStack&S,SElemTypee) { if(S.top-S.base>=S.stacksize) { S.base=(SElemType*)realloc(S.base,(S.stacksize+Stack_MoreNUM)*sizeof(SElemType)); if(! S.base)exit(-1); S.top=S.base+S.stacksize; S.stacksize+=Stack_MoreNUM; } *S.top++=e; returnOK; } /*拓扑排序*/ intTopoSort(ALGraphG,AdjListTemp,structNamename[]) { inti,k,j=0,count,indegree[MAX_VERTEX_NUM]; SqStackS; ArcNode*p; FindInDegree(G,indegree); //对各顶点求入度 InitStack(S); //初始化栈 for(i=0;i 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 { printf("此有向图有回路无法完成拓扑排序"); returnERROR; } elseprintf(" 为一个拓扑序列"); printf("\n"); intq=1,Z=0; while(q<=TotalTerms) { intC=Temp[Z].grades; printf("\n第%d个学期应学课程: ",q); while(C<=MaxScores) { C=C+Temp[Z+1].grades; if(Z { puanduan(Temp[Z].data,name,N); ++Z; } } printf("\n"); if(q==TotalTerms)printf("\n课程编制完成! "); q++; } returnOK; } voidmain() { ALGraphG; AdjListTemp; structNamename[N]={{"C1"},{"C2"},{"C3"},{"C4"},{"C5"},{"C6"},{"C7"},{"C8"},{"C9"},{"C10"},{"C11"},{"C12"}}; OUTPUT(); printf("**********教学计划编制问题**********\n"); printf("请输入学期总数: "); scanf("%d",&TotalTerms); printf("请输入学期的学分上限: "); scanf("%d",&MaxScores); CreateGraph(G); Display(G); TopoSort(G,Temp,name); printf("OK\n"); scanf("*c"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 教学计划 编制