2010-05-21 20 views
8

我一直在試圖端口此代碼Python,但有件事我不太用C明白++(我知道一點的C++,但是這超出了我的):C++本身的結構?

typedef struct huffnode_s 
{ 
    struct huffnode_s *zero; 
    struct huffnode_s *one; 
    unsigned char val; 
    float freq; 
} huffnode_t; 

什麼我不不會得到的是,huffnode_s如何能夠在自己內部,我以前從未見過,也不太瞭解它。這是什麼意思,如果有人可以,那麼python會是什麼?

+4

它只是一個指向它包含的結構對象的指針,而不是該結構的_actual_對象。我能想到的最常見的例子是鏈接列表節點,其中每個節點都有一個指向前一個節點和下一個節點的指針。 – Troubadour 2010-05-21 20:56:37

+0

添加了C++標記 - 結構本身是ANSI C,但其中一些答案引用了C++。 – tomlogic 2010-05-21 21:49:12

+0

@KaluSingh Gabbar:這是一棵樹,而不是一個列表。 Python沒有內置樹。 – 2010-05-22 10:56:48

回答

4

它本身沒有結構。它有一個指向該結構的指針。

在存儲器結構huffnode_s將如下所示(32位機):


| ------------------ huffnode_s *零 - 4字節-------------- |

| ------------------ huffnode_s * one - 4 bytes ---------------- |

| unsigned char val - 1個字節+ 3個字節的填充======= |

| ------------------- float freq - 4 bytes --------------------- ---- |


這些尺寸會改變機器對機器,以及它在內存中的外觀是由編譯器決定的。

19

huffnode_s不在其內部,只有指針huffnode_s在那裏。由於指針已知大小,所以沒有問題。

0

正如其他人所指出的,對自身的引用僅僅是指向該結構的其他實例的指針。

結構內的指針允許將實例作爲鏈接列表連接在一起。

11

這個。

class Huffnode(object): 
    def __init__(self, zero, one, val, freq): 
     """zero and one are Huffnode's, val is a 'char' and freq is a float.""" 
     self.zero = zero 
     self.one = one 
     self.val = val 
     self.freq = freq 

然後,你可以重構你的各種C函數來成爲這個類的方法。

或者也許這樣。

from collections import namedtuple 
Huffnode = namedtuple('Huffnode', [ 'zero', 'one', 'val', 'freq' ]) 

如果你想讓你的C函數保持功能。

就是這樣。

h0 = Huffnode(None, None, 'x', 0.0) 
h1 = Huffnode(None, None, 'y', 1.0) 
h2 = Huffnode(h0, h1, 'z', 2.0) 

以上就是這些要求。

+0

@ dash-tom-bang:單個字符和「指向」(即字符串)在Python中可能是無關緊要的。原文可能意味着字節(即實際的ASCII字符)或「小整數」。無法從問題中分辨出來。對於像Python這樣的後期綁定語言來說並不重要。 – 2010-05-22 10:54:30

0

(struct huffnode_s *)聲明一個指向另一個結構的指針,該結構包含與聲明的結構相同的變量。請參閱this question

0

這是一個指向huffnode內的huffnode的指針。這意味着,你可以說:

huffnode_t *node = ...; 
huffnode_t *greatgreatgreatgrandchild = node->zero->zero->zero->zero->zero; 

這將編譯,只要所有這些huffnode後代是分配,並指出正確它將工作。

指針非常像JavaScript中的對象引用。它們實際上並不包含數據,只是指它。放心,你沒有看到無限的類型。

1

要添加到卡爾的回答,在C++中同樣的事情也可能:

class Foo { 
public: 
    Foo() {} 

    Foo *anotherFoo; 
}; 

(注意上面的類是愚蠢的,但問題是,你可以有一個類,它是內部的指針類型)

0

這被稱爲自引用結構,它正是它聽起來像:一個包含對自身的引用的結構。這種情況經常出現在描述鏈接列表節點的結構中。每個節點需要對鏈中下一個節點的引用。

struct linked_list_node { 
    int data; 
    struct linked_list_node *next; // <- self reference 
}; 
+0

但道格拉斯給出的代碼演示了二叉樹的結構。 – 2010-05-23 03:54:14