图的邻接表的实现(链表+数组)
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; }
相关文章推荐
- 邻接表的两种实现(链表和数组模拟)
- 邻接表的两种实现(链表和数组模拟)
- 【啊哈!算法】算法8:巧妙的邻接表(数组实现逆序模拟链表)
- 排序算法集:冒泡、插入、希尔、快速(数组实现、链表实现)
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 查找算法集(数组实现、链表实现)
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 排序算法集:冒泡、插入、希尔、快速(数组实现、链表实现)
- Python中数组 链表 元组 字典实现类Sql多字段排序和动态函数实现
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 排序算法集:冒泡、插入、希尔、快速(数组实现、链表实现)
- 排序算法集:冒泡、插入、希尔、快速(数组实现、链表实现)
- 排序算法集:冒泡、插入、希尔、快速(数组实现、链表实现)
- 排序算法集:冒泡、插入、希尔、快速(数组实现、链表实现)
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 链表实现动态数组C源代码
- 用链表排序(数组的初级运用链表实现)
- 排序算法集:冒泡、插入、希尔、快速(数组实现、链表实现)
- 排序算法集:冒泡、插入、希尔、快速(数组实现、链表实现)