教学编制问题c语言数据结构实现Word文档格式.docx
《教学编制问题c语言数据结构实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《教学编制问题c语言数据结构实现Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
将课程排序后并决定出每学期所学课程,输出图G的信息Display(G):
将图的顶点和弧边输出
三:
程序模块及可实现的功能简介:
1)、图的邻接表的存储表示,即结构体的定义
typedefstructArcNode
{
intAdjOfV;
//该弧所指向的顶点的位置
structArcNode*next;
//指向下一条弧的指针
}ArcNode;
typedefcharVertexType[MAXOfNAME];
typedefstruct//链接表
VertexTypedata;
//顶点信息
intgrades;
//存储学分信息
ArcNode*first;
//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VER];
//头结点
typedefstruct
AdjListver;
//vertices存储课程名
intvexnum,arcnum;
//图的当前顶点数和弧数
}ALGraph;
2)、利用前插法,建立图的邻接链表
printf("
请输入下列课程的先修课程(无先修课程输入0结束后也输入0)\n"
);
for(h=0;
h<
G.vexnum;
++h)//构造表结点链表,利用前插法
{
printf("
%s的先修课程:
"
G.ver[h].data);
scanf("
%s"
va);
getchar();
while(va[0]!
='
0'
)
{
i=LocateVex(G,va);
//弧头
j=h;
//弧尾
p=(ArcNode*)malloc(sizeof(ArcNode));
p->
AdjOfV=j;
next=G.ver[i].first;
//插在表头
G.ver[i].first=p;
getchar();
}
}?
3)、输出图的顶点和边
%d个顶点"
G.vexnum);
for(i=0;
i<
G.vexnum;
++i)printf("
%4s"
G.ver[i].data);
\n%d条弧边:
\n"
G.arcnum);
i++)
{p=G.ver[i].first;
while(p)
{printf("
%s---->
%s\n"
G.ver[i].data,G.ver[p->
AdjOfV].data);
p=p->
next;
4)、通过栈实现拓扑排序
?
intTopologicalOrder(ALGraphG,AdjListR,structNamename[])
inti,k,j=0,count,indegree[MAX_VER];
SqStackS;
ArcNode*p;
FindInDegree(G,indegree);
//对各顶点求入度
InitStack(S);
//初始化栈
++i)//建零入度顶点栈S
if(!
indegree[i])Push(S,i);
//入度为0者进栈
count=0;
//对输出顶点计数
while(!
StackEmpty(S))
{
Pop(S,i);
printf("
%s(%d学分),"
G.ver[i].data,G.ver[i].grades);
R[j++]=G.ver[i];
//将当前的拓扑序列保存起来
++count;
//输出i号顶点并计数
for(p=G.ver[i].first;
p;
p=p->
next)//对i号顶点的每个邻接点的入度减1
{
k=p->
AdjOfV;
if(!
(--indegree[k]))//若入度减为0,则入栈
Push(S,k);
}
}
if(count<
G.vexnum)
{
此有向图有回路无法完成拓扑排序"
return0;
elseprintf("
为一个拓扑序列"
printf("
intq=1,Z=0;
while(q<
=TotalOfTerms)
intC=R[Z].grades;
\n第%d个学期应学课程:
q);
while(C<
=MaxScores)
{
C=C+R[Z+1].grades;
if(Z<
CmpOfStr(R[Z].data,name,N);
/*让C1~C12分别与12门课程对应起来*/
++Z;
}
if(q==TotalOfTerms)printf("
\nOKOver!
q++;
return1;
/**/
}
拓扑排序要点:
依次将入度为0的顶点存入InDegree中,对每个顶点求入度,并存入数组InDegree[i]中(i=0…n),初始化栈Stack,Counter=0,对以i号顶点为尾弧的每个邻接点的入度减1,并将入度减1后为零的顶点号压入栈中,输出i,计数器加1(Counter++),推出栈顶的一个元素(入度为零的顶点号)至i,输出i,计数器加1(Counter++),堆栈是否为空?
,n个顶点全输出,依次将入度为0的顶点存入InDegree中
5)根据学分上限决定出每学期应学课程,其中R[]中存储的是经过拓扑排序后的课程先后顺序。
intq=1,Z=0;
{C=C+R[Z+1].grades;
if(Z<
CmpOfStr(R[Z].data,name,N);
++Z;
四:
具体的源代码
本程序分为三部分
A:
:
SeqStack.h
1)#defineStackofNUM20//存储空间初始分配量
2)#defineStackforMore5//存储空间分配增量
3)typedefstructSqStack
4){
5)int*a;
6)int*top;
7)intsize;
//分配的存储空间
8)}SqStack;
9)intInitStack(SqStack&
S)/*栈的初始化*/
10){
11)S.a=(int*)malloc(StackofNUM*sizeof(int));
12)if(!
S.a)exit(-1);
13)S.top=S.a;
14)S.size=StackofNUM;
15)return1;
16)}
17)intStackEmpty(SqStackS)/*判断栈是否为空*/
18){
19)if(S.top==S.a)return1;
20)elsereturn0;
21)}
22)intPush(SqStack&
S,intx)/*入栈*/
23){
24)if(S.top-S.a>
=S.size)
25){
26)S.a=(int*)realloc(S.a,(S.size+StackforMore)*sizeof(int));
27)if(!
S.a)exit(-1);
28)S.top=S.a+S.size;
29)S.size+=StackforMore;
30)}
31)*S.top++=x;
32)return1;
33)}
34)intPop(SqStack&
S,int&
x)/*出栈*/
35){
36)if(S.top==S.a)return0;
37)x=*--S.top;
38)return1;
39)}
B:
ALGraph.h
40)#defineMAXOfNAME3//最多字符个数
41)#defineMAX_VER100//最大顶点数
42)typedefstructArcNode
43){
44)intAdjOfV;
45)structArcNode*next;
46)}ArcNode;
47)typedefcharVertexType[MAXOfNAME];
48)typedefstruct//链接表
49){
50)VertexTypedata;
51)intgrades;
52)ArcNode*first;
53)}VNode,AdjList[MAX_VER];
54)typedefstruct
55){
56)AdjListver;
57)intvexnum,arcnum;
58)}ALGraph;
59)intTotalOfTerms;
//学期总数
60)intMaxScores;
//学分上限
61)intLocateVex(ALGraphG,VertexTypeu)/*查找图中某个顶点位置*/
62){
63)inti;
64)for(i=0;
++i)
65)if(strcmp(u,G.ver[i].data)==0)returni;
66)return-1;
67)}
68)intCreateGraph(ALGraph&
G)/*采用邻接表存储结构*/
69){
70)inti,j,h;
71)VertexTypeva;
72)ArcNode*p;
73)printf("
请输入教学计划的课程数:
"
);
74)scanf("
%d"
&
G.vexnum);
75)getchar();
76)printf("
请输入各个课程的先修课程的总和(弧总数):
77)scanf("
G.arcnum);
78)getchar();
79)printf("
请输入%d个课程的课程号(最多%d个字符,字母+数字如C10):
G.vexnum,MAXOfNAME);
80)for(i=0;
++i)
81){
82)scanf("
G.ver[i].data);
83)getchar();
84)G.ver[i].first=NULL;
85)}
86)printf("
请输入%d个课程的学分值:
G.vexnum);
87)for(i=0;
88){
89)scanf("
G.ver[i].grades);
90)}
91)printf("
92)for(h=0;
93){
94)printf("
95)scanf("
96)while(va[0]!
97){
98)i=LocateVex(G,va);
99)j=h;
100)p=(ArcNode*)malloc(sizeof(ArcNode));
101)p->
102)p->
103)G.ver[i].first=p;
104)scanf("
105)}
106)}
107)return1;
108)}
109)voidDisplay(ALGraphG)/*输出图G的信息*/
110){
111)inti;
112)ArcNode*p;
113)printf("
有向图\n"
114)printf("
115)for(i=0;
116)printf("
117)for(i=0;
118){p=G.ver[i].first;
119)while(p)
120){printf("
121)p=p->
122)}
123)}
124)}
125)voidFindInDegree(ALGraphG,intindegree[])/*求顶点的入度*/
126){
127)inti;
128)ArcNode*p;
129)for(i=0;
i++)indegree[i]=0;
130)for(i=0;
131){
132)p=G.ver[i].first;
133)while(p)
134){indegree[p->
AdjOfV]++;
135)p=p->
136)}
137)}
138)}
139)structName
140){
141)charc[20];
142)}name;
143)voidCmpOfStr(VertexTypestr,structNamename[],intn)/*让C1~C12分别与12门课程对应起来*/
144){
145)if(strcmp(str,name[0].c)==0)printf("
程序设计基础"
146)if(strcmp(str,name[1].c)==0)printf("
离散数学"
147)if(strcmp(str,name[2].c)==0)printf("
数据结构"
148)if(strcmp(str,name[3].c)==0)printf("
汇编语言"
149)if(strcmp(str,name[4].c)==0)printf("
语言的设计和分析"
150)if(strcmp(str,name[5].c)==0)printf("
计算机原理"
151)if(strcmp(str,name[6].c)==0)printf("
编译原理"
152)if(strcmp(str,name[7].c)==0)printf("
操作系统"
153)if(strcmp(str,name[8].c)==0)printf("
高等数学"
154)if(strcmp(str,name[9].c)==0)printf("
线性代数"
155)if(strcmp(str,name[10].c)==0)printf("
普通物理"
156)if(strcmp(str,name[11].c)==0)printf("
数值分析"
C:
教学计划编制问题.Cpp
#include<
stdio.h>
stdlib.h>
math.h>
string.h>
#include"
SeqStack.h"
ALGraph.h"
#defineN12
if(Z<
{
CmpOfStr(R[Z].data,name,N);
++Z;
voidmain()
ALGraphG;
AdjListR;
structNamename[N]={{"
C1"
},{"
C2"
C3"
C4"
C5"
C6"
C7"
C8"
C9"
C10"
C11"
C12"
}};
***************教学计划编制问题**************\n"
printf("
请以课件9-2上课程先序图为例输入学期总数:
TotalOfTerms);
请输入学期的学分上限(8或9):
MaxScores);
CreateGraph(G);
Display(G);
TopologicalOrder(G,R,name);
五:
说明:
本程序按照课件9-2所显示的那12门课程编排,示列6个学期,每学期不超过学分数示例输入9。
程序示例运行如下:
六:
实验心得:
经过此次课程设计,我深刻地认识到自己写程序的不足,认识到了仅仅只是从课本上学到算法原理是远远不够的,理论与实践结合才是最重要的。
实验中,我总是不经意间出现各种错误,这就要求
今后的我要以脚踏实地的