【问题标题】:Get the variable value from a previous struct in arrays of structs从结构数组中的前一个结构中获取变量值
【发布时间】:2015-01-22 15:11:24
【问题描述】:

我有以下结构:

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 中给出的连接,我该如何检查和分配(就像示例所示)?

文件值读取正常,但我不确定如何获取结构值的前一个成员以用于比较。

【问题讨论】:

  • n 在哪里?另外,Vertex *pokazivac = &amp;cvorovi[n]; 大错特错。
  • @SouravGhosh 我忘了包含它,我稍后会编辑它。我不是 C 程序员,对于糟糕的代码我很抱歉,请您详细说明为什么该语句是错误的?
  • 该语句(以及该函数中引用cvorovi[n] 的所有其他语句)是错误的,因为该函数的范围内没有变量n。我想你的意思是*cvorovicvorovi[0](它们在函数kreiranje() 内部是等效的)。
  • 此外,看起来您的函数几乎肯定会通过写入数组 cvorovi 的末尾来引发未定义的行为,因为您实际传递给函数的是指向第一个位置的指针 结束之后。
  • 旁注:代码中的函数名、变量名和打印的字符串使其难以阅读。您需要付出一些努力将其翻译成 SO 用户最常用的语言(提示:它不是中文)。此外,请尝试提供一小段代码来说明您遇到的确切问题。

标签: c arrays struct


【解决方案1】:

我的问题如下 - 如果 ID 具有多个 edge.txt 中给出的连接(就像示例所示),我如何检查和分配?

有几种方法可以在程序中表示图形。我认为在你的情况下最简单的是Adjacency MatrixIncidence 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);
    }
}

【讨论】:

    【解决方案2】:

    你似乎想要更像这样的东西:

    /* ... 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。

    【讨论】:

    • 请注意,kreiranje(cvorovi, MAX_VERTICES) 完全等同于 kreiranje(&amp;cvorovi[0], MAX_VERTICES)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多