失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 邻接表-建立无向图 无向网 有向图 有向网

邻接表-建立无向图 无向网 有向图 有向网

时间:2019-12-19 00:33:48

相关推荐

邻接表-建立无向图 无向网 有向图 有向网

#include<stdio.h>

#include<stdlib.h>

#define MAX_VERTEX_NUM20

#defineOK1

#defineERROR0

typedef int InfoType;/* 该弧相关信息的指针类型 */

typedef char VertexType;/* 顶点的类型 */

typedef struct ArcNode/* 弧结点的结构 */

{

intadjvex;/* 该弧所指向的顶点的位置 */

struct ArcNode*nextarc;/* 指向下一条弧的指针 */

InfoType*info;/* 该弧相关信息的指针(觉得应该是记录某些备注信息)如权值 */

}ArcNode;

typedef struct VNode/* 顶点结点的结构 */

{

VertexTypedata;/* 顶点信息 */

ArcNode*firstarc;/* 指向第一条依附该顶点的弧的指针 */

}VNode, AdjList[MAX_VERTEX_NUM];

typedef struct/* 图的邻接表结构定义 */

{

AdjListvertices;/* 存放顶点的数组 */

intvexnum, arcnum;/* 图的当前顶点数和弧数 */

intkind;/* 图的种类标志 */

}ALGraph;

int CreateUDG(ALGraph &G)/* 邻接表建立无向图 */

{

int i,s,d;

ArcNode *p, *q;

scanf("%d%d",&G.vexnum,&G.arcnum);/* 输入结点数目和边数 */

getchar();

for(i=1; i<=G.vexnum; i++)/* 输入顶点 */

{

scanf("%c",&G.vertices[i].data);/* 输入顶点 */

getchar();

G.vertices[i].firstarc = NULL;/* 首先初始化为NULL */

}

for(i=1; i<=G.arcnum; i++)

{

scanf("%d%d",&s,&d);/* 输入一条边依附的起点序号和终点序号 */

getchar();

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

q = (struct ArcNode *)malloc(sizeof(struct ArcNode));

p->adjvex = d; /* 保存该弧所指向的顶点位置 */

q->adjvex = s; /* 保存该弧所指向的顶点位置 */

p->nextarc = G.vertices[s].firstarc;

G.vertices[s].firstarc = p;

q->nextarc = G.vertices[d].firstarc;

G.vertices[d].firstarc = q;

}

return OK;

}

int CreateUDN(ALGraph &G)/* 邻接表建立无向网 */

{

int i,s,d,w;

ArcNode *p, *q;

scanf("%d%d",&G.vexnum,&G.arcnum);/* 输入结点数目和边数 */

getchar();

for(i=1; i<=G.vexnum; i++)/* 输入顶点 */

{

scanf("%c",&G.vertices[i].data);/* 输入顶点 */

getchar();

G.vertices[i].firstarc = NULL;/* 首先初始化为NULL */

}

for(i=1; i<=G.arcnum; i++)

{

scanf("%d%d%d",&s,&d,&w);/* 输入一条边依附的起点序号和终点序号 */

getchar();

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

q = (struct ArcNode *)malloc(sizeof(struct ArcNode));

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

q->info = (InfoType *)malloc(sizeof(InfoType));

p->adjvex = d; /* 保存该弧所指向的顶点位置 */

q->adjvex = s; /* 保存该弧所指向的顶点位置 */

*(p->info) = w; /* 保存权值到一个结点里 */

*(q->info) = w; /* 保存权值到一个结点里 */

p->nextarc = G.vertices[s].firstarc;

G.vertices[s].firstarc = p;

q->nextarc = G.vertices[d].firstarc;

G.vertices[d].firstarc = q;

}

return OK;

}

int CreateDG(ALGraph &G)/* 邻接表建立有向图 */

{

int i,s,d;

ArcNode *p;

scanf("%d%d",&G.vexnum,&G.arcnum);/* 输入结点数目和边数 */

getchar();

for(i=1; i<=G.vexnum; i++)/* 输入顶点 */

{

scanf("%c",&G.vertices[i].data);/* 输入顶点 */

getchar();

G.vertices[i].firstarc = NULL;/* 首先初始化为NULL */

}

for(i=1; i<=G.arcnum; i++)

{

scanf("%d%d",&s,&d);/* 输入一条边依附的起点序号和终点序号 */

getchar();

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

p->adjvex = d;/* 保存该弧所指向的终点位置 */

/* 这两句代码相当于单链表的插入操作 */

p->nextarc = G.vertices[s].firstarc;/* 保存顶点所对应的终点位置 */

G.vertices[s].firstarc = p;

}

return OK;

}

