同学托我写作业,很简单的图实现问题,用二维数组。
接口(头文件):
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 ",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("结点: "); 41 for(i=0;i<maxSize;i++) 42 if(graph->ver[i]!=0) 43 printf("%d ",i); 44 printf(" "); 45 printf("边: "); 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(" "); 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): "); 62 scanf("%d",&data); 63 addNode(graph,data); 64 printf("输入您想要加入的边的源结点和目的结点(0-99): "); 65 scanf("%d %d",&src,&dst); 66 addEdge(graph,src,dst); 67 print(graph); 68 printf("继续则输入0,结束则输入1 "); 69 scanf("%d",&flag); 70 if(flag) 71 break; 72 } 73 return 0; 74 }
【写博客,比起写日记,会更注重措辞和表达。】