补全代码:#include<stdio.h> #include<malloc.h> #define N 20 //图的邻接表-边或弧存储 typedef struct EdgeNode { int adjvex; struct EdgeNode *next; } EdgeNode; //图的邻接表-顶点存储(增加了入度域) typedef struct VNode { char data; int ind; //顶点入度 struct EdgeNode *link; } VNode; //图的邻接表表示 typedef struct ALgraph { int vexnum,arcnum; VNode adjlist[N]; }ALGraph; void createGraph_list(ALGraph *g); int topSort(ALGraph *g); //读入数据创建带入度的邻接表 void createGraph_list(ALGraph *g) { } //拓扑排序,判断图中是否存在环,存在返回0 int topSort(ALGraph *g) { } int main() { ALGraph g; int i; EdgeNode *s; createGraph_list(&g); for(i=0; i<g.vexnum; i++) { printf("%c,%d:",g.adjlist[i].data,g.adjlist[i].ind); s=g.adjlist[i].link; while(s!=NULL) { printf("->%d",s->adjvex); s=s->next; } printf("\n"); } i=topSort(&g); printf("%d\n",i); if(i==1){ printf("no ring\n"); }else{ printf("has ring\n"); } return 0; }
时间: 2024-01-17 08:04:38 浏览: 153
下面是完整的代码:
```
#include<stdio.h>
#include<malloc.h>
#define N 20
//图的邻接表-边或弧存储
typedef struct EdgeNode {
int adjvex;
struct EdgeNode *next;
} EdgeNode;
//图的邻接表-顶点存储(增加了入度域)
typedef struct VNode {
char data;
int ind; //顶点入度
struct EdgeNode *link;
} VNode;
//图的邻接表表示
typedef struct ALgraph {
int vexnum,arcnum;
VNode adjlist[N];
}ALGraph;
//读入数据创建带入度的邻接表
void createGraph_list(ALGraph *g) {
int i,j,k;
char v1,v2;
EdgeNode *p;
printf("请输入顶点数和边数(用空格隔开):");
scanf("%d%d",&g->vexnum,&g->arcnum);
printf("请输入%d个顶点:\n",g->vexnum);
for(i=0; i<g->vexnum; i++)
{
getchar();
scanf("%c",&g->adjlist[i].data);
g->adjlist[i].ind=0;
g->adjlist[i].link=NULL;
}
printf("请输入%d条边(用空格隔开):\n",g->arcnum);
for(i=0; i<g->arcnum; i++)
{
getchar();
scanf("%c%c",&v1,&v2);
for(j=0; j<g->vexnum; j++)
{
if(g->adjlist[j].data==v1)
break;
}
for(k=0; k<g->vexnum; k++)
{
if(g->adjlist[k].data==v2)
break;
}
p=(EdgeNode *)malloc(sizeof(EdgeNode));
p->adjvex=k;
p->next=g->adjlist[j].link;
g->adjlist[j].link=p;
g->adjlist[k].ind++;
}
}
//拓扑排序,判断图中是否存在环,存在返回0
int topSort(ALGraph *g) {
int i,k;
int top=0;
int count=0;
EdgeNode *p;
int stack[N];
for(i=0; i<g->vexnum; i++)
{
if(g->adjlist[i].ind==0)
stack[++top]=i;
}
while(top!=0)
{
k=stack[top--];
count++;
p=g->adjlist[k].link;
while(p!=NULL)
{
g->adjlist[p->adjvex].ind--;
if(g->adjlist[p->adjvex].ind==0)
stack[++top]=p->adjvex;
p=p->next;
}
}
if(count<g->vexnum)
return 0;
else
return 1;
}
int main() {
ALGraph g;
int i;
EdgeNode *s;
createGraph_list(&g);
for(i=0; i<g.vexnum; i++)
{
printf("%c,%d:",g.adjlist[i].data,g.adjlist[i].ind);
s=g.adjlist[i].link;
while(s!=NULL)
{
printf("->%d",s->adjvex);
s=s->next;
}
printf("\n");
}
i=topSort(&g);
printf("%d\n",i);
if(i==1){
printf("no ring\n");
}else{
printf("has ring\n");
}
return 0;
}
```
这段代码实现了有向图的拓扑排序,并判断图中是否存在环。在主函数中,调用`createGraph_list`函数读入数据创建带入度的邻接表,然后遍历邻接表输出各个顶点的入度和出边,最后调用`topSort`函数进行拓扑排序,并根据排序结果判断图中是否存在环。
阅读全文