ऊपर उल्लेख किया है, मैं इस सूची में गड़बड़ी कार्यों बनाने के लिए मैक्रो दृष्टिकोण का उपयोग करने की कोशिश की। आईएनएसईआरटी ऑपरेशन दिनचर्या बनाना आसान है लेकिन डिलीट और ट्रैवर्स ऑपरेशंस बनाना मुश्किल है। यह सूची संरचना और सम्मिलित दिनचर्या हस्ताक्षर के बाद:
#define LIST_DEFINE(type) \
struct list_node_##type \
{ \
type *data; \`
struct list_node_##type *next; \
};
LIST_INSERT(&ListHead,&Data, DataType);
कहाँ:
ListHead
- डेटा जिसके लिए एक नए नोड बनाया जाएगा और डेटा नोड में डाला जाता है - लिंक्ड सूची
Data
के प्रमुख DataType
- डेटा का डेटा प्रकार
FYI, मैं फ़ंक्शन में स्मृति आवंटित कर रहा हूं और नव निर्मित नोड में पारित सभी डेटा की प्रतिलिपि बना रहा हूं और उन्हें नोड को लिंक की गई सूची में जोड़ना है।
अब, जब LIST_DELETE
दिनचर्या बनाई जाती है, तो नोड को हटाया जाना चाहिए डेटा के भीतर एक अद्वितीय पहचानकर्ता का उपयोग करके पहचाना जाएगा। यह पहचानकर्ता MACRO
दिनचर्या में कुंजी के रूप में भी पास किया जाता है जिसे MACRO
विस्तार में बदल दिया जाएगा। दिनचर्या हस्ताक्षर हो सकता है:
LIST_DELETE(&ListHead, DataType, myvar->data->str, char*);
कहाँ:
ListHead
- लिंक्ड सूची
DataType
के प्रमुख - डेटा के डेटा प्रकार है
myvar->data->str
- अद्वितीय कुंजी
char*
- कुंजी प्रकार
अब, जब कुंजी का विस्तार किया जाता है, तो उसी कुंजी को तुलना के लिए उपयोग नहीं किया जा सकता है जैसे कि हम
0 लिखते हैं
यह
ListHead->data->myvar->data->str == myvar->data->str
के लिए विस्तारित और यहाँ वहाँ की तरह कोई चर रहा है: ListHead->data->myvar->data->str
तो, यह दृष्टिकोण दिनचर्या को नष्ट लिखने के लिए काम नहीं कर सकता और, एक ही रूप में ट्रावर्सल और खोज दिनचर्या भी अद्वितीय कुंजी का उपयोग करें उनमें भी समस्या का सामना किया जाएगा।
और, एक असंबंधित नोट पर, अद्वितीय कुंजी के लिए मिलान तर्क निर्धारित करने के लिए, क्योंकि अद्वितीय कुंजी कुछ भी हो सकती है।