2007-d-三
有錯誤
#include <stdio.h>
#include <stdlib.h>
#define maxSize 100
//邻接表定义存储
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
} ArcNode;
typedef struct VNode
{
int data;
ArcNode *firstarc;
}VNode;
typedef struct AGraph
{
VNode adjlist[maxSize];
int n,e;
} AGraph;
//邻接表建立
void create(AGraph *G)
{
int i;
int h,t;
ArcNode *p;
printf("请输入顶点数、弧数:\n");
scanf("%d,%d",&G->n,&G->e);
//输入顶点数、弧数
for(i=0;i<G->n;++i)
{
printf("请输入第%d个顶点值\n",i);
scanf("%d",&G->adjlist[i].data);
G->adjlist[i].firstarc=NULL;
}
//输入弧
for(i=0;i<G->e;++i)
{
printf("请按顺序输入弧头[h]、弧尾[t]\n");
scanf("%d,%d",&h,&t);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=t;
/*将新边表结点p 插入到顶点Vh 的边表头部*/
p->nextarc=G->adjlist[h].firstarc;
G->adjlist[h].firstarc=p;
}
}
//建立逆邻接表
AGraph* produce(AGraph *G)
{
AGraph *N;
N=(AGraph *)malloc(sizeof(AGraph));
ArcNode *p,*q;
int i;
N->e=G->e;
N->n=G->n;
for(i=0;i<G->n;++i)
{
//建立逆邻接表的顶点表
N->adjlist[i].data=G->adjlist[i].data;
N->adjlist[i].firstarc=NULL;
}
for(i=0;i<G->n;++i)
{
//建立逆邻接表边表
p=G->adjlist[i].firstarc;
while(p!=NULL)
{
//将新边表结点p 插入到顶点Vh 的边表头部
q=(ArcNode *)malloc(sizeof(ArcNode));
q->adjvex=i;
q->nextarc=N->adjlist[p->adjvex].firstarc;
N->adjlist[p->adjvex].firstarc=q;
p=p->nextarc;
}
}
return N;
}
/**
测试
//输出图
void printG(AGraph *G)
{
int i;
ArcNode *p;
for(i=0;i<G->n;++i)
{
printf("%d------\n",G->adjlist[i].data);
p=G->adjlist[i].firstarc;
while(p!=NULL)
{
printf("%d->%d\n",i,p->adjvex);
p=p->nextarc;
}
}
}
//主函数
int main()
{
AGraph *G;
G=(AGraph *)malloc(sizeof(AGraph));//必须初始化
create(G);
printG(G);
printG(produce(G));
}
**/