icoding测试代码--邻接表2

icoding测试代码--邻接表2,第1张

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

请将代码复制到

bool del_vertex(ListGraph *G, VertexType v){
//TODO
}

中,然后根据提示修改main函数

完成测试样例的输入

无需在意下方定义的InfoPtr *info ,icoding对此不检测,我们的测试代码也没有对其的打印输出

typedef struct ArcNode{
    int adjvex;
    InfoPtr *info;
    struct ArcNode *nextarc;
}ArcNode;

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

部分代码来自白zj老师

main函数中有一个代码框内容需要集中修改

#include
#include
#include
#define MAX_VERTEX_NUM 100

typedef char VertexType;
typedef enum{
    UNDEFINED,DG, UDG
}GraphType;

typedef struct ArcNode
{
    int adjvex;
    //InfoPtr *info;这个icoding没看,我也不知道啥意思
    struct ArcNode *nextarc;

}ArcNode;

typedef struct VNode
{
    VertexType data;
    ArcNode *firstarc;
}VNode;
typedef struct
{
    VNode vertex[MAX_VERTEX_NUM];
    int vexnum, arcnum;
    GraphType type;
}ListGraph;

int locate_vertex(ListGraph *G, VertexType v) {
    for (int k = 0; k < G->vexnum; ++k)
        if (G->vertex[k].data == v)
            return k;

    return -1;
}

void DrawGraph(ListGraph *G) {
    ArcNode *p;

    for (int i = 0; i < G->vexnum; ++i) {
        printf("%2d |%2c : ", i, G->vertex[i].data); //表头结点
        p = G->vertex[i].firstarc;
        if (p == NULL)
            printf("^");
        else
            while (p != NULL) {
                printf("--> %d(%c) ", p->adjvex, G->vertex[p->adjvex].data); //外表结点
                p = p->nextarc;                                              //外表结点下移
            }
        putchar('\n');
    }
}


bool del_vertex(ListGraph *G, VertexType v){
    
//TODO
}





