如何存储在C中的结构指针变量树值(全树)++ [英] How to store values in struct pointer variable tree (for full tree) in c++

查看:152
本文介绍了如何存储在C中的结构指针变量树值(全树)++的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新的编程工作的C ++(的问题,即使这个概念是在C一样,我猜)。

I am new in programming and working on c++ (even the concept of problem is same in c, I guess).

我读一个文件,其中包含alphabtes(符号在我的code),如aabbacceaad来计算频率的唯一参数。 我的code计算频率correctly.I我确信这一点。 现在的问题是,在我的code 节点*树指针变量(即节点类型)。我使用它来创建tree.But当我试图从重复的符号计算出的频率创建树那么这个指针变量只记得外面的换最后执行的频率环请照顾我只需要使用指针不是数组

I am reading a file as sole arguments which contains alphabtes(symbols in my code) like "aabbacceaad" to calculate frequency. My code calculate frequency correctly.I am sure of that. The problem is that in my code Node *tree pointer variable (which is of type node). I am using it to create tree.But when i try to create tree from the frequency calculated from repeated symbols then this tree pointer variable only remembers the last executed frequency outside the for-loop. Please take care i just have to use pointers not arrays.

我的意思是假如我有符号,像这样的aabcddeeebbaa输入文件。而对于它的期望的输出是这样的:

I mean suppose i have symbols in input file like this "aabcddeeebbaa". And the expected output for it is this:

0  symbol:a  Freq:4  Left 0  Right 0  Index1
1  symbol:b  Freq:3  Left 0  Right 0  Index2
2  symbol:c  Freq:1  Left 0  Right 0  Index3
3  symbol:d  Freq:2  Left 0  Right 0  Index4
4  symbol:e  Freq:3  Left 0  Right 0  Index-1

但我code的输出是这样的:

But the output of my code is like this:

0  symbol:e  Freq:3  Left:0  Right:0  Next:5 //Last "e" is executed,tree variable forgot a,b,c and d. 
1  symbol:e  Freq:3  Left:0  Right:0  Next:5
2  symbol:e  Freq:3  Left:0  Right:0  Next:5
3  symbol:e  Freq:3  Left:0  Right:0  Next:5
4  symbol:e  Freq:3  Left:0  Right:0  Next:-1

我的完整的C ++ code这样做是:

My full c++ code to do so is :

#include <iostream> 
#include <stdlib.h> 
#include <fstream> 
#include <cassert> 
#include <vector>

using namespace std;

