icoding测试代码--邻接矩阵

icoding的数据结构并没有一个测试代码,其都是直接编写一个函数的形式,因此很难知道自己的实际输出是什么。针对部分题目,我编写了一系列测试代码以供大家进行数据输出的测试。

请先将你的代码复制

bool matrix_insert_vertex(Graph *G, VertexType v){
    //TODO

}
bool matrix_insert_arc(Graph *G, VertexType v, VertexType w){
   //TODO

}


里面

到函数中然后修改main函数完成测试样例的输入

在main代码中间有个修改提示,请按照提示操作修改即可

icoding使用数字表示顶点集,为了方便,本例用大写字母表示顶点集

部分代码来自白zj老师

main函数中一共有两个区域可以进行修改

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define MAX_VERTEX_NUM 100


typedef int VertexType;
typedef char VertexData; 


typedef enum{
    UNDIFINED=0,DG, UDG
}GraphType;

typedef struct{
    VertexType vertex[MAX_VERTEX_NUM]; //顶点向量
    int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
    int vexnum, arcnum;   //图的当前顶点数和弧数
    GraphType type;      //图的种类标志
}Graph;

void DrawGraph(Graph *G) {
    putchar(' ');
    for (int i = 0; i < G->vexnum; ++i)
        printf("%4c", G->vertex[i]);
    putchar('\n');

    for (int i = 0; i < G->vexnum; ++i) {
        printf("%c", G->vertex[i]);
        for (int j = 0; j < G->vexnum; ++j)
            
                printf("%4d", G->arcs[i][j]);
        putchar('\n');
    }
}
int matrix_locate_vertex(Graph *G, VertexType v) {
    for (int k = 0; k < G->vexnum; ++k)
        if (G->vertex[k] == v)
            return k;

    return -1;
}



bool matrix_insert_vertex(Graph *G, VertexType v){
 //TODO

}
bool matrix_insert_arc(Graph *G, VertexType v, VertexType w){
 //TODO

}