int main() {

    ListGraph G;
//----------以 下 内 容 请 根 据 提 示 修 改-----------------
    G.type = DG;//可修改,图的种类,DG:有向图,UDG 无向图
    G.vexnum = 4;//可修改,顶点集个数,从A开始编号。

    VertexType del_ver='B';//可修改,表示将删除顶点的标号
   
    int flag=0;
    //可修改,标志位(0:全部测试,1:只测试初始打印)

    VertexType arc1[]={'A','B','A','C'};
    VertexType arc2[]={'A','A','B','B'};
        //以上两个数组代表边的起点和终点标号,且保持上下对应关系。
        //示例一:输入比如arc1[]={'A'} arc2[]={'B'} 代表在图中有A-->B边
        //示例二:输入比如arc1[]={'A','B'} arc2[]={'B','B'} 代表在图中有A-->B,B-->B边
        //请保证没有重复边(否则会导致边数计算错误);
        //保证输入的边的起点和终点都在图中存在;
        //保证起点和终点的顶点集个数相同,环请写成示例二的格式(终点和起点都是一样的字母)。
        //输入的边的起点和终点都是大写字母,用单引号引起,不是数字。
        //对于无向图,必须保证对称性,即既有A-->B,也有B-->A。
        //对于有向图,可以不保证对称性。
//----------以 上 内 容 请 根 据 提 示 修 改-----------------
    
   
    int i, j, k;
    ArcNode *arc;
    VertexType v1, v2;

    printf("---icoding---\n6-3邻接表2\n");
    printf("icoding使用数字表示顶点集,为了方便,本例用大写字母表示顶点集\n");
    printf("在此icoding中,一般都认为是有向图,因此不建议用无向图,否则会导致边数错误\n");
    printf(">>正在初始化\n");

    for (i = 0; i < G.vexnum; ++i) {
        G.vertex[i].data=i+'A';
        G.vertex[i].firstarc = NULL; //将边表置为空
    }

    

        
        
        int size_arc1=sizeof(arc1)/sizeof(arc1[0]);
        int size_arc2=sizeof(arc2)/sizeof(arc2[0]);
        if(size_arc1!=size_arc2){
            printf("错误,测试样例输入的起点和终点顶点个数不相等,程序自动终止。\n请修改main函数的arc1[]与arc2[]数组,保持数量一致\n");
            return 0;
        }

        
        
       


        for(int m=0;m[%c]\n请修改main函数的arc1[]与arc2[]数组\n",arc1[m],arc2[n]);
                    return 0;
                }
                }
            }
        }

        G.arcnum=size_arc1;//边数
        int ring=0;//环标志
        //检查无向图是否有对称性
        if(G.type==UDG){
        int duichen=0;
        int m=0;
        for( m=0;m[%c]但有其反向通路\n请修改main函数的arc1[]与arc2[]数组\n",arc2[m],arc1[m]);
                printf("若要使用有向图,请修改main函数的G.type=DG\n");
                return 0;
            }
            }

            G.arcnum=(G.arcnum-ring)/2+ring;//无向图,(边数-环)/2+环数
            
        }
        int init_arcnum=G.arcnum;//记录初始边数


        for(int cou=0;cou'Z'||arc1[cou]<'A')||(arc2[cou]>'Z'||arc2[cou]<'A')){
                printf("错误,测试样例输入的边标号非A-Z值,程序自动终止。\n请修改main函数的arc1[]与arc2[]数组\n");
                return 0;
            }
        i = locate_vertex(&G, arc1[cou]); //v1顶点所在顶点数组中的下标值。
        j = locate_vertex(&G, arc2[cou]); //v2顶点所在数组中的下标值。
        //如果arc[]的值在图中不存在,则报错
        if (i == -1 || j == -1) {
            printf("错误,测试样例初始化输入的边标号不存在,程序自动终止。\n请修改main函数的arc1[]与arc2[]数组\n");
            return 0;
        }
        arc = (ArcNode *)malloc(sizeof(ArcNode));
        arc->adjvex = j;
        arc->nextarc = G.vertex[i].firstarc; //头插法建立边表
        
        G.vertex[i].firstarc = arc; //把新建的结点链接在顶点后面
    }

    
    //打印图的基本信息
    printf("·初始化信息·    图的顶点:%d\t图的边数:%d\t",G.vexnum,G.arcnum);
    if(G.type==UDG)printf("图的种类:无向图");
    else if(G.type==DG)printf("图的种类:有向图");
    else {
        printf("图的种类未定义,请修改main函数的G.type值,程序自动退出\n");
        return 0; 
    }
    if(ring!=0){
    printf("\n\t      此图最初含有%d个环,后续函数不检测环\n",ring);
    }
    putchar('\n');

    DrawGraph(&G);
    printf("说明:数字表示顶点字母对应在顶点数组中的下标值,^表示此表为空\n");
    putchar('\n');

    int vbool=0,abool=0;

    if(flag==0||flag==2){
        printf(">>顶点删除\n删除%c\t",del_ver);
        vbool=del_vertex(&G,del_ver);
        if(!vbool){
            printf("函数返回false\n");
        }else{
            printf("函数返回true\n");

            printf("·删除顶点后·    图的顶点:%d\t图的边数:%d\t",G.vexnum,G.arcnum);
            if(G.type==UDG)printf("图的种类:无向图");
            else if(G.type==DG)printf("图的种类:有向图");
            else {
                printf("图的种类未定义,请修改main函数的G.type值,程序自动退出\n");
                return 0; 
            }
            putchar('\n');

            DrawGraph(&G);
            putchar('\n');

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




        printf("\n\n---测试结束---\n");
    return 0;
}

如果没有对 main函数内置的测试样例作任何修改

正确的输出结果是

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1295357.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存