图的顺序存储

同学托我写作业,很简单的图实现问题,用二维数组。

接口(头文件):

typedef int DataType;

typedef struct GraphCDT* Graph;

Graph newGraph();

void addNode(Graph graph,DataType data);

void addEdge(Graph graph,DataType src,DataType dst);

很久没有建工程文件,很久没写c代码。但是通过写这个作业,我弄清楚2个问题。

1.sizeof在c语言中不能计算j结构体,比如sizeof(GraphCDT)。但是c++可以。

2.指针定义的时候要分配空间,不然内存不能written。

还知道了一种建图的新思路:用一个一维数组存储结点,二维数组存储边。因为如果输入的结点不是1、2、3、4或者a、b、c、d的话,建图的时候二维数组记录图的结点和边的信息很不方便。

下面给出解决这个题目的c++代码,如有纰漏,欢迎斧正。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define maxSize 100
 4 typedef int DataType;
 5 typedef struct GraphCDT* Graph;
 6 struct GraphCDT
 7 {
 8     int edg[maxSize][maxSize];
 9     DataType ver[maxSize];
10     int n;
11 };
12 
13 Graph newGraph()
14 {
15     Graph graph;
16     graph=(Graph)malloc(sizeof(struct GraphCDT));
17     int i,j;
18     for(i=0;i<maxSize;i++)
19         graph->ver[i]=0;
20     for(i=0;i<maxSize;i++)
21             for(j=0;j<maxSize;j++)
22                 graph->edg[i][j]=0;
23     graph->n=0;
24     return graph;
25 }
26 
27 void addNode(Graph graph,DataType data)
28 {
29     graph->ver[data]=1;
30     graph->n++;
31     printf("%n  --- d   \n",graph->n);
32 }
33 void addEdge(Graph graph,DataType src,DataType dst)
34 {
35     graph->edg[src][dst]=1;
36 }
37 void print(Graph graph)
38 {
39     int i,j;
40     printf("结点:\n");
41     for(i=0;i<maxSize;i++)
42         if(graph->ver[i]!=0)
43             printf("%d ",i);
44     printf("\n");
45     printf("边:\n");
46     for(i=0;i<maxSize;i++)
47             for(j=0;j<maxSize;j++)
48                 if(graph->edg[i][j]!=0)
49                     printf("%d---%d   ",i,j);
50     printf("\n");
51 }
52 int main()
53 {
54     Graph graph;
55     graph=(Graph)malloc(sizeof(struct GraphCDT));
56     int flag=1;
57     int data,src,dst;
58     graph=newGraph();
59     while(1)
60     {
61         printf("输入您想要加入的新结点(0-99):\n");
62         scanf("%d",&data);
63         addNode(graph,data);
64         printf("输入您想要加入的边的源结点和目的结点(0-99):\n");
65         scanf("%d %d",&src,&dst);
66         addEdge(graph,src,dst);
67         print(graph);
68         printf("继续则输入0,结束则输入1\n");
69         scanf("%d",&flag);
70         if(flag)
71             break;
72     }
73     return 0;
74 }
View Code

 

 

【写博客,比起写日记,会更注重措辞和表达。】

posted @ 2016-05-18 15:27  天气晚来秋  阅读(332)  评论(0编辑  收藏  举报