2011-05-28 41 views
0

我想我可以只使用一個列表然而,在這一點上,我只是好奇,爲什麼下面的代碼不工作:推元素數組++一個std ::列表用C

struct treeNode{ 
    char symbol; 
    double freq; 
    int left; 
    int right; 
}; 

treeNode *tree; 
int nOS = 16; 
tree = (treeNode *)malloc(sizeof(treeNode) * nOS); 
list<treeNode> treeList; 

後初始化樹中的所有元素我嘗試將它們推送到treeList並得到分段錯誤,如果tree是treeNode樹[nOS],則不會發生,但我正在使用未知數量的元素,因此我需要能夠使用realloc ,因此使用malloc:

for (int i = 0; i < nOS; i++) { 
    treeList.push_back(tree[i]); 
} 

我試着將樹[i]投到各種數量的th ings:(treeNode),(const treeNode)但我無法弄清楚如何讓它工作。謝謝!

+0

爲什麼malloc的?爲什麼不使用矢量?或另一個列表?什麼是symbolList? – 2011-05-28 10:22:44

+0

好吧,我在開頭說我知道我可以使用一個列表,但我很好奇,爲什麼這不起作用,以便進一步瞭解malloc,列表,c/C++等。 – MCH 2011-05-28 10:24:51

+0

行,但什麼是symbolList - 你的意思是treeList? – 2011-05-28 10:28:43

回答

2

我已經做了在ideone this,它似乎工作:(無段錯誤)

#include<list> 
#include<vector> 
#include <stdlib.h> 
#include<iostream> 

struct treeNode{ 
    char symbol; 
    double freq; 
    int left; 
    int right; 
}; 

int main(int argc, char** argv) 
{ 
treeNode *tree; 
int nOS = 16; 
tree = (treeNode *)malloc(sizeof(treeNode) * nOS); 
std::list<treeNode> treeList; 

std::vector<treeNode> symbolList; 

for (int i = 0; i < nOS; i++) { 
    symbolList.push_back(tree[i]); 
} 

std::cout << symbolList.size(); 

}; 
+0

你說得對。它確實有效。在我的程序中還有其他一些問題,但段錯誤在我第一次嘗試推送時發生。讓我進一步調查。 – MCH 2011-05-28 10:57:45

1

沒有必要malloc的結構,如果你只打算按值將它們推到一個列表(而不是指針)。該代碼可以改寫爲這樣的:

struct treeNode { 
    char symbol; 
    double freq; 
    int left; 
    int right; 
}; 

int main() 
{ 
    const int nOS = 16; 

    std::list<treeNode> treeList(nOS, treeNode()); 

    std::cout << treeList.size() << std::endl; 

    return 0; 
} 

雖然,對於一棵樹,你通常有一個指針向左/右節點,所以結構會是這樣的:

struct treeNode { 
    char symbol; 
    double freq; 
    struct treeNode *left; 
    struct treeNode *right; 
}; 
相關問題