项目承担任务求解--课设(ps:题目自己取的)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define MAX 100  /* 有向图中最大节点数 */
typedef char VexType;       /* 定义节点名为char型 */
typedef struct node         /* 弧表节点 */
{
    
    
    VexType adjvex;         /* 与顶点相连的邻接点下标(adjoin:邻接) */
    struct node * next;     /* 指向顶点的下一个邻接点 */
}EdgeNode;
 
typedef struct vnode        /* 顶点结构 */
{
    
    
    int ID;                 /* 顶点入度( in-degree ) */
    VexType vex;            /* 存储顶点名 */
    EdgeNode * firstedge;   /* 弧表头指针,指向顶点第一个邻接点 */
}VexNode, AdjList[MAX];
 
typedef struct
{
    
    
    AdjList adjlist;        /* 描述有向图结构的邻接表 */
    int vexnum,edgenum; ;             /* 节点的数目 ,弧的数目*/           
}ALGraph;         
void CreateDG(ALGraph * DG)   /* 邻接表法创建有向图 */
{
    
    
    VexType ch;
    int i = 0;
    int start, end;                     /* start:弧尾下标;end:弧头下标 */
    EdgeNode * temp;
 
    printf("请输入有向图的顶点数、弧数:");
    scanf("%d%d", &(DG->vexnum), &(DG->edgenum));
 
    printf("请输入有向图的顶点:");
    getchar();
    while ((ch = getchar()) != '\n')    /* 建立顶点表 */
    {
    
    
        DG->adjlist[i].vex = ch;
        DG->adjlist[i].firstedge = NULL;
        DG->adjlist[i].ID = 0;
        i++;
    }
 
    printf("顶点 | 下标\n");
    for (i = 0; i < DG->vexnum; i++)    /* 显示有向图中顶点及其对应下标 */
        printf("%3c%6d\n", DG->adjlist[i].vex, i);
 
    printf("请依次输入每条弧的弧尾下标、弧头下标:\n");
    for (i = 0; i < DG->edgenum; i++)   /* 头插法建立顶点的邻接弧表 */
    {
    
    
        scanf("\n%d%d", &start, &end);
        while (start < 0 || start > (DG->vexnum - 1) 
              || end < 0 || end > (DG->vexnum - 1))
        {
    
    
            printf("下标越界,重新输入:");
            scanf("\n%d%d", &start, &end);
        }
        
        temp = (EdgeNode *)malloc(sizeof(EdgeNode)); 
        temp->adjvex = DG->adjlist[end].vex;
        temp->next = DG->adjlist[start].firstedge;
        DG->adjlist[start].firstedge = temp;
        DG->adjlist[end].ID++;
    }
}
void TraverseDG(ALGraph DG)    /* 遍历有向图DG */
{
    
    
    int i;
    EdgeNode * temp;
    
    for (i = 0; i < DG.vexnum; i++)     /* 遍历有向图 */
    {
    
    
        printf("顶点 %c ( ID = %d ) :", DG.adjlist[i].vex, DG.adjlist[i].ID);
        temp = DG.adjlist[i].firstedge;
        while (temp)                    /* 输出有向图的信息 */
        {
    
    
            printf("[ %c ] -> ", temp->adjvex);
            temp = temp->next;
        }
        printf("NULL\n");
    }    
}
void LocateVex(ALGraph DG, VexType vex, int * index)   /* 若有向图DG中存在节点vex,则将该下标赋给index */
{
    
    
    int i;
 
    for (i = 0; i < DG.vexnum; i++)
    {
    
    
        if (DG.adjlist[i].vex == vex)
        {
    
    
            *index = i;
            return;
        }
    }
    printf("该节点不存在!\n");
} 
void TopologicalSort(ALGraph DG)
{
    
    
  char de[10];
  int l=0;
  int i, j, k, top;            /* top:栈顶入度为 0 的顶点下标 */
  EdgeNode * temp;
  top = -1;
  for (i = 0; i < DG.vexnum; i++)     /* 让初始情况下入度为0的顶点入栈 */
    if (DG.adjlist[i].ID == 0)
    {
    
    
        DG.adjlist[i].ID = top;     /* 用入度为0的新顶点的ID存储旧入度为0的顶点下标 */
        top = i;  
        de[l]=DG.adjlist[i].vex;    /*这里入栈的顶点出栈进入de数组中*/ 
        l++;                  
    }
  for(int n=0;n<l;n++)    //遍历de数组输出里边的元素,即入度为0的顶点(顶点们) 
  {
    
    
    printf("%c",de[n]);
  }
   int s=l;     //因为数组de没有清空,另定义一个s用来记录此时数组中的元素个数 
   while (top != -1)
    {
    
    
        j = top;                        // 栈顶顶点下标赋给j 
        top = DG.adjlist[top].ID;       // 输出栈顶节点后,top下移,指向新的栈顶节点 
        temp = DG.adjlist[j].firstedge;
        while (temp != NULL)             // 遍历顶点所有邻接点 
        {
    
    
            LocateVex(DG, temp->adjvex, &k);
            DG.adjlist[k].ID--;
            if (DG.adjlist[k].ID == 0)
            {
    
    
                DG.adjlist[k].ID = top;  // 用入度为0的新顶点的ID存储旧入度为0的顶点下标 
                top = k;                  // top始终指向栈顶入度为0的顶点下标
                de[l]=DG.adjlist[k].vex;   //继续进入de数组 
                l++;                 //数组中的元素个数++ 
            } 
            temp = temp->next;
        }
         for(int n=s;n<l;n++)    
        {
    
    
        printf("%c",de[n]);
        }
        printf(" ");
        s=l;
    }
}
typedef struct LNode
{
    
    
 char name[10];
 char data;
 struct LNode* next;
}LNode, * Linklist;
void create(Linklist& L)
{
    
    
 printf("\n请输入全部的人和其需要完成的工作(当输入'# #'时结束输入):\n"); 
 L = (LNode*)malloc(sizeof(LNode));
 L->next = NULL;
 char name[10];
 char data;
 LNode *q=L;
 while (1)
 {
    
    
  scanf("%s %c",&name,&data);
  if (name[0] == '#')
  {
    
    
   break;
  }
  else
  {
    
    
   LNode* p = (LNode*)malloc(sizeof(LNode));
   p->data = data;
   strcpy(p->name,name);
   p->next = q->next;
   q->next = p;
   q=p;
  }
 }
}
void find(Linklist L)
{
    
    
 char name[10];
 printf("请输入想查询其全部工作的人的名字:\n");
 scanf("%s",&name);
 LNode* p = L->next;
 while (p != NULL)
 {
    
    
  if (!strcmp(p->name,name))
  {
    
    
   printf("%c ",p->data); 
  }
  p = p->next;
 }
}
int main()
{
    
    
    ALGraph g;
    CreateDG(&g);
    printf("------------------------------\n");
    printf("vexnum = %d ; edgenum = %d\n", g.vexnum, g.edgenum);
    printf("------------------------------\n");
    TraverseDG(g);
    printf("------------------------------\n");
    printf("整个工程的任务安排为:\n");
    TopologicalSort(g);
    printf("\n------------------------------\n");
    Linklist L;
    create(L);
    find(L);
 
    return 0;
}

这是课设的题,我就上传上来,方便以后找,我太机智了!!!

猜你喜欢

转载自blog.csdn.net/weixin_45800653/article/details/107954429
今日推荐