int main(){

    Graph G;
    printf("---icoding---\n6-1|邻接矩阵:\n");
    printf("icoding使用数字表示顶点集,为了方便,本例用大写字母表示顶点集\n");
    printf(">>初始矩阵\n");

//--------------------------您 可 以 修 改 此 框 内 容(可修改区域1/2)---------------------
    int flag=0;
    //可修改,标志位(0:全部测试,1:只测试初始打印,2:只测试初始和插入顶点,3:只测试初始和插入弧)
    G.vexnum = 5;//可修改,顶点数量,顶点从A开始编码,按顺序编。
    G.type = UDG;//可修改,图的类型,DG:有向图 UDG:无向图 要大写哦

    char insert_v = 'F';//等待插入的顶点(适用于第一个函数)

    char insert_a1 = 'F';//等待插入的边的起始点(适用于第二个函数)
    char insert_a2 = 'E';//等待插入的边的终止点(适用于第二个函数)
//--------------------------您 可 以 修 改 此 框 内 容(可修改区域1/2)---------------------



    /*--初始化邻接矩阵--  请勿修改以下内容*/
    for (int k=0; k<G.vexnum;k++)
    {
        G.vertex[k]=k+'A';
    }
    for (int i = 0; i < G.vexnum; ++i) 
        for (int j = 0; j < G.vexnum; ++j)
            G.arcs[i][j] = 0;
    bool vbool=1,abool=1;//不要改,标志位,用于判断插入顶点和插入弧是否成功
    /*--初始化邻接矩阵--  请勿修改以上内容*/


//--------------------------您 可 以 修 改 此 框 内 容(可修改区域2/2)---------------------
    //初始弧,可修改,数字可以代表弧的长度,也可以统一为1,无影响。0代表无边
    //(经在前方初始化了所有边为0,下面只需写有弧的边即可


    G.arcs[0][1] = G.arcs[1][0] = G.arcs[0][2] = G.arcs[2][0] = G.arcs[0][3] = G.arcs[3][0] = G.arcs[0][4] = G.arcs[4][0] = 1;
    G.arcs[1][2] = G.arcs[2][1] = G.arcs[1][3] = G.arcs[3][1] = G.arcs[1][4] = G.arcs[4][1] = 2;
    G.arcs[2][3] = G.arcs[3][2] = G.arcs[2][4] = G.arcs[4][2] = 3;
    G.arcs[3][4] = G.arcs[4][3] = 4;
    //请注意,若为无向图,请保证结构有对称性!包括边的长度和
//--------------------------您 可 以 修 改 此 框 内 容(可修改区域2/2)---------------------


//后续区域请勿修改
//后续区域请勿修改
//后续区域请勿修改

    /*--初始化邻接矩阵:统计弧边数和判断输入内容--  请勿修改以下内容*/
    //遍历邻接矩阵,统计弧的总数
    for (int i=0; i<G.vexnum; i++)
    {
        for (int j=0; j<G.vexnum; j++)
        {
            if (G.arcs[i][j]!=0)
            {
                G.arcnum++;
            }
        }
    }
    if(G.type==UDG)G.arcnum=G.arcnum/2;//无向图,弧数/2
    int init_arcnum = G.arcnum;//初始弧的数量
    //判读输入字母在A-Z内
    if((insert_v<'A'||insert_v>'Z')||(insert_a1<'A'||insert_a1>'Z')||(insert_a2<'A'||insert_a2>'Z'))
    {
        printf("测试样例的输入的顶点或边的字母不在A-Z内!\n");
        printf("请修改main函数中的insert_v和insert_a1和insert_a2的值!\n");
        printf("程序自动终止!\n");
        return 0;
    }
        
    //判断无向图是否满足对称性
    if (G.type==UDG)
    {
        for (int i=0; i<G.vexnum; i++)
        {
            for (int j=0; j<G.vexnum; j++)
            {
                if (G.arcs[i][j]!=G.arcs[j][i])
                {
                    printf("测试样例的输入的无向图不满足对称性!\n");
                    printf("其中异常的一处为G.arcs[%d][%d]与G.arcs[%d][%d]不相等!\n",i,j,j,i);
                    printf("请修改!若您想使用有向图请修改G.type的值为DG\n");
                    printf("程序自动终止!\n");
                    return 0;
                }
            }
        }
    }
    /*--初始化邻接矩阵:统计弧边数和判断输入内容--  请勿修改以上内容*/
    
    

    

   


    

    printf("·初始化信息·    顶点数:%d\t", G.vexnum);
    printf("弧数:%d\t", G.arcnum);
    if(G.type==DG) printf("图的种类标志:有向图\n");
    else if(G.type==UDG) printf("图的种类标志:无向图\n");
    else{
        printf("图的种类标志:错误定义或者未定义!\n程序终止,请修改main函数的内容!\n");
        return 0;
    }
    
    
    DrawGraph(&G);
    printf("\n");

    if(flag==0||flag==2){
    printf(">>插入顶点\n");
    vbool=matrix_insert_vertex(&G, insert_v);

        if(!vbool){
            printf("函数返回:false\n");
        }
        else{
        printf("函数返回:true\n");
        printf("·插入顶点后·    顶点数:%d\t", G.vexnum);
        printf("弧数:%d\t", G.arcnum);
            if(G.type==DG) printf("图的种类标志:有向图\n");
            else if(G.type==UDG) printf("图的种类标志:无向图\n");
            else{
                printf("图的种类标志:错误定义或者未定义!\n程序终止,请修改main函数的内容!\n");
                return 0;
        }


        DrawGraph(&G);
        }
    printf("\n");
    }
    else{
        printf("您未测试插入顶点,若需要请修改main函数的flag\n\n");
    }



    if(flag==0||flag==3){
    printf(">>插入边\n");
    abool=matrix_insert_arc(&G,insert_a1,insert_a2);


    if(!abool){
        printf("函数返回:false\n");
    }
    else{
        printf("函数返回:true\n");
        printf("·插入边后·      顶点数:%d\t", G.vexnum);
        printf("弧数:%d\t", G.arcnum);
        if(G.type==DG) printf("图的种类标志:有向图\n");
        else if(G.type==UDG) printf("图的种类标志:无向图\n");
        else{
            printf("图的种类标志:错误定义或者未定义!\n程序终止,请修改main函数的内容!\n");
            return 0;
        }

        if(G.type==UDG&&G.vexnum==init_arcnum+2){
            printf("注意:无向图的边只算矩阵的上三角或下三角非0个数,不是整个哦,所以边的个数不是加2\n");
        }

        DrawGraph(&G);
    }
    printf("\n");
    }
    else{
        printf("您未测试插入边,若需要请修改main函数的flag\n\n");
    }
    if(!abool&&flag==3){
        printf("--\nmatrix_insert_arc函数返回false的原因可能是未运行插入顶点操作,导致图中找不到边的一个顶点\n您需要修改main函数中的flag值来运行插入顶点的函数。\n--\n");
    }
    printf("\n\n---测试结束---\n");
    


    
    return 0;
}




如果不对main函数进行任何修改

正确的输出结果如下图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谨慎谦虚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值