2011-08-23 11 views
6

struct इस तरह की लिंक्ड सूची के प्रमुख के रूप में इस्तेमाल किया जाता है:नामित प्रारंभकर्ता का उपयोग करते समय, 'इस' संरचना में पॉइंटर प्राप्त करना संभव है?

struct lista 
{ 
    struct lista* next; 
    struct lista* prev; 
}; 

जब अगले और दोनों अंक पीछे ही struct करने के लिए है, तो सूची खाली है। ,

struct lista my_list = LISTA_INIT_EMPTY(&my_list); 

लेकिन वहाँ निम्नलिखित तरीके से एक ही बात करने के लिए कोई रास्ता नहीं है, मैक्रो पैरामीटर के बिना ?:

:

#define LISTA_INIT_EMPTY(list) { .next = (list), .prev = (list) } 

इस तरह से: निम्नलिखित मैक्रो संरचना आरंभ के लिए इस्तेमाल किया जा सकता

struct lista my_list = LISTA_INIT_EMPTY; 

मैं निम्नलिखित की कोशिश की है, लेकिन यह एक संकलन त्रुटि के कारण:

#define LISTA_INIT_EMPTY  { .next = &.next, .prev = &.next } 

उत्तर

6

ठीक है, एक ही रास्ता मैं देख रहा हूँ अप्रिय है:

#define LISTA_INIT_EMPTY  { .next = (&my_list), .prev = (&my_list) } 

बिल्कुल के रूप में नहीं अच्छा केवल तभी काम करता है जब आपके चर को my_list कहा जाता है। और this में कोई अच्छा तरीका नहीं है सी

क्यों "इस" को इंगित करने के बजाय NULL का उपयोग नहीं कर रहा है? यदि यह संतोषजनक नहीं है, तो पैरामीटरयुक्त मैक्रो को रखना शायद सबसे अच्छा है।

संपादित करें:

के रूप में वहाँ कोई "इस" और केवल वेरिएबल का नाम एक बार प्रवेश करने के लिए, मैं इस तरह के एक मैक्रो उपयोग करने का सुझाव: (आर की टिप्पणी के लिए धन्यवाद नीचे, मैं अंत में की जरूरत समझ में आ):

#define CREATE_EMPTY_LISTA(name) struct lista name = { .next=&name, .prev=&name } 

और बाद में कोड में:

CREATE_EMPTY_LISTA(my_list); // creates and initializez my_list at the same time 
+2

मैं ओपी सभी सूचियों चाहता है, गोलाकार होने के लिए प्रारंभिक खाली एक सहित। यह पूरी तरह से अनुचित नहीं है; अक्सर यह आपकी सूची हैंडलिंग कार्यों में सभी बदसूरत कोने के मामलों को समाप्त करता है। –

+1

'CREATE_EMPTY_LISTA' मूल रूप से ओपी द्वारा उल्लिखित' LISTA_INIT_EMPTY' जैसा ही है। –

+1

हां, लेकिन एक महत्वपूर्ण अंतर के साथ: 'struct lista my_list = LISTA_INIT_EMPTY (& my_list);' आपको चर के नाम को दोहराने के लिए मजबूर करता है, जो अच्छा नहीं है और काफी त्रुटि प्रवण है। 'CREATE_EMPTY_LISTA (my_list); 'आपको इसे दोहराने की अनुमति नहीं देता है। बेशक – Shlublu

0

वास्तव में नहीं! आप के बजाय शून्य के रूप में खाली निर्धारित करते हैं "खुद" तो आप इसके द्वारा कर सकता है:

#define LISTA_INIT_EMPTY {NULL,NULL}

0

जाहिर है इस के बाद से ब्लॉक उदाहरण के लिए ज़रूरी है संभव नहीं है,।

.next = &.next काम नहीं करते हैं क्योंकि प्रकार मेल नहीं खाते हैं। (struct lista*struct lista** करने के लिए)

0

नहीं, आपकी प्रारंभकर्ता एक struct lista बनाता है और फिर इसे करने के लिए my_list प्रदान करती है। this का आपका विचार इस संदर्भ में समझ में नहीं आता है, यह my_list को असाइन किए जाने के बाद इंगित नहीं करेगा।

2

ध्यान दें कि आपकी सूची प्रारंभिक तकनीक समान है जो लिनक्स कर्नेल स्रोत में उनकी लिंक्ड सूचियों (include/linux/list.h) के लिए उपयोग की जाती है।

एक सूची जब सूची सिर घोषित किया जाता है के प्रारंभ के लिए, की तरह कुछ करने के लिए कोशिश कर के बजाय:

// won't work: 
struct lista my_list = /* something or other */; 

लिनक्स एक मैक्रो है कि दोनों delcaration और प्रारंभ करता है का उपयोग करता है (ताकि उपयोगकर्ता अभी भी करने के लिए है केवल एक बार नाम का उपयोग करें)। अपने struct lista के लिए यह लग सकता है जैसे:

#define LISTA_HEAD struct lista name = LISTA_INIT_EMPTY(name) 

// this is all the user needs to do to both declare and initialize a list: 
LISTA_HEAD(my_list); 

सभी विवरण के लिए include/linux/list.h पर एक नजर डालें। वहाँ भी नहीं है (यह सभी सहज है) कैसे सूचियों संचालन काम का अच्छा कारण हो सकते हैं:

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

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