c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\86187\AppData\Local\Temp\cczj09Cj.o:three.one.c:(.text+0x9c1): undefined reference to `CreateDG'
collect2.exe: error: ld returned 1 exit status
PS D:\my data struct two>**
-
1.
```c++
`#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <iostream>
using namespace std;
#define MAXINT 32767 //表示最大值∞
#define MAX_VERTEX_NUM 20 //最大顶点数
typedef int Status;
typedef enum {DG,DN,UDG,UDN} GraphKind; //图的枚举类型
typedef int VRType;
typedef char InfoType;
typedef struct ArcCell {
VRType adj ; //对无权图用1或0表示;对带权图,则为权值类型。
InfoType *info; //该边或弧相关信息的指针(字符串)
} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef char VertexType;
typedef struct{
VertexType vexs[MAX_VERTEX_NUM]; //顶点数组,存放顶点信息
AdjMatrix arcs; //邻接矩阵
int vexnum, arcnum; //图中顶点总数与弧数
GraphKind kind; //图的种类标志
} MGraph;
Status LocateVex(MGraph *G, char u)
{
int m;
for(int m=0; m<G->vexnum; m++)
{
if(G->vexs[m]==u)
{
break;
}
}
if(m>G->vexnum)
{
printf("no such vertex. \n");
return -1;
}
return m;
}
//2. 图的邻接矩阵存储与基本操作的实现
//根据定义的存储结构,编写下列基本操作函数的C/C++源代码:
//(1)编写一个能够创建4种不同类型图的邻接矩阵存储的通用函数,函数格式如下:
//CreateMGraph(GraphKind GKind, MGraph &G, int vexnum, int arcnum, char *vexs, int *arcs)
void CreateMGraph( MGraph *G )
{
printf("输入需要创建的图类型 ");
scanf("%d", &(G->kind));
void CreateDG(MGraph *G);
void CreateDN(MGraph *G);
void CreateUDG(MGraph *G);
void CreateUDN(MGraph *G);
switch(G->kind)
{
case DG ://有向图
return CreateDG(G);
break;
case DN ://无向图
return CreateDN(G);
break;
case UDG ://有向网
return CreateUDG(G);
break;
case UDN ://无向网
return CreateUDN(G);
break;
default :
break;
}
}
//函数参数说明如下:
//GraphKind GKind: 图的类型 DG,DN,UDG,UDN
//MGraph G: 图变量,存放图的顶点数组、邻接矩阵等数据
//int vexnum: 图的顶点数
//int arcnum: 图的边或弧数
//char *vexs: 顶点数组,存放图的顶点
//int *arcs: 边(弧)数组,每条边(弧)采用三元组形式存放(i, j, w),分别表示边的邻接顶点和权值或弧的弧尾、弧头和权值,对于无权值的图,权值=1。该参数的实参用二维数组存储,形参用一维数组的形式访问。
//在实现时要注意无向图(网)是对称矩阵,有向图(网)是非对称矩阵。
//(2)编写一个函数OutMGraph(MGraph G),输出图G的顶点数组元素和邻接矩阵,对于无权图,元素用1和0表示,对于有权图(网),边的权值正整数表示,其他用∞表示。
Status OutMGraph(MGraph G)
{
int m, i, j, k;
m=G.vexnum;
printf("无权图请输入: 1, 有权图请输入: 2");
scanf("%d", &k);
if(k==1)
{
for(i=0; i<m; i++)
{
printf("%c ", G.vexs[i]);
}
for(i=0; i<m; i++)
{
for(j=0; j<m; j++)
{
if(G.arcs[i][j].adj==0||G.arcs[i][j].adj==1)
{
printf("%d ", G.arcs[i][j].adj);
}
}
printf("\n");
}
}
else
{
for(i=0; i<m; i++)
{
for(j=0; j<m; j++)
{
if(G.arcs[i][j].adj>=1)
{
printf("%d ", G.arcs[i][j].adj);
}
else
{
printf("%d ", MAXINT);
}
}
printf("\n");
}
}
return 0;
}
//(3)编写一个函数VerDegree(MGraph G),输出图G中各顶点的度(有向图分入度和出度)。
Status VerDegree(MGraph G)
{
int m, i, j, k;
printf("-无向图输入:1 有向图输入: 2");
scanf("%d", &k);
m=G.vexnum;
if(k==1)
{
for(int i=0; i<m; i++)
{
int sum=0;
for(int j=0; j<m; j++)
{
sum+=G.arcs[i][j].adj;
}
printf("顶点 %c 的度为: %d \n", G.vexs[i], sum);
}
}
else
{
for(int i=0; i<m; i++)
{
int osum=0;
int isum=0;
for(int j=0; j<m; j++)
{
osum+=G.arcs[i][j].adj;
isum+=G.arcs[j][i].adj;
}
printf("顶点 %c 的出度为 %d, 入度为 %d\n", G.vexs[i], osum, isum);
}
}
return 0;
}
//3. 编写一个主函数main(),检验上述操作函数是否正确,实现以下操作:
int main(void)
{
MGraph G;
CreateMGraph(&G);
OutMGraph(G);
VerDegree(G);
return 0;
}
//(1)分别调用CreateMGraph()函数生成以下4个图的邻接矩阵存储结构:
//(2)分别调用OutMGraph()函数输出以上4个图的邻接矩阵存储的数据。
//(3)分别调用VerDegree()函数输出以上4个图的各顶点的度。
void CerateDG(MGraph *G)//构造有向图
{
int n, m;
printf("请输入有向图的顶点数与弧数");
scanf("%d %d", &(G->vexnum), &(G->arcnum));
printf("输入顶点数据:");
for(int i=0; i<G->vexnum; i++)
{
scanf("%c", G->vexs[i]);
}
for(int i=0; i<G->vexnum; i++)
{
for(int j=0; j<G->vexnum; j++)
{
G->arcs[i][j].adj==0;
G->arcs[i][j].info==NULL;
}
}
printf("输入弧头与弧尾:");
char V1, V2;
scanf("%c %c", &V1, &V2);
printf("\n");
n=LocateVex(G, V1);
m=LocateVex(G, V2);
if(m==-1||n==-1)
{
printf("no this vertex\n");
return;
}
G->arcs[n][m].adj=1;
}
//构造无向图
void CreateDN(MGraph *G)
{
int n, m;
printf("输入无碍那个图的顶点数与弧数:");
scanf("%d %d", &(G->vexnum), &(G->arcnum));
printf("输入顶点信息\n:");
for(int i=0; i<G->vexnum; i++)
{
scanf("%c", G->vexs[i]);
}
for(int i=0; i<G->vexnum; i++)
{
for(int j=0; j<G->vexnum; j++)
{
G->arcs[i][j].adj=0;
G->arcs[i][j].info=NULL;
}
}
for(int i=0; i<G->arcnum; i++)
{
char V1, V2;
printf("输入弧的顶点(上三角或下三角)");
scanf("%c %c", &V1, &V2);
n=LocateVex(G, V1);
m=LocateVex(G, V2);
if(m==-1||n==-1)
{
printf("no this vertex\n");
return ;
}
G->arcs[n][m].adj=1;
G->arcs[m][n].adj=1;
}
}
//构造有向网
void CreateUDG(MGraph *G)
{
int n, m;
printf("输入图的顶点数与弧数:\n");
scanf("%d %d", &(G->vexnum), &(G->arcnum));
printf("输入顶点信息: \n");
for(int i=0; i<G->vexnum; i++)
{
scanf("%c", G->vexs[i]);
}
for(int i=0; i<G->vexnum; i++)
{
for(int j=0; j<G->vexnum; j++)
{
G->arcs[i][j].adj=0;
G->arcs[i][j].info=NULL;
}
}
//在二维数组中添加弧的数据。
for(int i=0; i<G->arcnum; i++)
{
char V1, V2;
int w;
printf("输入弧头弧尾和权值:");
scanf("%c %c %d", &V1, &V2, &w);
int n=LocateVex(G, V1);
int m=LocateVex(G, V2);
if(m==-1||n==-1)
{
printf("no this vertex");
return;
}
G->arcs[n][m].adj=w;
}
}
//构造无向网
void CreateUDN(MGraph *G)
{
printf("输入无向网的定点数与弧数:\n");
scanf("%d %d", &(G->vexnum), &(G->arcnum));
for(int i=0; i<G->vexnum; i++)
{
scanf("%c", G->vexs[i]);
}
for(int i=0; i<G->vexnum; i++)
{
for(int j=0; j<G->vexnum; j++)
{
G->arcs[i][j].adj=0;
G->arcs[i][j].info=NULL;
}
}
//在二维数组中添加弧的数据
for(int i=0; i<G->arcnum; i++)
{
char V1, V2;
int w;
printf("输入弧头与弧尾与权值");
scanf("%c %c %d", &V1, &V2, &w);
int m=LocateVex(G, V1);
int n=LocateVex(G, V2);
if(m==-1||n==-1)
{
printf("no this vertex\n");
return;
}
G->arcs[n][m].adj=w;
G->arcs[m][n].adj=w;
}
}
辛苦前辈们了!!
发一下代码吧,这样才能知道是代码的问题还是编译器的问题