没有error,但是跑不动

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;
    }
}
辛苦前辈们了!!

img


贴源码看看 这不就是错?

发一下代码吧,这样才能知道是代码的问题还是编译器的问题