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函数内置的测试样例作任何修改
正确的输出结果是
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)