void createudn(amgraph &G) { int w; char v1,v2; printf("请输入总定点数和总边数:\n"); scanf("%d %d",&G.vexnum,&G.arcnum); printf("请输入各点信息:\n"); for(i=0;i<G.vexnum;++i) { scanf("%c",&G.vexs[i]); } for(i=0;i<G.vexnum;++i) { for(j=0;j<G.vexnum;++j) { G.arcs[i][j]=maxint; } } for(i=0;i<G.arcnum;i++) { scanf("%c %c %d",&v1,&v2,&w); G.arcs[vexlocate(G,v1)][vexlocate(G,v2)]=w; G.arcs[vexlocate(G,v2)][vexlocate(G,v1)]=w; } }问题出在哪
时间: 2024-02-01 07:02:50 浏览: 135
问题出在输入顶点信息时,应该在读取完数字后再读取字符,因为输入数字后会有一个换行符留在缓冲区中,会被误认为是输入的字符。可以在读取字符前加上一个空格来解决这个问题。修改后的代码如下:
```c
void createudn(amgraph &G) {
int w;
char v1,v2;
printf("请输入总定点数和总边数:\n");
scanf("%d %d",&G.vexnum,&G.arcnum);
printf("请输入各点信息:\n");
getchar(); // 读取换行符
for(i=0;i<G.vexnum;++i) {
scanf(" %c",&G.vexs[i]); // 加上空格
}
for(i=0;i<G.vexnum;++i) {
for(j=0;j<G.vexnum;++j) {
G.arcs[i][j]=maxint;
}
}
for(i=0;i<G.arcnum;i++) {
scanf(" %c %c %d",&v1,&v2,&w); // 加上空格
G.arcs[vexlocate(G,v1)][vexlocate(G,v2)]=w;
G.arcs[vexlocate(G,v2)][vexlocate(G,v1)]=w;
}
}
```
相关问题
C语言status createUdn(AMGraph &G)开头
`createUdn`函数在C语言中通常用于初始化或者创建某种数据结构,这里看样子像是在图形处理或者网络编程中操作图的数据结构。假设`AMGraph`是一个自定义的数据结构,代表有向图(Directed Graph),`status`可能是函数返回值,表示操作是否成功。这个函数可能大致如下:
```c
typedef enum {
STATUS_SUCCESS,
STATUS_FAILURE,
} Status;
Status createUdn(AMGraph *G) { // G是一个指向AMGraph的指针
if (G == NULL) {
return STATUS_FAILURE; // 输入无效
}
// 初始化AMGraph,如分配内存、设置默认属性等
G->vertices = initializeVertices();
G->edges = initializeEdges();
// 其他必要的创建步骤,比如遍历、连接节点等
// ...
if (/* 创建过程全部成功 */) {
return STATUS_SUCCESS;
} else {
// 处理失败情况,如错误日志记录
free(G->vertices);
free(G->edges);
return STATUS_FAILURE;
}
}
```
在这个函数里,如果`createUdn`操作成功,它会返回`STATUS_SUCCESS`;如果遇到错误,比如资源不足或者输入验证失败,它将返回`STATUS_FAILURE`。
int LocateVex(AMGraph *G,VerTexType v) { int i; for (i = 0; i < G->vexnum; i++) { if (G->vex[i] == v) return i; } return -1; } Status CreateUDN(AMGraph *G) { int i, j, k; VerTexType v1, v2; ArcType w; printf("输入城市的总数量和总边数:"); scanf("%d %d", &G->vexnum, &G->arcnum); fflush(stdin); printf("输入各个城市的代号:"); for (i = 0; i < G->vexnum; i++) scanf("%c", &G->vex[i]); for (i = 0; i < G->vexnum;i++) for (j = 0; j < G->vexnum; j++) { G->arc[i][j] = Max_Int; } for (k = 0; k < G->arcnum; k++) { fflush(stdin); printf("输入相邻城市以及它们之间的成本:"); scanf("%c %c %d", &v1, &v2, &w); i = LocateVex(G, v1); j = LocateVex(G, v2); G->arc[i][j] = w; G->arc[j][i] = G->arc[i][j]; } return OK; } //查找下一个权值最小的边上的另一个节点 int Min(AMGraph G) { int i; int min = Max_Int; int index = -1; for (i = 0; i < G.vexnum; i++) { if (min>closedge[i].lowcost&&closedge[i].lowcost!=0) { min = closedge[i].lowcost; index = i; } } return index; }
这段代码是 Prim 算法实现中用到的一些函数。其中,LocateVex 函数用来查找顶点 v 在邻接矩阵中的位置,CreateUDN 函数用来创建无向图,包括输入城市的总数量和总边数,各个城市的代号以及相邻城市之间的成本。在 CreateUDN 函数中,邻接矩阵的初值被初始化为 Max_Int,表示两个顶点之间没有边,而输入的边的信息则会更新邻接矩阵中对应位置的权值。Min 函数用来查找 closedge 数组中最小权值的边的位置。具体实现过程为:遍历 closedge 数组,找到权值最小的边的位置,返回该位置即可。
阅读全文