⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 happy.c

📁 这是我们C语言程序
💻 C
字号:
#include<math.h>
#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define MAX_VARTEX_NUM //图中顶点数的最大值
#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
#define STACKINCREMENT 2 /* 存储空间分配增量 */
#define MAX_NAME 10   /* 顶点字符串的最大长度 */
#define MAXCLASS 100
int Z=0;
int X=0;
int xqzs,q=1,xfsx;
typedef struct {
               char *base; /* 在栈构造之前和销毁之后,base的值为NULL */
               char  *top; /* 栈顶指针 */
               int stacksize; /* 当前已分配的存储空间,以元素为单位 */
              }SqStack; /* 顺序栈 */

typedef struct ArcNode{
              int adjvex; //该弧所指向的顶点的位置
              struct ArcNode  *nextarc; //指向下一条弧的指针
              InfoType *info; //该弧相关信息的指针
              }ArcNode;
typedef struct  VNode{
               char  data; //顶点信息
               ArcNode *firstarc;
               }VNode,AdjList[MAX_VARTEX_NUM]; //指向第一条依附于该点的弧的指针
typedef struct{
              AdjList verticesone,verticestwo;
              int vexnum,arcnum; 图的当前顶点数和弧数
              int Digraph; //有向图
              }ALGrapht;
typedef int pathone[MAXCLASS];
typedef int pathtwo[MAXCLASS];

/*图的基本操作*/
int LocateVex(ALGraph G,char u)
{  int i;  
   for(i=0;i<G.vexnum;++i)  
       if(strcmp(u,G.vertices[i].data)==0)  
       return i;  
   return -1;  
}
ALGraph CreateGraph(ALGraph G)
{  int i,j,k;
   char va,vb;
   ArcNode *p; 
   printf("请输入教学计划的课程数: ");
   scanf("%d",&G.vexnum);
   printf("请输入拓扑排序所形成的课程先修关系的边数: ");  
   scanf("%d",&G.arcnum);
   printf("请输入%d个课程的代表值(<%d个字符):\n",G.vexnum,MAX_NAME);
   for(i=0;i<G.vexnum;++i) /* 构造顶点向量 */
     { scanf("%s",&G.verticesone[i].data);
       G.vertices[i].firstarc=NULL;
     }
   printf("请输入%d个课程的学分值(<%d个字符):\n",G.vexnum,MAX_NAME);
   for(i=0;i<G.vexnum;++i) /* 构造顶点向量 */
     {scanf("%s",&G.verticestwo[i].data);
     }
   printf("请顺序输入每条弧(边)的弧尾和弧头(以空格作为间隔):\n");  
   for(k=0;k<G.arcnum;++k) /* 构造表结点链表 */
     { scanf("%s%s",&va,&vb);
       i=LocateVex(G,va); /* 弧尾 */
       j=LocateVex(G,vb); /* 弧头 */
       p=(ArcNode*)malloc(sizeof(ArcNode));
       p->adjvex=j;
       p->info=NULL; /* 图 */
       p->nextarc=G.vertices[i].firstarc; /* 插在表头 */
       G.vertices[i].firstarc=p;
      }
   return OK;  
 }
void Display(ALGraph G)
{ int i;  
   ArcNode *p;
   switch(G.kind)  
     {case DG: printf("有向图\n");
      }
   printf("%d个顶点:\n",G.vexnum);  
   for(i=0;i<G.vexnum;++i)  
     printf("%s ",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  ",G.vertices[i].data,G.vertices[p->adjvex].data);
      p=p->nextarc;  
     }  
     printf("\n");  
   }  
 }
void FindInDegree(ALGraph G,int indegree[])
{  int i;
   ArcNode *p;  
   for(i=0;i<G.vexnum;i++)  
     indegree[i]=0; /* 赋初值 */  
   for(i=0;i<G.vexnum;i++)  
   {  
     p=G.vertices[i].firstarc;  
     while(p)  
     { indegree[p->adjvex]++;  
       p=p->nextarc;  
     }  
   }  
 }
/*顺序栈的基本操作*/
int InitStack(SqStack S)
{ /* 构造一个空栈S */
 S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
   if(!S.base)
     exit(OVERFLOW); /* 存储分配失败 */  
   S.top=S.base;
   S.stacksize=STACK_INIT_SIZE;
   return OK;  
}
int StackEmpty(SqStack S)
{  /* 若栈S为空栈,则返回TRUE,否则返回FALSE */  
   if(S.top==S.base)  
     return TRUE;  
   else  
     return FALSE;  
}
int Pop(SqStack S, int e)
 { /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */  
   if(S.top==S.base)
     return ERROR;  
   e=*(S.top-1);
   return OK;  
 }
Status Push(SqStack S,char e)
 { /* 插入元素e为新的栈顶元素 */  
   if(S.top-S.base>=S.stacksize) /* 栈满,追加存储空间 */
   {  
     S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof

            (SElemType));
     if(!S.base)
       exit(OVERFLOW); /* 存储分配失败 */  
     S.top=S.base+S.stacksize;
     S.stacksize+=STACKINCREMENT;
   }  
   *S.top++=e;
   return OK;  
}
Status TopologicalSort(ALGraph G)
 { /* 有向图G采用邻接表存储结构。若G无回路,则输出G的顶点的一个拓扑序列并返回OK, */  
   /* 否则返回ERROR。 */  
   int i,k,j=0,count,indegree[MAX_VERTEX_NUM];  
   SqStack S;  
   pathone a[];
   pathtwo b[];
   ArcNode *p;  
   FindInDegree(G,indegree); /* 对各顶点求入度indegree[0..vernum-1] */  
   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);
        a[i]=*G.verticesone[i].data;
        b[i]=*G.verticestwo[i].data;
        printf("课程%s→学%s  ",G.verticesone[i].data ,G.verticestwo[i].data);
        /* 输出i号顶点并计数 */
        ++count;
        for(p=G.verticesone[i].firstarc;p;p=p->nextarc)
           { /* 对i号顶点的每个邻接点的入度减1 */
             k=p->adjvex;
             if(!(--indegree[k])) /* 若入度减为0,则入栈 */
             Push(S,k);
            }
       }
   if(count<G.vexnum)  
       {printf("此有向图有回路\n");
         return ERROR;
        }
   else  
       { printf("为一个拓扑序列。\n");
         }

   while(q<=xqzs)
       { int C=0;
         if(X<=G.arcnum)
           { while(C<=xfsx)
                {C+=*G.verticestwo[Z].data;
                   ++Z;
                 }
             printf("第%d个学期应学课程:",q);
             while(X<=Z)
                 {printf("&d",*G.vertices[X].data);
                   ++X;
                 }
            q++;
           }
          else
           {printf("课程编制已经完成!");
            return OK;
           }
       }
    return OK;
}
void main()  
{  ALGraph f;  
   printf("教学计划编制问题的数据模型为拓扑排序AOV-网结构。\n");  
   printf("以下为教学计划编制问题的求解过程:\n");  
   printf("请输入学期总数:");  
   scanf("%d",&xqzs);  
   printf("请输入学期的学分上限:");  
   scanf("%d",&xfsx);  
   CreateGraph(f);
   Display(f);  
   TopologicalSort(f);rintf("以下为教学计划编制问题的求解过程:\n");  
   printf("请输入学期总数:");  
   scanf("%d",&xqzs);  
   printf("请输入学期的学分上限:");  
   scanf("%d",&xfsx);  
   CreateGraph(f);
   Display(f);  
   TopologicalSort(f);  
   getch();
}       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -