教学编制问题c语言数据结构实现Word文档格式.docx

上传人:b****6 文档编号:18153088 上传时间:2022-12-13 格式:DOCX 页数:14 大小:21.28KB
下载 相关 举报
教学编制问题c语言数据结构实现Word文档格式.docx_第1页
第1页 / 共14页
教学编制问题c语言数据结构实现Word文档格式.docx_第2页
第2页 / 共14页
教学编制问题c语言数据结构实现Word文档格式.docx_第3页
第3页 / 共14页
教学编制问题c语言数据结构实现Word文档格式.docx_第4页
第4页 / 共14页
教学编制问题c语言数据结构实现Word文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

教学编制问题c语言数据结构实现Word文档格式.docx

《教学编制问题c语言数据结构实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《教学编制问题c语言数据结构实现Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

教学编制问题c语言数据结构实现Word文档格式.docx

将课程排序后并决定出每学期所学课程,输出图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。

程序示例运行如下:

六:

实验心得:

经过此次课程设计,我深刻地认识到自己写程序的不足,认识到了仅仅只是从课本上学到算法原理是远远不够的,理论与实践结合才是最重要的。

实验中,我总是不经意间出现各种错误,这就要求

今后的我要以脚踏实地的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 城乡园林规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1