数据结构教学计划编制1.docx

上传人:b****9 文档编号:28676795 上传时间:2023-07-19 格式:DOCX 页数:12 大小:17.20KB
下载 相关 举报
数据结构教学计划编制1.docx_第1页
第1页 / 共12页
数据结构教学计划编制1.docx_第2页
第2页 / 共12页
数据结构教学计划编制1.docx_第3页
第3页 / 共12页
数据结构教学计划编制1.docx_第4页
第4页 / 共12页
数据结构教学计划编制1.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

数据结构教学计划编制1.docx

《数据结构教学计划编制1.docx》由会员分享,可在线阅读,更多相关《数据结构教学计划编制1.docx(12页珍藏版)》请在冰豆网上搜索。

数据结构教学计划编制1.docx

数据结构教学计划编制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");

}

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

当前位置:首页 > 经管营销 > 经济市场

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

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