2010-05-21 10 views
8

मैं बंदरगाह के लिए अजगर के लिए इस कोड की कोशिश कर रहा गया है, लेकिन वहाँ कुछ मैं काफी सी में समझ में नहीं आता ++ है (मैं सी का एक सा पता है ++ लेकिन यह मेरे से परे है):सी ++ संरचना खुद के भीतर?

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

क्या मैं डॉन यह नहीं पता कि कैसे huffnode_s अपने भीतर हो सकता है, मैंने इसे पहले कभी नहीं देखा है और इसे समझ में नहीं आता है। इसका क्या अर्थ है, और यदि कोई कर सकता है, तो पाइथन बराबर क्या होगा?

+4

यह संरचना है कि यह होता है, कि संरचना की नहीं एक _actual_ वस्तु का एक उद्देश्य के लिए केवल एक सूचक है। सबसे आम उदाहरण जो मैं सोच सकता हूं वह एक लिंक्ड सूची नोड में है जहां प्रत्येक नोड में पिछले और अगले नोड्स के लिए पॉइंटर होता है। – Troubadour

+0

सी ++ टैग जोड़ा गया - संरचना स्वयं एएनएसआई सी है, लेकिन कुछ उत्तर संदर्भ सी ++ हैं। – tomlogic

+0

@ कालूसिंह गाबर: यह एक पेड़ है, सूची नहीं। पाइथन में एक अंतर्निहित पेड़ नहीं है। –

उत्तर

4

इसमें इसकी कोई संरचना नहीं है। यह उस संरचना के लिए एक सूचक है।

स्मृति में struct huffnode_s (32 बिट मशीन) दिखाई देगा:


| ------------------ huffnode_s * शून्य - 4 बाइट्स -------------- |

| ------------------ huffnode_s * एक - 4 बाइट्स ---------------- |

| हस्ताक्षरित चार वैल - 1 बाइट + 3 बाइट पैडिंग ======= |

| ------------------- फ्लोट फ्रीक - 4 बाइट्स --------------------- ---- |


इन आकारों मशीन के लिए मशीन अलग-अलग होगी, और यह कैसे स्मृति में लग रहा है संकलक द्वारा फैसला किया है।

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 

फिर आप इस कक्षा के तरीकों के लिए अपने विभिन्न सी कार्यों को दोबारा कर सकते हैं।

या शायद यह।

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

यदि आप चाहते हैं कि आपके सी कार्य कार्य बने रहें।

यही है।

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

यह सब कुछ आवश्यक है।

+0

@ डैश-टॉम-बैंग: सिंगल चार और "पॉइंटर टू" (यानी स्ट्रिंग) पायथन में संभवतः अप्रासंगिक अंतर है। मूल का अर्थ बाइट (यानी, वास्तविक ASCII चरित्र) या "छोटा पूर्णांक" हो सकता है। समस्या से नहीं बता सकते हैं। पाइथन जैसे देर से बाध्यकारी भाषा के साथ कोई फर्क नहीं पड़ता। –

0

(स्ट्रक्चर हफनोड_एस *) एक सूचक को दूसरी संरचना में घोषित करता है जिसमें उस चर के रूप में समान चर शामिल होते हैं। this question देखें।

0

यह एक हफनोड के अंदर एक हफनोड के लिए एक सूचक है।

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

यह संकलन जाएगा, और यह रूप में लंबे समय के रूप में उन सभी huffnode वंशज वास्तव में आवंटित और सही ढंग से की ओर इशारा कर रहे हैं काम करेंगे: इसका मतलब है कि आप कह सकते हैं है।

पॉइंटर्स जावास्क्रिप्ट में ऑब्जेक्ट संदर्भों की तरह हैं। वे वास्तव में डेटा नहीं रखते हैं, वे सिर्फ इसका उल्लेख करते हैं। बाकी आश्वासन दिया है कि आप एक अनंत प्रकार को नहीं देख रहे हैं।

1

कार्ल के जवाब देने के लिए जोड़ने के लिए, सी ++ में एक ही बात भी संभव है:

class Foo { 
public: 
    Foo() {} 

    Foo *anotherFoo; 
}; 

(नोट से ऊपर वर्ग मूर्खतापूर्ण है, लेकिन बात यदि आप एक वर्ग की है कि अंदर एक सूचक हो सकता है है कक्षा का प्रकार)

0

इसे स्वयं रेफरेंसियल संरचना के रूप में जाना जाता है और यह वही है जो यह लगता है: एक संरचना जिसमें स्वयं का संदर्भ होता है। इसकी एक आम घटना एक संरचना में है जो एक लिंक्ड सूची के लिए नोड का वर्णन करती है। प्रत्येक नोड को श्रृंखला में अगले नोड के संदर्भ की आवश्यकता होती है।

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

लेकिन डगलस द्वारा दिए गए कोड बाइनरी पेड़ की संरचना का प्रदर्शन करते हैं। –

संबंधित मुद्दे