2012-11-29 47 views
1

我在将结果保存到输出文件时遇到问题。可能有些功能有问题,但我找不到并修复它。有人知道什么是错的吗?C中的Kruskal算法 - 无法保存到文件

程序的代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

int **str; 
int *tab; 

void read(){ 
    int n = 1; 
    char help_sign; 
    FILE *fp = fopen("In0303.txt", "r"); 
    if(fp == NULL){ 
     printf("Blad odczytu z pliku!"); 
    } 

    while((help_sign = fgetc(fp)) != EOF){ 
     if (help_sign == '\n'){ 
      n++; 
     } 
    } 
    fclose(fp); 
} 

void gen(){ 
    int i, n; 
    int **str; 

    str =(int**)malloc(n*sizeof(int*)); 

    for (i = 0; i < n; i++){ 
     str[i] = (int*)malloc(4*sizeof(int)); 
    } 
} 

void load_date(){ 
    int i, n; 
    int **str; 

    FILE *fp = fopen("In0303.txt", "r"); 

    for (i = 0; i < n; i++){ 
     fscanf(fp, "%d" , &str[i][0]); 
     fscanf(fp, "%d" , &str[i][1]); 
     fscanf(fp, "%d" , &str[i][2]); 
     str[i][3]=0; 
    } 
    fclose(fp); 
} 

void gen_tab(){ 
    int i, n, k = 0; 
    int **str; 
    int *tab; 

    for (i = 0; i < n; i++){ 
     if (str[i][0] > k) k = str[i][0]; 
     if (str[i][1] > k) k = str[i][1]; 
    } 

    tab = (int*)malloc(k*sizeof(int)); 

    for (i = 0; i < k; i++){ 
     tab[i] = i + 1; 
    } 
} 

void sort(){ 
    int i, n, j,tmp; 
    int **str; 

    for (i = 0; i < n-1; i++) 
     for (j = i+1; j < n; j++){ 
      if (str[i][2] > str[j][2]){ 
       tmp = str[i][0]; 
       str[i][0] = str[j][0]; 
       str[j][0] = tmp; 
       tmp = str[i][1]; 
       str[i][1] = str[j][1]; 
       str[j][1] = tmp; 
       tmp = str[i][2]; 
       str[i][2] = str[j][2]; 
       str[j][2] = tmp; 
      } 
     } 
} 

int min(int x, int y){ 
    if (x > y) return y; 
    else return x; 
} 

int max(int x, int y){ 
    if (x < y) return y; 
    else return x; 
} 

void make(){ 
    int i, j, min1, max1, p, q, n, k; 
    int *tab; 
    int **str; 
    for (i = 0; i < n; i++){ 
     if (tab[((str[i][0])-1)] != tab[((str[i][1])-1)]){ 
      str[i][3] = 1; 
      min1 = min(tab[((str[i][0])-1)], tab[((str[i][1])-1)]); 
      max1 = max(tab[((str[i][0])-1)], tab[((str[i][1])-1)]); 

      for (j = 0; j < k; j++){ 
       if (tab[j] == max1) 
        tab[j] = min1; 
      } 
     } 
    } 
} 

void save(){ 
    int i, n; 
    int **str; 
    int *tab; 

    FILE *g = fopen("Out0303.txt","w"); 

    for (i = 0; i < n; i++){ 
     if (str[i][3] == 1){ 
      fprintf(g, "%d ", str[i][0]); 
      fprintf(g, "%d ", str[i][1]); 
      fprintf(g, "%d\n", str[i][2]); 
     } 
    } 
    fclose(g); 
} 

int main(){ 
    read(); 
    gen(); 
    load_date(); 
    gen_tab(); 
    sort(); 
    make(); 
    save(); 

    printf("Wyniki zapisane do pliku!\n"); 
    free(str); 
    free(tab); 
    return 0; 
} 

不输入文件( “In0303.txt”):

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

,这就是应建立在输出文件:( “Out0303.txt” ):

17 
3 9 [1] 
5 6 [1] 
4 9 [2] 
6 9 [2] 
7 9 [2] 
8 9 [2] 
1 2 [3] 
1 8 [4] 
+0

为什么不使用freopen函数来重定向标准输出 –

回答

3

副手 - 在你的保存功能,你不指定为 “n”

扩大一点。您似乎想将“n”用作全局变量,但是您声明了它的本地实例,因此值不会保留在函数中。你可以让它成为全球的或者传递它。

3

添加到刚果(金)答案:

这段代码:

for (i = 0; i < n; i++){

也非常少,如果你不设置N,你有这样的错误在根(),gen_tab() load(),save()和几乎所有其他函数。

+0

您会在这些函数之一中显示更改吗?我很新,编程:) –

+0

@MaciejJanuszewski:您可能需要将'read()'改为'int read(void)',初始化int n = 0;并返回函数中的n。主代码将有'int n = read();如果(n> 0){gen(n); load_date(N); ...},所以你把'n'传递给每个函数。但是,我担心还有其他问题在等待你,从'load_date()'开始。 –

+0

好的。现在它向每个函数说明参数()。 - >函数不需要1个参数。 –