我有以下结构:
struct V {
int d;
int tip;
char naziv[10];
int veza;
int tezina;
};
typedef struct V Vertex;
以下声明:
void kreiranje(Vertex cvorovi[]);
以下主要功能:
int main(){
int n=15;
Vertex cvorovi[n];
Vertex *pokazivac = &cvorovi[n];
kreiranje(pokazivac);
}
这是kreiranje函数背后的代码:
void kreiranje(Vertex cvorovi[])
{
int x,y,d,f,g;
int i = 0;
int brojac = 0;
char z[10];
char line[50];
char lined[50];
FILE *fr;
FILE *fp;
fr = fopen ("nodes.txt", "rt");
fp = fopen ("edges.txt", "rt");
while(fgets(line, 50, fr) != NULL)
{
sscanf (line, "%d|%d %s", &x, &y, &z);
cvorovi[n].d = x;
cvorovi[n].tip = y;
strcpy(cvorovi[n].naziv, z);
if(brojac < n){
fgets(lined, 50, fp) != NULL;
sscanf (lined, "%d-%d,%d", &d, &f, &g);
if (cvorovi[n-1].d == d){
printf ("\n Cvor prosli je %d\n", cvorovi[n-1].d);
printf ("\n %d \n", d);
cvorovi[n].veza = y;
cvorovi[n].tezina = g;
}
else {
cvorovi[n].veza = y;
cvorovi[n].tezina = g;
}
}
brojac++;
}
fclose(fr);
fclose(fp);
}
文件是这样的:
edges.txt
1-2,4
1-3,5
nodes.txt
1|1 EL_01
2|2 TF_01
在nodes.txt
的第一行,第一个数字显示edges.txt
中使用的ID。我的问题如下 - 我如何检查并分配ID是否具有edges.txt
中给出的多个连接(如示例所示)?
文件值读取正常,但我不知道如何才能获得结构值的前一个成员用于比较。
答案 0 :(得分:1)
我的问题如下 - 我如何检查并分配ID是否具有多个edge.txt中给出的连接(就像示例所示)?
有几种方法可以在程序中表示图形。我认为在您的情况下,最简单的是Adjacency Matrix或Incidence Matrix:
int AdjacencyMatrix[n][n];
在main()中的某个地方: memset(AdjacencyMatrix,0,sizeof(AdjacencyMatrix));
在你的读者功能(kreiranje)中:
fgets(lined, 50, fp) != NULL;
sscanf (lined, "%d-%d,%d", &d, &f, &g);
int From=d;
int To=f;
AdjacencyMatrix[From][To]=1
AdjacencyMatrix[To][From]=1; <<- Only if this is undirected graph
然后, 如果要检查节点的X连接,请使用:
for(i=0;i<n;++i) {
if(AdjacencyMatrix[X][i]==1) {
printf("Node %d links to %d\n", X, i);
}
}
答案 1 :(得分:0)
你似乎想要更像这样的东西:
/* ... data type and function declarations ... */
#define MAX_VERTICES 15
int main() {
Vertex cvorovi[MAX_VERTICES];
int n;
/* arguments are a pointer to the array _start_, plus its size: */
/* the number of vertices actually read is returned */
n = kreiranje(cvorovi, MAX_VERTICES);
/* ... */
return 0;
}
和
int kreiranje(Vertex cvorovi[], int n) {
int brojac = 0;
/* ... other local variable declarations ... */
while ((brojac < n) && (fgets(line, 50, fr) != NULL)) {
/* ... loop body ... */
brojac++;
}
return brojac;
}
我建议让函数kreiranje()
返回实际读取的顶点数,如图所示,因为您需要知道如何进一步使用它们。
至于检查归因于相同ID的多个连接,您可以跟踪到目前为止您所阅读的内容,并且在您看到足够自信以确保不必阅读更多内容之前,您会一直阅读。我知道这很抽象,但细节取决于您可以对数据的形式和组织以及您在程序中使用的数据结构做出的假设。如果你问的是问题的一般方法,而不是关于如何实现它的细节,那么你的问题可能不适合SO。