如何从控制台读取图形而不知道它有多少边?

时间:2013-11-27 22:48:42

标签: c input scanf

我有这个图(第一行是顶点数,下面的行是有向边):

9
1 4

1 5
2 5
4 5
4 6
6 9
7 6
7 8
8 9

没有信息可以知道输入中有多少边缘,所以有人可以建议一种方法来阅读这种输入吗?

5 个答案:

答案 0 :(得分:1)

谢谢大家, 我终于解决了,这是输入代码:

while (1) {
    tmp1 = scanf("%d", &x);
    if (tmp1 == -1) // fix here
        break;
    tmp2 = scanf("%d", &y);

    new_vertex = (Vertex *) malloc(sizeof(Vertex));
    new_vertex->adj_vertex = NULL;
    new_vertex->vertex_no = y;
    new_vertex->time_stamp_visit = 0;
    new_vertex->time_stamp_finish = 0;

    last_vertex = getLastVertex((graph+x));
    last_vertex->adj_vertex = new_vertex;
}

答案 1 :(得分:0)

在此列表中从1到n-1循环读取该对,并在图形数据结构中的这两个节点之间插入边。

答案 2 :(得分:0)

我建议你阅读:http://shygypsy.com/iotutorial.html

使用“读取整数,一次一个,跳过空格,直到输入结束”的方法。

在代码中维护状态,指出它是输入的开始还是结束顶点。

完成输入输入后,别忘了按ctrl + d。

答案 3 :(得分:0)

您可以使用计数为EOF的“终止字符”,例如-1或最后一对节点之后的内容。

然后您的数据将是:

9
1 4
1 5
2 5
4 5
4 6
6 9
7 6
7 8
8 9
-1

你的代码:

while(1){
    scanf("%d %d", &num1, &num2);
    if(num1==-1) break;
    // process
}

答案 4 :(得分:0)

我写了getnum()来从stdin返回一个整数:

int getnum(int * last) {
    int c, n = 0;

    while ((c = getchar()) != EOF && 0x30 <= c && c < 0x40)
        n = n * 10 + (c - 0x30);

    if (last)
        *last = c;

    return n;
}

它将从stdin获取数字,直到检索到非数字字符。因为getnum()不关心非数字字符是什么,所以数字的排列方式无关紧要。它们都可以在同一条线上,或者以空格分隔的线对,每条线一条线。我把它放在一个循环中,一旦读入正确数量的数字就会停止,但你可以轻松循环直到last指向非空格。

此外,如果要从FILE或fd(整数文件描述符)读取,请将FILE / fd传递给getnum()并使用getc(FILE *) / fgetc(int)