2010-03-11 3 views
0

Je déclare une variable globale et utilise et modifie sa valeur dans la fonction. Ensuite, je veux obtenir la valeur modifiée de cette variable globale, il y a un problème. Quelqu'un peut-il m'aider?problème variable global

#include<stdio.h> 
#include<string.h> 
#include<conio.h> 
#include<stdlib.h> 
#define MAX 10 
struct link 
{ 
      int freq; 
      char value[MAX]; 
      struct link* right; 
      struct link* left; 
}; 
typedef struct link node; 
void sort(node *[], int); 
node* create(char[], int); 
void sright(node *[], int); 
void Assign_Code(node*, int [], int); 
void Delete_Tree(node *); 


int test[720][720]; 

main() 
{ 
    node* ptr, * head; 
    int i, n, total = 0, u, c[256]; 
    char str[MAX]; 
    node* a[256]; 
    int freq; 

    printf( "Huffman Algorithm\n"); 
    printf("\nEnter the no. of letter to be coded:"); 
    /*input the no. of letters*/ 
    scanf("%d", &n); 
    for (i = 0; i < n; i++) 
    { 
     printf("Enter the letter & frequency:"); 
     /*input the letter & frequency*/ 
     scanf("%s %d", str, &freq); 
     a[i] = create(str, freq); 
    } 
    while (n > 1) 
    { 
     sort(a, n); 
     u = a[0]->freq + a[1]->freq; 
     strcpy(str,a[0]->value); 
     strcat(str,a[1]->value); 
     ptr = create(str, u); 
     ptr->right = a[1]; 
     ptr->left = a[0]; 
     a[0] = ptr; 
     sright(a, n); 
     n--; 
    } 

    Assign_Code(a[0], c, 0); 
    //getch(); 
    printf("Code: "); 
     for (i = 1; i <= n; i++) 
     { 
      printf("%d", test[0][i]); 
     } 
     printf("\n"); 

    Delete_Tree(a[0]); 


} 

node* create(char a[], int x) 
{ 
    node* ptr; 
    ptr = (node *) malloc(256*sizeof(node)); 
    ptr->freq = x; 
    strcpy(ptr->value , a); 
    ptr->right = ptr->left = NULL; 
    return(ptr); 
} 
void sort(node* a[], int n) 
{ 
    int i, j; 
    node* temp; 
    for (i = 0; i < n - 1; i++) 
     for (j = i; j < n; j++) 
      if (a[i]->freq > a[j]->freq) 
      { 
       temp = a[i]; 
       a[i] = a[j]; 
       a[j] = temp; 
      } 
} 
void sright(node* a[], int n) 
{ 
    int i; 
    for (i = 1; i < n - 1; i++) 
     a[i] = a[i + 1]; 
} 
void Assign_Code(node* tree, int c[], int n) 
{ 
    int i; 
    if ((tree->left == NULL) && (tree->right == NULL)) 
    { 
     printf("%s code: ", tree->value); 
     test[0][0]=tree->value; 
     for (i = 0; i < n; i++) 
     { 
      test[0][i+1]=c[i]; 
      printf("%d", c[i]); 
     } 
     printf("\n"); 

    } 
    else 
    { 
     c[n] = 1; 
     n++; 
     Assign_Code(tree->left, c, n); 
       c[n - 1] = 0; 
     Assign_Code(tree->right, c, n); 
    } 
} 
void Delete_Tree(node * root) 
{ 
    if(root!=NULL) 
    { 
     Delete_Tree(root->left); 
     Delete_Tree(root->right); 
     free(root); 
    } 
} 
+3

Quel est le problème? _ – kennytm

+3

Devons-nous deviner le problème aussi? Vous savez, les gens ici juste _love_ deviner sur des questions incomplètes et vagues ... –

+0

dans le principal, je veux imprimer la valeur de la variable globale, mais le résultat est nul. – user239468

Répondre

0

Comme une note de côté:

node* create(char a[], int x) 
{ 
    node* ptr; 
    ptr = (node *) malloc(256*sizeof(node)); // <--- This is wrong 
    ptr->freq = x; 
    strcpy(ptr->value , a); 
    ptr->right = ptr->left = NULL; 
    return(ptr); 
} 

Il n'y a aucune raison d'allouer 256 fois la taille du noeud pour stocker un noeud. Vous créez un noeud et le stockez dans un tableau de pointeurs vers des noeuds. Allouer un nœud là, comme ceci:

malloc (sizeof (node)); or malloc ((sizeof (*ptr)); 
3

Permettez-moi de souligner le problème:

while (n > 1) 
{ 
    ... 
    n--; 
} 
... 
for (i = 1; i <= n; i++) 
{ 
    printf("%d", test[0][i]); 
} 

Au moment où la deuxième boucle commence n est un, et le printf est exécuté une seule fois, de sorte que vous imprimez la valeur de test[0][1] et seulement .

La valeur de test[0][1] est écrasé plusieurs fois (autant que le nombre de nœuds feuilles dans l'arbre) dans Assign_Code:

void Assign_Code(node* tree, int c[], int n) 
{ 
    if ((tree->left == NULL) && (tree->right == NULL)) 
    { 
     ... 
     for (i = 0; i < n; i++) 
     { 
      test[0][i+1]=c[i]; 
     } 
    } 
    ... 
} 

Maintenant, à cause de la façon dont vous traverser l'arbre la dernière fois test[0][1] est remplacé est pour un code Huffman qui a un '0' comme premier caractère.

+0

Mais je remplace le n par un entier, tout comme 3 la sortie est 0 ce qui est incorrect. – user239468

0
you can store the n value to some temporary variables, after you get the 
valeurs

.

Then use the temporary variable in your for loop condition. 
scanf("%d", &n); 
int temp = n ; 
for (i = 1; i <= temp ; i++) 
{ 
    printf("%d", test[0][i]); 
}