class Huffman {
    public: int data_size,
    length;
    Huffman(char * argv);
    ~Huffman() {};
    vector < char > storesym;
    vector < int > storefreq;
    struct Node
    {
        int value;
        int freq, next;
        short flag;
        unsigned char symbol;
        struct Node * left, * right;
    };
    Node * tree;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////       CONSTRUCTOR definition        ////////////////////////////////////////////////////////////////////////////////
Huffman::Huffman(char * argv) 
{
    char c;
    int count = 0;
    int flag[256]; //this flag is to know if the alphabet is already counted or not.If counted that i set it to "1" other wise it is "0".Please see below in my code
    int j = 0;
    FILE * input_file;
    int  *symbolarray;
    symbolarray=new int[30];
    char i, n;
    input_file = fopen(argv, "rb");
    c = fgetc(input_file);
    //////////////////////////////////////////////////////////////////////////////   From here to down i read the alphabbets from file taken as sole argument ///////////////////////////////////////
    while (c != EOF && c != '\n' && c != '\r')
    {
        symbolarray[count] = c;
        count++;
        c = fgetc(input_file);
    }
    fclose(input_file);

    for (i = 0; i < count; i++)
        flag[i] = {0 };
    int fcount1 = 0;
    for (i = 0; i < count; i++)
    {
        if (flag[i] == 0)
        {
            for (j = i; j < count; j++) 
            {
                if (symbolarray[i] == symbolarray[j]&& flag[j] == 0) 
                {
                    fcount1++;
                    flag[j] = 1; //**I am setting flag to 1 those alphabets to 1 so that they will not be counted again on next iteration**
                }
            }
            storesym.push_back(symbolarray[i]);
            storefreq.push_back(fcount1);
        }
        fcount1 = 0;
    }
    cout << endl;
    //////////////////////////////////////////////////////////////////////////  ERROR PRONE PART STARTS NOW  /////////////////////////////////////////////////////

    for (i = 0; i < storesym.size(); i++) 
    {
        tree = new Node;  // the problem is here this tree pointer don't store the values for all alphabets, it just remembers the last executed alphabet after this for loop.
        tree -> left = NULL;
        tree  ->right = NULL;
        tree -> symbol = storesym[i];
        tree  -> freq = storefreq[i];
        tree -> flag = 0;
        tree -> next = i + 1;
        cout<<"check1 : "<<tree -> symbol<<endl;
    } 
    ////////////////////////////////////////////////////////////////////  eror PRONE PART ENDS HERE  ///////////////////////////////////////////////////////////////////////////////////
    cout << "Here is the data read from file" << endl;
    n = storesym.size() - 1;
    for (int i = 0; i < storesym.size(); i++)
    {
        if (n == i)
        {
            tree  -> next = -1;
            cout << i << "  symbol:" << tree  -> symbol << "  Freq:" << tree  ->freq << "  Left:" << tree  -> left << "  Right:" << tree  -> right << "  Next:" << tree  -> next << endl;
            break;
        } else 
        {
            cout << i << "  symbol:" << tree  -> symbol << "  Freq:" << tree -> freq << "  Left:" << tree  -> left << "  Right:" << tree  ->right << "  Next:" << tree  -> next << endl;
        }
    }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
int main(int argc, char * * argv)
 {
    int freq[256] = {0};
    if (argc < 2) {
        cout << "Ohh.. Sorry , you forgot to provide the Input File please" << endl;
        return (0);
    }
    Huffman Object1(argv[1]);
    return (0);
}

**请帮助我如何保存在内存中的所有A,B,C,D和E(不只是最后的E)?我知道有一些东西要与指针做而已。

**Please help me how to keep in memory all the "a,b,c,d and e" (Not just last "e") ? I know there is something to be done with pointers only.

推荐答案

这一点

while (c != EOF && c != '\n' && c != '\r')
{
    tree[count].symbol = c;
    count++;
    c = fgetc(input_file);
}

解引用未初始化的指针
这是一个很大的禁忌,并意味着你的程序正式定义。
你刚刚不走运,因为它并没有崩溃。

dereferences the uninitialized pointer tree.
This is a big no-no, and means that your program is formally undefined.
You've just been unlucky in that it hasn't crashed.

您又来了一个位进一步下跌。

You're doing it again a bit further down.

然后的你在这个循环分配:

Then you allocate in this loop:

for (i = 0; i < storesym.size(); i++) 
{
    tree = new Node;  // the problem is here this tree pointer don't store the values for all alphabets, it just remembers the last executed alphabet after this for loop.
    tree -> left = NULL;
    tree  ->right = NULL;
    tree -> symbol = storesym[i];
    tree  -> freq = storefreq[i];
    tree -> flag = 0;
    tree -> next = i + 1;
    cout<<"check1 : "<<tree -> symbol<<endl;
} 

这反复中分配的一个节点键,点吧。照片 换句话说,它不是建立一棵树,你需要重写它,所以它实际上没有。
你在下面的无论教材近期应该覆盖的树木。

which repeatedly allocates one Node and points tree at it.
In other words, it's not building a tree, and you need to rewrite it so it actually does.
Whatever course material you're following should have covered trees recently.

我能给出的最好的建议是:重新开始,多读,而在测试之前不写了这么多code

The best advice I can give is: start over, read more, and don't write so much code before testing.

这篇关于如何存储在C中的结构指针变量树值(全树)++的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