проблема глобальной переменной - PullRequest
0 голосов
/ 11 марта 2010

я объявляю глобальную переменную и использую и изменяю ее значение в функции. Затем я хочу получить измененное значение этой глобальной переменной, у нее есть некоторые проблемы. Кто-нибудь может мне помочь?

#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 ]

3 голосов
/ 11 марта 2010

Позвольте мне выделить проблему:

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

К моменту запуска второго цикла n равен единице, а printf выполняется только один раз, поэтому вы печатаете значение test[0][1] и только это.

Значение test[0][1] много раз перезаписывается (столько же, сколько число листовых узлов в дереве) в 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];
        }
    }
    ...
}

Теперь, из-за того, как вы обходите дерево в последний раз, test[0][1] перезаписывается для кода Хаффмана, у которого в качестве первого символа стоит «0».

0 голосов
/ 11 марта 2010

В качестве примечания:

  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);
}

Нет причин выделять 256-кратный размер узла для хранения одного узла. Вы создаете узел и сохраняете его в массиве указателей на узлы. Выделите там один узел, например:

malloc (sizeof (node)); or malloc ((sizeof (*ptr));
0 голосов
/ 11 марта 2010
you can store the n value to some temporary variables, after you get the

значения.

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]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...