मैं FreeBSD से sys/queue.h
का अध्ययन कर रहा हूँ और मैं एक सवाल है: इस प्रकारsys/queue.h में दोगुनी लिंक की गई सूची पिछले अगले तत्व का पता क्यों बनाए रखती है?
sys/queue.h
में, LIST_ENTRY
परिभाषित किया गया है:
#define LIST_ENTRY(type) \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}
ऐसा क्यों है पिछले अगले तत्व का पता बनाए रखने करता है (struct type **le_prev
) पिछले elment की तरह struct type *le_prev
की बजाय?
क्या आपका मतलब है कि यह कार्यान्वयन पिछड़ा ट्रैवर्सल को रोकने के साथ-साथ ओ (1) सम्मिलन और हटाना भी है? –
@YanzheChen (रैखिक) सूची संचालन की जटिलता तब नहीं बदलेगी जब आप एक पॉइंटर का उपयोग करते हैं और डबल पॉइंटर पिछड़ा ट्रैवर्सल को रोकता नहीं है। मुझे लगता है, महत्वपूर्ण हिस्सा "या आगे पॉइंटर्स की एक सरणी" है; जब ऐसी (हैश) तालिका होती है, तो पिछली पॉइंटर का पता संग्रहीत होने पर हटाने को सस्ता होता है। – ensc
@ensc मैंने इसे पढ़ा [पोस्ट] (http://stackoverflow.com/questions/9362896/deleting-any-node-from-a-single-linked-list-when-only-pointer-to-that-node- is-gi) और समझते हैं कि सिंगल-लिंक्ड सूची में हटाना ओ (1) में प्राप्त किया जा सकता है यदि यह पूंछ नोड नहीं है। लेकिन क्यों डबल पॉइंटर ** ** ** पिछड़ा ट्रैवर्सल क्यों रोकता है? पिछड़ा ट्रैवर्सल कैसे करें? और मैं समझ नहीं पा रहा हूं ** महत्वपूर्ण भाग ** आपने या तो उल्लेख किया है। क्या आप इसे अधिक जानकारी में समझा सकते हैं? –