码迷,mamicode.com
首页 > 编程语言 > 详细

一步两步学算法之图邻接表实现

时间:2015-05-05 16:10:56      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

图的邻接表实现 

这种结构创建邻接表时添加节点较为绕 建议断点调试下看看

邻接表和邻接矩阵相比 邻接表节省空间但是很难判断两个节点之间是否有边  此种结构要在稀疏图下才划算

下面是代码

 1 #define VERTEX_MAX 20
 2 #include "stdio.h"
 3 #include "malloc.h"
 4 typedef struct edgeNode
 5 {
 6     int Vertex;                //顶点序号 
 7     int weight;
 8     struct edgeNode *next;    //指向有边的下一个顶点 
 9 }EdgeNode;                    //邻接表边的结构 
10 
11 typedef struct
12 {
13     EdgeNode *AdjList[VERTEX_MAX];                //顶点的结构体指针数组 
14     int VextexNum,EdgeNum;                        //顶点数量 边的数量 
15     int GraphType;                                //图的类型 
16     
17 }ListGraph;                                    //邻接表结构 
18 void CreateGraph(ListGraph *G);                //创建邻接表 
19 void OutList(ListGraph);                    //输出邻接表 
20 
21 void CreateGraph (ListGraph *G)
22 {
23     int i,weight;
24     int start,end;
25     EdgeNode *s;
26     for(i=1;i<=G->VextexNum;i++)
27         G->AdjList[i]=NULL;                        //所有顶点初始化为NULL 
28     for(i=1;i<=G->EdgeNum;i++)
29     {
30         getchar();
31         printf("第%d条边:",i);
32         scanf("%d%d%d",&start,&end,&weight);
33         s=(EdgeNode*)malloc(sizeof(EdgeNode));            //申请保存一条边的内存 
34         s->next=G->AdjList[start];                        //指向上一个顶点所在位置 
35         s->Vertex=end;                                    // 保存结束顶点 
36         s->weight=weight;                                    
37         G->AdjList[start]=s;                            //邻接表对应该点指向该点            
38         if(G->GraphType==0)
39         {
40             s=(EdgeNode *)malloc(sizeof(EdgeNode));
41             s->next=G->AdjList[end];
42             s->Vertex=start;
43             s->weight=weight;
44             G->AdjList[end]=s;
45         }
46     }
47 } 
48 
49 void OutList(ListGraph *G)
50 {
51     int i;
52     EdgeNode *s;
53     for(i=1;i<=G->VextexNum;i++)
54     {
55         printf("顶点%d",i);
56         s=G->AdjList[i];
57         while(s)
58         {
59             printf("->%d(%d)",s->Vertex,s->weight);
60             s=s->next;
61         }
62         printf("\n");
63     }
64 }
65 main()
66 {
67     ListGraph G;
68     printf("输入生成图的类型(0.无向图,1.有向图)");
69     scanf("%d",&G.GraphType);
70     printf("输入图的顶点数量和边数量");
71     scanf("%d%d",&G.VextexNum,&G.EdgeNum);
72     printf("输入构成各边的两个顶点及权值:\n");
73     CreateGraph(&G);
74     printf("输出邻接表\n");
75     OutList(&G);
76     return 0; 
77 }

 

一步两步学算法之图邻接表实现

标签:

原文地址:http://www.cnblogs.com/threezj/p/4479145.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!