int CreateDN(ALGraph &G)/* 邻接表建立有向网 */

{

int i,s,d,w;

ArcNode *p;

scanf("%d%d",&G.vexnum,&G.arcnum);/* 输入结点数目和边数 */

getchar();

for(i=1; i<=G.vexnum; i++)/* 输入顶点 */

{

scanf("%c",&G.vertices[i].data);/* 输入顶点 */

getchar();

G.vertices[i].firstarc = NULL;/* 首先初始化为NULL */

}

for(i=1; i<=G.arcnum; i++)

{

scanf("%d%d%d",&s,&d,&w);/* 输入一条边依附的起点序号和终点序号 */

getchar();

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

p->adjvex = d;/* 保存该弧所指向的终点位置 */

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

*(p->info) = w;

/* 这两句代码相当于单链表的插入操作 */

p->nextarc = G.vertices[s].firstarc;/* 保存顶点所对应的终点位置 */

G.vertices[s].firstarc = p;

}

return OK;

}

int PrintALGraphUDG(ALGraph *G)/* 打印无向图每个结点的单链表 */

{

int i;

printf("打印无向图/n");

for(i = 1 ; i <= G->vexnum ; i++)

{

printf("%c: ",G->vertices[i].data);

while(G->vertices[i].firstarc->nextarc != NULL)

{

printf("%d ",G->vertices[i].firstarc->adjvex);

G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;

}

printf("%d/n",G->vertices[i].firstarc->adjvex);

}

return OK;

}

int PrintALGraphUDN(ALGraph *G)/* 打印无向网每个结点的单链表 */

{

int i, j;

printf("打印无向网/n");

for(i = 1 ; i <= G->vexnum ; i++)

{

while(G->vertices[i].firstarc->nextarc)

{

printf("%c --> ",G->vertices[i].data);

j = G->vertices[i].firstarc->adjvex;

printf("%c",G->vertices[j].data);

printf("/tweight: %d/n",*(G->vertices[i].firstarc->info));

G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;

}

printf("%c --> ",G->vertices[i].data);

j = G->vertices[i].firstarc->adjvex;

printf("%c",G->vertices[j].data);

printf("/tweight: %d/n",*(G->vertices[i].firstarc->info));

printf("------------------------------------------/n");

}

return OK;

}

int PrintALGraphDG(ALGraph *G)/* 打印有向图每个结点的单链表 */

{

int i;

printf("打印有向图/n");

for(i = 1 ; i <= G->vexnum ; i++)

{

printf("%c: ",G->vertices[i].data);

if(G->vertices[i].firstarc == NULL)

{

printf("/n");

continue;

}

while(G->vertices[i].firstarc)

{

printf("%d ",G->vertices[i].firstarc->adjvex);

G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;

}

printf("/n");

}

return OK;

}

int PrintALGraphDN(ALGraph *G)/* 打印有向网每个结点的单链表 */

{

int i, j;

printf("打印有向网/n");

for(i = 1 ; i <= G->vexnum ; i++)

{

while(G->vertices[i].firstarc)

{

printf("%c --> ",G->vertices[i].data);

j = G->vertices[i].firstarc->adjvex;/* 取得终点的位置 */

printf("%c",G->vertices[j].data);

printf("/tweight = %d/n",*(G->vertices[i].firstarc->info));

G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;

}

}

return OK;

}

void main()

{

ALGraph G;

//CreateUDG(G);/* 建立无向图 */

//PrintALGraphUDG(&G);/* 打印无向图 */

//CreateDG(G);/* 建立有向图 */

//PrintALGraphDG(&G);/* 打印有向图 */

//CreateUDN(G);/* 建立无向网 */

//PrintALGraphUDN(&G);/* 打印无向网 */

CreateDN(G);/* 建立有向网 */

PrintALGraphDN(&G);/* 打印有向网 */

}

图 的测试数据为:5 4 a b c d e 1 2 1 3 1 5 4 5

网 的测试数据为:5 4 a b c d e 1 2 10 1 3 15 1 5 20 4 5 30

提示:粘贴进控制台按回车运行!

如果觉得《邻接表-建立无向图 无向网 有向图 有向网》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。