#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;
}
这是课设的题,我就上传上来,方便以后找,我太机智了!!!