2012-03-20 5 views
9

मैं सी सीख रहा हूं और सी में एक लिंक्ड सूची के कच्चे कार्यान्वयन का प्रयास कर रहा हूं। लंबी कहानी लघु में मेरे पास केवल एक शून्य सूचक (तत्व) और अगले नोड के लिए एक अन्य सूचक शामिल है। (कोड का पालन करने के लिए) मेरा प्रश्न है, जब सिर नोड और कुछ अन्य नोड को एक नए समारोह में गुजरते हैं, तो क्या यह सुनिश्चित करने का कोई तरीका है कि दो तत्व एक ही प्रकार के हैं? दो नोड्स किसी भी प्रकार का डेटा पकड़ने में सक्षम होना चाहिए। मैंने आकार() के साथ तुलना करने की कोशिश की, लेकिन एक शून्य सूचक को सम्मानित करने में असमर्थ हूं। अग्रिम में धन्यवाद!क्या दो प्रकार के पॉइंटर्स की तुलना करने के लिए कोई तरीका है सी में उसी प्रकार का दावा करने के लिए?

struct Node{ 
    void* element; 
    struct Node* next; 
} 

यह नोड्स के लिए कोड है, मैं सिर्फ उन्हें ज़ोर के साथ तुलना करने के लिए कोई तरीका होना चाहिए एक ही तत्व प्रकार के सभी के साथ एक लिंक की गई सूची के लिए सुनिश्चित करें! धन्यवाद!

+1

वास्तव में मुझे नोड्स में विभिन्न प्रकारों की अनुमति देने में नुकसान दिखाई नहीं देता है। मुझे वास्तव में इसके उपयोग का उपयोग नहीं दिख रहा है, लेकिन मैं सिर्फ कॉलिंग कोड पर भरोसा करता हूं कि ऐसा कुछ अजीब न करें जब तक वह व्यक्ति इसे लिखने के लिए वास्तव में नहीं चाहता था। – Corbin

+0

आप 'if (a-> element == b-> तत्व) {/ * एक ही प्रकार * /} अन्य {/ * शायद एक ही प्रकार * /}': P –

+1

कर सकते हैं यदि यह एक ही स्थान पर सूचक है याद में? यह बहुत व्यर्थ लगता है। – Corbin

उत्तर

8

नहीं - आप आम तौर पर इस तरह के डिज़ाइन से बचना चाहते हैं, लेकिन यदि आप वास्तव में इससे बच नहीं सकते हैं, तो आपको आम तौर पर नोड में एक enum डालने की आवश्यकता होती है ताकि आपको उस डेटा के प्रकार को बताने के लिए कहा जा सके।

+0

क्या आप डेटा प्रकार के लिए संरचना के अंदर एक enum रखने के बारे में और बता सकते हैं? – vidit

+2

निश्चित रूप से - आप मूल रूप से केवल 'enum प्रकार {T_CHAR, T_SHORT, T_INT, T_LONG, T_FLOAT जैसे कुछ करते हैं , T_DOUBLE}; '(जिन अन्य प्रकार के बारे में आप परवाह करते हैं उनके नाम के साथ) और इसे आपके द्वारा संग्रहीत किए जाने वाले प्रकार के अनुरूप मान सेट करें। बड़ी समस्या इसे विस्तारित करने के साथ है (आपको हर बार 'enum' को संपादित करना होगा स्टोर करने के लिए एक और प्रकार)। इसके साथ-साथ आपको (आमतौर पर) स्विच स्टेटमेंट की आवश्यकता होती है 'स्विच (टाइप) {केस T_CHAR: use_char ((char) x.value); केस T_SHORT: use_short ((लघु) x.value);/* ... * /} ' –

+3

'टाइपेडफ स्ट्रक्चर {एनम टाइप टाइप; int i;} इंटीजर' जैसे कुछ प्रकार के लिए एक बेहतर तरीका हो सकता है, 'प्रत्येक प्रकार के लिए आपको आवश्यकता होगी (जहां' एनम टाइप 'एक विशिष्ट मान परिभाषित करता है प्रत्येक 'संरचना' के लिए) और कच्चे पूर्णांक के बजाय इन प्रकारों का उपयोग करें - लेकिन फिर आप तकनीकी रूप से 'शून्य *' का उपयोग नहीं कर रहे हैं, लेकिन एक 'enum t' ype * 'और आप इसे स्पष्ट भी कर सकते हैं। यदि आप इस दृष्टिकोण को चुनते हैं, तो कुछ मैक्रोज़ (या एक्स-मैक्रोज़) कुछ पुनरावृत्ति को काट सकते हैं यदि आप ऐसे देश में रहते हैं जहां मैक्रोज़ कानूनी हैं। –

1

एक शून्य * ठीक प्रकार का एक कम सूचक है। दूसरे शब्दों में, आपके प्रोग्राम को पता है कि यह सब कुछ है कि यह कुछ करने के लिए एक सूचक है। यह उपयोगी है, लेकिन यह विशेष रूप से (जानबूझकर) वह नहीं है जिसे आप ढूंढ रहे हैं।