#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100
#define MAXSIZE 100
typedef char VertexType;
typedef int EdgeType;
#define UNVISITED -1
#define VISITED 1
#define OK 1
#define ERROR 0
typedef int Status;
typedef int QElemtype;
typedef struct
{
QElemtype data[MAXSIZE];
int front;
int rear;
}sqQueue;
Status InitQueue(sqQueue * Q)
{
Q->front=0;
Q->rear=0;
return OK;
}
Status QueueLength(sqQueue Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
Status EnQueue(sqQueue * Q, QElemtype e)
{
if((Q->rear+1)%MAXSIZE==Q->front)
{
return ERROR;
}
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(sqQueue * Q,QElemtype * e)
{
if(Q->front==Q->rear)
{
return ERROR;
}
*e=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return OK;
}
void print(sqQueue * Q)
{
int length=(Q->rear-Q->front+MAXSIZE)%MAXSIZE;
for(int i=Q->front;i<length;i++)
{
printf("a[%d]=%d ,",i,Q->data[i]);
}
printf("\n");
}
typedef struct
{
int from;
int to;
EdgeType weight;
}Edge;
typedef struct EdgeNode
{
int adjvex;
EdgeType weight;
struct EdgeNode * next;
}EdgeNode;
typedef struct
{
VertexType data;
EdgeNode * firstedge;
}VertexNode,AdjList[MAXVEX];
typedef struct
{
AdjList adjList;
int numVertexes;
int numEdges;
int Indegree[MAXVEX];
int Mark[MAXVEX];
}GraphAdjList;
void InitGraphAdjList(GraphAdjList * G,int numVer,int numEd)
{
G->numVertexes=numVer;
G->numEdges=numEd;
for(int i=0;i<G->numVertexes;i++)
{
G->Mark[i]=UNVISITED;
G->Indegree[i]=0;
G->adjList[i].firstedge=NULL;
}
}
void Creat_Edge(GraphAdjList * G,int from,int to,int weight)
{
EdgeNode * temp= G->adjList[from].firstedge;
if(temp==NULL)
{
EdgeNode * NewEdgeNode=(EdgeNode *)malloc(sizeof(EdgeNode));
NewEdgeNode->adjvex=to;
NewEdgeNode->weight=weight;
NewEdgeNode->next=NULL;
G->adjList[from].firstedge=NewEdgeNode;
G->Indegree[to]++;
}
else
{
while(temp->next!=NULL)
{
temp=temp->next;
}
EdgeNode * NewEdgeNode=(EdgeNode *)malloc(sizeof(EdgeNode));
NewEdgeNode->adjvex=to;
NewEdgeNode->weight=weight;
NewEdgeNode->next=NULL;
temp->next=NewEdgeNode;
G->Indegree[to]++;
}
}
void GreateALGraph(GraphAdjList * G)
{
int i,j,k,w;
printf("请输入%d个元素:\n",G->numVertexes);
for(i=0;i<G->numVertexes;i++)
{
scanf(" %c",&G->adjList[i].data);
G->adjList[i].firstedge=NULL;
}
for(k=0;k<G->numEdges;k++)
{
printf("输入边(Vi,Vj)上的顶点序号和权重:\n");
scanf("%d%d%d",&i,&j,&w);
Creat_Edge(G,i,j,w);
}
}
Edge FirstEdge(GraphAdjList * G,int oneVertex)
{
Edge firstEdge;
firstEdge.from=oneVertex;
EdgeNode * temp=G->adjList[oneVertex].firstedge;
if(temp!=NULL)
{
firstEdge.to=temp->adjvex;
firstEdge.weight=temp->weight;
}
else
{
firstEdge.to=-1;
firstEdge.weight=-1;
}
return firstEdge;
}
int ToVertex(Edge oneEdge)
{
return oneEdge.to;
}
Edge NextEdge(GraphAdjList * G,Edge perEdge)
{
Edge myEdge;
myEdge.from=perEdge.from;
EdgeNode * temp=G->adjList[perEdge.from].firstedge;
while(temp!=NULL && temp->adjvex<=perEdge.to)
{
temp=temp->next;
}
if(temp!=NULL)
{
myEdge.to=temp->adjvex;
myEdge.weight=temp->weight;
}
else
{
myEdge.to=-1;
myEdge.weight=-1;
}
return myEdge;
}
bool IsEdge(Edge oneEdge)
{
if(oneEdge.to==-1 )
{
return false;
}
else
{
return true;
}
}
void Vist(GraphAdjList * G,int v)
{
printf("%c ",G->adjList[v]);
}
void TopsortbyQueue(GraphAdjList * G,sqQueue * Q)
{
int i;
QElemtype Elem;
for(i=0;i<G->numVertexes;i++)
{
G->Mark[i]=UNVISITED;
}
for(i=0;i<G->numVertexes;i++)
{
if(G->Indegree[i]==0)
{
EnQueue(Q, i);
}
}
while(QueueLength(*Q)!=0)
{
DeQueue(Q,&Elem);
printf("%c ",G->adjList[Elem].data);
G->Mark[Elem]=VISITED;
for(Edge e=FirstEdge(G,Elem);IsEdge(e);e=NextEdge(G,e))
{
G->Indegree[ToVertex(e)]--;
if(G->Indegree[ToVertex(e)]==0)
{
EnQueue(Q, ToVertex(e));
}
}
}
for(i=0;i<G->numVertexes;i++)
{
if(G->Mark[i]==UNVISITED)
{
printf("此图有环!\n");
break;
}
}
}
int main()
{
GraphAdjList G;
sqQueue Q;
InitQueue(&Q);
int numVer,numEd;
printf("请输入顶点数和边数:\n");
scanf("%d%d",&numVer,&numEd);
InitGraphAdjList(&G,numVer,numEd);
GreateALGraph(&G);
TopsortbyQueue(&G,&Q);
printf("\n");
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)