您的位置:首页 > 其它

图的邻接表的实现(链表+数组)

2014-10-16 15:39 597 查看


数据结构书上表示邻接表(无向图):

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define MaxSize 50				//最大顶点个数
typedef struct ArcNode			//边结点的类型定义
{
int adjvex; 				//弧指向的顶点的位置
InfoPtr *info;				//与弧相关的信息
struct ArcNode *nextarc; 	//指示下一个与该顶点相邻接的顶点
}ArcNode;
typedef struct VNode			//头结点的类型定义
{
VertexType data; 			//用于存储顶点
ArcNode *firstarc; 			//指示第一个与该顶点邻接的顶点
}VNode,AdjList[MaxSize];
typedef struct					//图的类型定义
{
AdjList vertex;
int vexnum,arcnum;			//图的顶点数目与弧的数目
}AdjGraph;
int LocateVertex(AdjGraph G,VertexType v);
void CreateGraph(AdjGraph *G);
void DisplayGraph(AdjGraph G);
void DestroyGraph(AdjGraph *G);

int LocateVertex(AdjGraph G,VertexType v)
//返回图中顶点对应的位置
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(strcmp(G.vertex[i].data,v)==0)
{
return i;
}
}
return -1;
}
void CreateGraph(AdjGraph *G)
//采用邻接表存储结构,创建无向图G
{
int i,j,k;
VertexType v1,v2;				//定义两个顶点v1和v2
ArcNode *p;
printf("请输入图的顶点数,边数: ");
scanf("%d%d",&(*G).vexnum,&(*G).arcnum);
printf("请输入%d个顶点的值:\n",G->vexnum);
for(i=0;i<G->vexnum;i++)			//将顶点存储在头结点中
{
scanf("%s",G->vertex[i].data);
G->vertex[i].firstarc=NULL;	//将相关联的顶点置为空
}
printf("请输入弧尾和弧头:\n");
for(k=0;k<G->arcnum;k++)			//建立边链表
{
scanf("%s%s",v1,v2);
i=LocateVertex(*G,v1);
j=LocateVertex(*G,v2);
//i为弧头j为弧尾创建邻接表
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->info=NULL;
p->nextarc=G->vertex[i].firstarc;
G->vertex[i].firstarc=p;
//j为弧头i为弧尾创建邻接表
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=i;
p->info=NULL;
p->nextarc=G->vertex[j].firstarc;
G->vertex[j].firstarc=p;
}
}

void DestroyGraph(AdjGraph *G)
//销毁无向图G
{
int i;
ArcNode *p,*q;
for(i=0;i<(*G).vexnum;++i)		//释放图中的边表结点
{
p=G->vertex[i].firstarc;		//p指向边表的第一个结点
if(p!=NULL)					//如果边表不为空,则释放边表的结点
{
q=p->nextarc;
free(p);
p=q;
}
}
(*G).vexnum=0;					//将顶点数置为0
(*G).arcnum=0;					//将边的数目置为0
}

void DisplayGraph(AdjGraph G)
//输出图的邻接矩阵G
{
int i;
ArcNode *p;
printf("%d个顶点:\n",G.vexnum);
for(i=0;i<G.vexnum;i++)
printf("%s ",G.vertex[i].data);
printf("\n%d条边:\n",G.arcnum);
for(i=0;i<G.vexnum;i++)
{
p=G.vertex[i].firstarc;
while(p)
{
printf("%s→%s ",G.vertex[i].data,G.vertex[p->adjvex].data);
p=p->nextarc;
}
printf("\n");
}
}
int main()
{
AdjGraph G;
printf("采用邻接表创建无向图G:\n");
CreateGraph(&G);
printf("输出无向图G:");
DisplayGraph(G);
DestroyGraph(&G);
return 0;
}


简化:

#include <iostream>
#include <stdio.h>
const int MAX=100;
struct node
{
int v,w;
node *next;
}*first[MAX];
using namespace std;
void Init()
{
memset(first, NULL, sizeof(first));
}
void Add_Edge(int u,int v,int w)
{
node *p=(node*)malloc(sizeof(node));
p->v=v;
p->w=w;
p->next=first[u];
first[u]=p;

p=(node*)malloc(sizeof(node));
p->v=u;
p->w=w;
p->next=first[v];
first[v]=p;
}
int main()
{
int n,e;
scanf("%d",&n);  //顶点数
scanf("%d",&e);  //边数
int a,b,w;
while (e--)
{
scanf("%d%d%d",&a,&b,&w);
Add_Edge(a, b, w);
}

printf("-----------------------\n");
for (int i=1; i<=n; i++)
{
int flag=0;
for (node *j=first[i];j!=NULL; j=j->next)
{
printf("%d %d %d   ",i,j->v,j->w);
flag=1;
}
if(flag)
printf("\n");
}
return 0;
}


数组模拟实现:

#include <iostream>
#include <stdio.h>
using namespace std;
const int MAX=1000;
struct node
{
int u,v;
int w;
int next;
}Edge[MAX];
int head[MAX];
int main()
{
int n,e;
int a,b,w;
memset(head, -1, sizeof(head));
scanf("%d",&n);  //顶点数
scanf("%d",&e);  //边数
int ans=1;
while (e--)
{

scanf("%d%d%d",&a,&b,&w);
Edge[ans].u=a;
Edge[ans].v=b;
Edge[ans].w=w;
Edge[ans].next=head[a];
head[a]=ans;
ans++;

Edge[ans].u=b;
Edge[ans].v=a;
Edge[ans].w=w;
Edge[ans].next=head[b];
head[b]=ans++;

}
printf("-----------------------\n");
for (int i=1; i<=n; i++)
{
int flag=0;
for (int j=head[i]; j!=-1; j=Edge[j].next)
{
printf("%d %d %d  ",Edge[j].u,Edge[j].v,Edge[j].w);
flag=1;
}
if(flag)
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