邻接表存储表示

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

邻接表存储表示

Status Build_AdjList(ALGraph &G)//输入有向图的顶点数,边数,顶点信息和边的信息建立邻接表

{

InitALGraph(G);

scanf("%d",&v);

if(v<0) return ERROR;

G.vexnum=v;

scanf("%d",&a);

if(a<0) return ERROR;

G.arcnum=a;

for(m=0;m

G.vertices[m].data=getchar();

for(m=1;m<=a;m++)

{

t=getchar();h=getchar();

if((i=LocateVex(G,t))<0) return ERROR;

if((j=LocateVex(G,h))<0) return ERROR;

p=(ArcNode*)malloc(sizeof(ArcNode));

if(!G.vertices.[i].firstarc) G.vertices[i].firstarc=p;

else

{

for(q=G.vertices[i].firstarc;q->nextarc;q=q->nextarc);

q->nextarc=p;

}

p->adjvex=j;p->nextarc=NULL;

}//while

return OK;

}//Build_AdjList

邻接多重表存储表示

Status Build_AdjMulist(AMLGraph &G)//输入有向图的顶点数,边数,顶点信息和边的信息建立邻接多重表

{

InitAMLGraph(G);

scanf("%d",&v);

if(v<0) return ERROR; //顶点数不能为负

G.vexnum=v;

scanf(%d",&a);

if(a<0) return ERROR; //边数不能为负

G.arcnum=a;

for(m=0;m

G.adjmulist[m].data=getchar(); //输入各顶点的符号

for(m=1;m<=a;m++)

{

t=getchar();h=getchar(); //t为弧尾,h为弧头

if((i=LocateVex(G,t))<0) return ERROR;

if((j=LocateVex(G,h))<0) return ERROR; //顶点未找到p=(EBox*)malloc(sizeof(EBox));

p->ivex=i;p->jvex=j;

p->ilink=NULL;p->jlink=NULL; //边结点赋初值

if(!G.adjmulist[i].firstedge) G.adjmulist[i].firstedge=p; else

{

q=G.adjmulist[i].firstedge;

while(q)

{

r=q;

if(q->ivex==i) q=q->ilink;

else q=q->jlink;

}

if(r->ivex==i) r->ilink=p;//

else r->jlink=p; //

}//else

if(!G.adjmulist[j].firstedge) G.adjmulist[j].firstedge=p; else

{

q=G.adjmulist[i].firstedge;

while(q)

{

r=q;

if(q->jvex==j) q=q->jlink;

else q=q->ilnk;

}

if(r->jvex==j) r->jlink=p;

else r->ilink=p;

}//else

}//for

return OK;

}//Build_AdjList

图的邻接表存储的15个基本操作

int LocateVex(ALGraph G,VertexType u)

{

int i;

for(i=0;i

if(strcmp(u,G.vertices[i].data)==0)

return i;

return -1;

}

Status CreateGraph(ALGraph *G)

{

int i,j,k;

int w;

VertexType va,vb;

ArcNode *p;

printf("请输入图的类型(有向图:0,有向网:1,无向图:2,无向网:3): ");

scanf("%d",&(*G).kind);

printf("请输入图的顶点数,边数: ");

scanf("%d,%d",&(*G).vexnum,&(*G).arcnum);

printf("请输入%d个顶点的值(<%d个字符):\n",(*G).vexnum,MAX_NAME);

for(i=0;i<(*G).vexnum;++i)

{

scanf("%s",(*G).vertices[i].data);

(*G).vertices[i].firstarc=NULL;

}

if((*G).kind==1||(*G).kind==3) /* 网*/

printf("请顺序输入每条弧(边)的权值、弧尾和弧头(以空格作为间隔):\n");

else /* 图*/

printf("请顺序输入每条弧(边)的弧尾和弧头(以空格作为间隔):\n");

for(k=0;k<(*G).arcnum;++k)

{

if((*G).kind==1||(*G).kind==3)

scanf("%d%s%s",&w,va,vb);

else /* 图*/

scanf("%s%s",va,vb);

i=LocateVex(*G,va); /* 弧尾*/

j=LocateVex(*G,vb); /* 弧头*/

p=(ArcNode*)malloc(sizeof(ArcNode));

p->adjvex=j;

if((*G).kind==1||(*G).kind==3) /* 网*/

{

p->info=(int *)malloc(sizeof(int));

相关文档
最新文档