我有这个图(第一行是顶点数,下面的行是有向边):
9
1 4
1 5
2 5
4 5
4 6
6 9
7 6
7 8
8 9
没有信息可以知道输入中有多少边缘,所以有人可以建议一种方法来阅读这种输入吗?
答案 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)
。