linked list data structure c with illustration
सी ++ में लिंक्ड सूची का एक विस्तृत अध्ययन।
लिंक की गई सूची डेटा आइटम संग्रहीत करने के लिए एक रैखिक गतिशील डेटा संरचना है। हमने मूल C ++ पर अपने पिछले विषयों में पहले से ही सरणियाँ देखी हैं। हम यह भी जानते हैं कि सरणियाँ एक रैखिक डेटा संरचना होती हैं जो डेटा आइटम को सन्निहित स्थानों में संग्रहीत करती हैं।
सरणियों के विपरीत, लिंक की गई सूची सन्निहित स्मृति स्थानों में डेटा आइटम संग्रहीत नहीं करती है।
एक लिंक की गई सूची में 'नोड्स' नामक आइटम होते हैं जिसमें दो भाग होते हैं। पहला भाग वास्तविक डेटा को संग्रहीत करता है और दूसरे भाग में एक पॉइंटर होता है जो अगले नोड को इंगित करता है। इस संरचना को आम तौर पर 'अकेले जुड़ी हुई सूची' कहा जाता है।
=> यहां सर्वश्रेष्ठ C ++ प्रशिक्षण ट्यूटोरियल देखें।
आप क्या सीखेंगे:
सी ++ में सूचीबद्ध सूची
हम इस ट्यूटोरियल में विस्तार से गायन से जुड़ी सूची पर एक नज़र डालेंगे।
निम्नलिखित आरेख एक एकल लिंक की गई सूची की संरचना को दर्शाता है।
जैसा कि ऊपर दिखाया गया है, लिंक की गई सूची के पहले नोड को 'हेड' कहा जाता है, जबकि अंतिम नोड को 'टेल' कहा जाता है। जैसा कि हम देखते हैं, लिंक की गई सूची के अंतिम नोड में इसका अगला सूचक शून्य होगा क्योंकि इसमें कोई मेमोरी एड्रेस नहीं होगा।
चूंकि प्रत्येक नोड में अगले नोड के लिए एक पॉइंटर होता है, इसलिए लिंक की गई सूची में डेटा आइटम को सन्निहित स्थानों पर संग्रहीत नहीं किया जाना चाहिए। स्मृति में नोड्स बिखरे हुए हो सकते हैं। हम किसी भी समय नोड्स का उपयोग कर सकते हैं क्योंकि प्रत्येक नोड में अगले नोड का पता होगा।
हम लिंक किए गए सूची में डेटा आइटम जोड़ सकते हैं और साथ ही आसानी से सूची से आइटम हटा सकते हैं। इस प्रकार लिंक्ड सूची को गतिशील रूप से विकसित या सिकोड़ना संभव है। लिंक की गई सूची में कितने डेटा आइटम हो सकते हैं इसकी कोई ऊपरी सीमा नहीं है। इसलिए जब तक मेमोरी उपलब्ध है, हमारे पास लिंक्ड सूची में जोड़े गए कई डेटा आइटम हो सकते हैं।
आसान प्रविष्टि और विलोपन के अलावा, लिंक की गई सूची में मेमोरी स्पेस भी नहीं होती है क्योंकि हमें पहले से यह निर्दिष्ट नहीं करना चाहिए कि लिंक की गई सूची में हमें कितनी वस्तुओं की आवश्यकता है। लिंक्ड लिस्ट द्वारा लिया गया एकमात्र स्थान पॉइंटर को अगले नोड में स्टोर करने के लिए है जो थोड़ा उपरि जोड़ता है।
आगे, हम उन विभिन्न परिचालनों के बारे में चर्चा करेंगे जो एक लिंक्ड सूची पर किए जा सकते हैं।
संचालन
अन्य डेटा संरचनाओं की तरह, हम लिंक की गई सूची के लिए भी विभिन्न ऑपरेशन कर सकते हैं। लेकिन सरणियों के विपरीत, जिसमें हम सबस्क्रिप्ट का उपयोग करके तत्व को सीधे एक्सेस कर सकते हैं, भले ही वह बीच में कहीं हो, हम लिंक की गई सूची के साथ एक ही यादृच्छिक अभिगम नहीं कर सकते।
किसी भी नोड तक पहुंचने के लिए, हमें शुरू से ही लिंक की गई सूची को पार करना होगा और उसके बाद ही हम वांछित नोड तक पहुंच सकते हैं। इसलिए लिंक्ड लिस्ट से रैंडमली डेटा एक्सेस करना महंगा साबित होता है।
हम नीचे दिए गए लिंक के अनुसार विभिन्न ऑपरेशन कर सकते हैं:
(1) सम्मिलन
लिंक की गई सूची का सम्मिलन संचालन लिंक की गई सूची में एक आइटम जोड़ता है। हालाँकि यह सरल लग सकता है, लेकिन इससे जुड़ी हुई सूची की संरचना को देखते हुए, हम जानते हैं कि जब भी कोई डेटा लिंक की गई सूची में जोड़ा जाता है, तो हमें नई आइटम के पिछले और अगले नोड्स के अगले पॉइंटर्स को बदलना होगा जिन्हें हमने डाला है।
दूसरी बात जिस पर हमें विचार करना है वह वह जगह है जहां नया डेटा आइटम जोड़ा जाना है।
लिंक की गई सूची में तीन स्थान हैं जहां एक डेटा आइटम जोड़ा जा सकता है।
(1) लिंक की गई सूची की शुरुआत में
एक लिंक की गई सूची को नीचे 2-> 4-> 6-> 8-> 10 से दिखाया गया है। यदि हम सूची के पहले नोड के रूप में एक नया नोड 1 जोड़ना चाहते हैं, तो नोड 2 की ओर इशारा करने वाला सिर अब 1 को इंगित करेगा और नोड 1 के अगले पॉइंटर में नोड 2 का मेमोरी पता होगा जैसा कि नीचे दिखाया गया है। आंकड़ा।
इस प्रकार नई लिंक की गई सूची 1-> 2-> 4-> 6-> 8-> 10 हो जाती है।
# 2) दिए गए नोड के बाद
यहां, एक नोड दिया गया है और हमें दिए गए नोड के बाद एक नया नोड जोड़ना होगा। नीचे से जुड़ी सूची में a-> b-> c-> d -> ई, अगर हम नोड c के बाद n नोड जोड़ना चाहते हैं तो लिंक की गई सूची निम्नानुसार दिखाई देगी:
इस प्रकार उपरोक्त आरेख में, हम जांचते हैं कि क्या दिए गए नोड मौजूद हैं। यदि यह मौजूद है, तो हम एक नया नोड f बनाते हैं। फिर हम नोड नोड के अगले पॉइंटर को न्यू नोड f की ओर इंगित करते हैं। नोड f का अगला पॉइंटर अब नोड d को इंगित करता है।
# 3) लिंक्ड सूची के अंत में
तीसरे मामले में, हम लिंक की गई सूची के अंत में एक नया नोड जोड़ते हैं। गौर कीजिए कि हमारे पास एक ही लिंक्ड सूची है-> बी-> सी-> डी-> ई और हमें सूची के अंत में एक नोड एफ जोड़ने की आवश्यकता है। नोड को जोड़ने के बाद लिंक की गई सूची नीचे दिखाई जाएगी।
इस प्रकार हम एक नया नोड f बनाते हैं। फिर n को इंगित करने वाले टेल पॉइंटर को f से इंगित किया जाता है और नोड f के अगले पॉइंटर को इंगित किया जाता है। हमने नीचे दिए गए C ++ प्रोग्राम में सभी तीन प्रकार के इन्सर्ट फंक्शंस लागू किए हैं।
C ++ में, हम एक संरचना के रूप में या एक वर्ग के रूप में एक लिंक की गई सूची की घोषणा कर सकते हैं। लिंक की गई सूची को संरचना के रूप में घोषित करना पारंपरिक सी-शैली घोषणा है। क्लास के रूप में एक लिंक्ड सूची का उपयोग आधुनिक C ++ में किया जाता है, ज्यादातर मानक टेम्पलेट लाइब्रेरी का उपयोग करते समय।
निम्नलिखित कार्यक्रम में, हमने संरचना का उपयोग एक घोषित सूची बनाने और घोषित करने के लिए किया है। इसके सदस्यों के रूप में अगले तत्व के पास डेटा और पॉइंटर होगा।
#include using namespace std; // A linked list node struct Node { int data; struct Node *next; }; //insert a new node in front of the list void push(struct Node** head, int node_data) { /* 1. create and allocate node */ struct Node* newNode = new Node; /* 2. assign data to node */ newNode->data = node_data; /* 3. set next of new node as head */ newNode->next = (*head); /* 4. move the head to point to the new node */ (*head) = newNode; } //insert new node after a given node void insertAfter(struct Node* prev_node, int node_data) { /*1. check if the given prev_node is NULL */ if (prev_node == NULL) { coutnext = prev_node->next; /* 5. move the next of prev_node as new_node */ prev_node->next = newNode; } /* insert new node at the end of the linked list */ void append(struct Node** head, int node_data) { /* 1. create and allocate node */ struct Node* newNode = new Node; struct Node *last = *head; /* used in step 5*/ /* 2. assign data to the node */ newNode->data = node_data; /* 3. set next pointer of new node to null as its the last node*/ newNode->next = NULL; /* 4. if list is empty, new node becomes first node */ if (*head == NULL) { *head = newNode; return; } /* 5. Else traverse till the last node */ while (last->next != NULL) last = last->next; /* 6. Change the next of last node */ last->next = newNode; return; } // display linked list contents void displayList(struct Node *node) { //traverse the list to display each node while (node != NULL) { coutnext; } if(node== NULL) cout आउटपुट:
सबसे अच्छा एमपी 3 संगीत डाउनलोडर अनुप्रयोग
अंतिम लिंक की गई सूची:
३०-> २०-> ५०-> १०-> ४०-> अशक्त
अगला, हम जावा में लिंक किए गए सूची सम्मिलित ऑपरेशन को लागू करते हैं। जावा भाषा में, लिंक्ड सूची को एक वर्ग के रूप में लागू किया जाता है। नीचे दिए गए कार्यक्रम सी ++ प्रोग्राम के तर्क में समान हैं, केवल अंतर यह है कि हम लिंक की गई सूची के लिए एक वर्ग का उपयोग करते हैं।
class LinkedList { Node head; // head of list //linked list node declaration class Node { int data; Node next; Node(int d) {data = d; next = null; } } /* Insert a new node at the front of the list */ public void push(int new_data) { //allocate and assign data to the node Node newNode = new Node(new_data); //new node becomes head of linked list newNode.next = head; //head points to new node head = newNode; } // Given a node,prev_node insert node after prev_node public void insertAfter(Node prev_node, int new_data) { //check if prev_node is null. if (prev_node == null) { System.out.println('The given node is required and cannot be null'); return; } //allocate node and assign data to it Node newNode = new Node(new_data); //next of new Node is next of prev_node newNode.next = prev_node.next; //prev_node->next is the new node. prev_node.next = newNode; } //inserts a new node at the end of the list public void append(intnew_data) { //allocate the node and assign data Node newNode = new Node(new_data); //if linked list is empty, then new node will be the head if (head == null) { head = new Node(new_data); return; } //set next of new node to null as this is the last node newNode.next = null; // if not the head node traverse the list and add it to the last Node last = head; while (last.next != null) last = last.next; //next of last becomes new node last.next = newNode; return; } //display contents of linked list public void displayList() { Node pnode = head; while (pnode != null) { System.out.print(pnode.data+'-->'); pnode = pnode.next; } if(pnode == null) System.out.print('null'); } } //Main class to call linked list class functions and construct a linked list class Main{ public static void main(String() args) { /* create an empty list */ LinkedList lList = new LinkedList(); // Insert 40. lList.append(40); // Insert 20 at the beginning. lList.push(20); // Insert 10 at the beginning. lList.push(10); // Insert 50 at the end. lList.append(50); // Insert 30, after 20. lList.insertAfter(lList.head.next, 30); System.out.println('
Final linked list: '); lList. displayList (); } }
आउटपुट:
अंतिम लिंक की गई सूची:
१०-> २०-> ३०-> ४०-> ५०-> अशक्त
उपरोक्त दोनों कार्यक्रम में, C ++ और साथ ही जावा में, हमारे पास सूची के सामने, सूची के अंत में और नोड में दी गई सूचियों के बीच एक नोड जोड़ने के लिए अलग-अलग फ़ंक्शन हैं। अंत में, हम सभी तीन विधियों का उपयोग करके बनाई गई सूची की सामग्री को प्रिंट करते हैं।
# 2) विलोपन
सम्मिलन की तरह, एक लिंक्ड सूची से नोड को हटाने के लिए विभिन्न स्थान शामिल हैं जहां से नोड को हटाया जा सकता है। हम लिंक किए गए सूची से पहले नोड, अंतिम नोड या एक यादृच्छिक kth नोड को हटा सकते हैं। हटाए जाने के बाद, हमें अगली सूची और अन्य संकेतकों को लिंक की गई सूची में उचित रूप से समायोजित करने की आवश्यकता है ताकि लिंक की गई सूची को सुरक्षित रखा जा सके।
निम्नलिखित C ++ कार्यान्वयन में, हमने विलोपन के दो तरीके दिए हैं अर्थात् सूची में पहला नोड हटाना और अंतिम नोड को सूची में हटाना। हम पहले सिर पर नोड्स जोड़कर एक सूची बनाते हैं। फिर हम प्रविष्टि और प्रत्येक विलोपन के बाद सूची की सामग्री प्रदर्शित करते हैं।
#include using namespace std; /* Link list node */ struct Node { int data; struct Node* next; }; //delete first node in the linked list Node* deleteFirstNode(struct Node* head) { if (head == NULL) return NULL; // Move the head pointer to the next node Node* tempNode = head; head = head->next; delete tempNode; return head; } //delete last node from linked list Node* removeLastNode(struct Node* head) { if (head == NULL) return NULL; if (head->next == NULL) { delete head; return NULL; } // first find second last node Node* second_last = head; while (second_last->next->next != NULL) second_last = second_last->next; // Delete the last node delete (second_last->next); // set next of second_last to null second_last->next = NULL; return head; } // create linked list by adding nodes at head void push(struct Node** head, int new_data) { struct Node* newNode = new Node; newNode->data = new_data; newNode->next = (*head); (*head) = newNode; } // main function int main() { /* Start with the empty list */ Node* head = NULL; // create linked list push(&head, 2); push(&head, 4); push(&head, 6); push(&head, 8); push(&head, 10); Node* temp; cout<<'Linked list created ' आउटपुट:
लिंक की गई सूची बनाई गई
10–> 8–> 6–> 4–> 2–
> नल
सिर के नोड को हटाने के बाद लिंक की गई सूची
8–> 6–> 4–> 2–
> नल
अंतिम नोड को हटाने के बाद लिंक की गई सूची
8–> 6–> 4–> नल
अगला लिंक सूची से नोड्स को हटाने के लिए जावा कार्यान्वयन है। कार्यान्वयन तर्क सी ++ प्रोग्राम में उपयोग किए जाने के समान है। अंतर केवल इतना है कि लिंक की गई सूची को कक्षा के रूप में घोषित किया गया है।
class Main { // Linked list node / static class Node { int data; Node next; }; // delete first node of linked list static Node deleteFirstNode(Node head) { if (head == null) return null; // Move the head pointer to the next node Node temp = head; head = head.next; return head; } // Delete the last node in linked list static Node deleteLastNode(Node head) { if (head == null) return null; if (head.next == null) { return null; } // search for second last node Node second_last = head; while (second_last.next.next != null) second_last = second_last.next; // set next of second last to null second_last.next = null; return head; } // Add nodes to the head and create linked list static Node push(Node head, int new_data) { Node newNode = new Node(); newNode.data = new_data; newNode.next = (head); (head) = newNode; return head; } //main function public static void main(String args()) { // Start with the empty list / Node head = null; //create linked list head = push(head, 1); head = push(head, 3); head = push(head, 5); head = push(head, 7); head = push(head, 9); Node temp; System.out.println('Linked list created :'); for (temp = head; temp != null; temp = temp.next) System.out.print(temp.data + '-->'); if(temp == null) System.out.println('null'); head = deleteFirstNode(head); System.out.println('Linked list after deleting head node :'); for (temp = head; temp != null; temp = temp.next) System.out.print(temp.data + '-->'); if(temp == null) System.out.println('null'); head = deleteLastNode(head); System.out.println('Linked list after deleting last node :'); for (temp = head; temp != null; temp = temp.next) System.out.print(temp.data + '-->'); if(temp == null) System.out.println('null'); } }
आउटपुट:
लिंक की गई सूची बनाई गई:
9–> 7–> 5–> 3–> 1–
> अशक्त
सिर के नोड को हटाने के बाद लिंक की गई सूची:
7–> 5–> 3–> 1–
> अशक्त
अंतिम नोड को हटाने के बाद लिंक की गई सूची:
-> ५-> ३-> अशक्त
नोड्स की संख्या की गणना करें
लिंक की गई संख्या को ट्रेस करते समय नोड्स की संख्या की गणना करने के लिए ऑपरेशन किया जा सकता है। हम पहले ही ऊपर के कार्यान्वयन में देख चुके हैं कि जब भी हमें लिंक्ड लिस्ट के नोड या प्रदर्शन सामग्री को सम्मिलित / हटाने की आवश्यकता होती है, तो हमें शुरू से ही लिस्ट को लिंक करना होगा।
एक काउंटर रखने और इसे बढ़ाने के रूप में हम प्रत्येक नोड को पार करते हैं, हमें लिंक की गई सूची में मौजूद नोड्स की संख्या की गिनती देगा। हम पाठकों के लिए इस कार्यक्रम को लागू करने के लिए छोड़ देंगे।
Arrays और लिंक्ड सूची
लिंक किए गए सूची के संचालन और कार्यान्वयन को देखने के बाद, आइए हम तुलना करें कि एक दूसरे की तुलना में सरणियों और लिंक किए गए सूची निष्पक्ष कैसे हैं।
सरणियों लिंक की गई सूची एरे का आकार निश्चित है लिंक की गई सूची का आकार गतिशील है नए तत्व की प्रविष्टि महंगी है सम्मिलन / विलोपन आसान है रैंडम एक्सेस की अनुमति है रैंडम एक्सेस संभव नहीं तत्व सन्निहित स्थान पर हैं तत्वों में गैर-सन्निहित स्थान होता है अगले पॉइंटर के लिए कोई अतिरिक्त स्थान की आवश्यकता नहीं है अगले पॉइंटर के लिए आवश्यक अतिरिक्त मेमोरी स्पेस
अनुप्रयोग
चूंकि सरणियाँ और लिंक्ड सूची दोनों का उपयोग वस्तुओं को संग्रहीत करने के लिए किया जाता है और रैखिक डेटा संरचनाएं हैं, इन दोनों संरचनाओं का उपयोग अधिकांश अनुप्रयोगों के लिए समान तरीकों से किया जा सकता है।
लिंक की गई सूचियों के कुछ आवेदन इस प्रकार हैं:
- स्टैक और कतारों को लागू करने के लिए एक लिंक की गई सूची का उपयोग किया जा सकता है।
- जब भी हमें ग्राफ़ को आसन्न सूचियों के रूप में प्रदर्शित करना होता है, तो ग्राफ़ को कार्यान्वित करने के लिए लिंक की गई सूची का उपयोग किया जा सकता है।
- एक गणितीय बहुपद को एक जुड़ी हुई सूची के रूप में संग्रहीत किया जा सकता है।
- हैशिंग तकनीक के मामले में, हैशिंग में उपयोग की जाने वाली बाल्टियों को लिंक्ड सूचियों का उपयोग करके कार्यान्वित किया जाता है।
- जब भी किसी कार्यक्रम को स्मृति के गतिशील आवंटन की आवश्यकता होती है, तो हम एक लिंक की गई सूची का उपयोग कर सकते हैं क्योंकि इस मामले में लिंक की गई सूचियां अधिक कुशलता से काम करती हैं।
निष्कर्ष
लिंक्ड लिस्ट डेटा संरचनाएं हैं जिनका उपयोग डेटा आइटम को एक रैखिक फैशन लेकिन गैर-अनजान स्थानों में संग्रहीत करने के लिए किया जाता है। एक लिंक की गई सूची नोड्स का एक संग्रह है जिसमें एक डेटा भाग और एक अगला पॉइंटर होता है जिसमें सूची में अगले तत्व का मेमोरी पता होता है।
सूची में अंतिम तत्व का अगला सूचक NULL पर सेट है, जिससे सूची के अंत का संकेत मिलता है। सूची के पहले तत्व को हेड कहा जाता है। लिंक की गई सूची विभिन्न ऑपरेशनों जैसे सम्मिलन, विलोपन, ट्रैवर्सल आदि का समर्थन करती है, डायनामिक मेमोरी आवंटन के मामले में, लिंक किए गए सूचियों को सरणियों पर पसंद किया जाता है।
लिंक की गई सूची महंगी है जहाँ तक उनके ट्रैवर्सल का संबंध है क्योंकि हम एरे जैसे तत्वों को बेतरतीब ढंग से एक्सेस नहीं कर सकते हैं। हालांकि, सरणियों की तुलना में सम्मिलन-विलोपन ऑपरेशन कम महंगे हैं।
हमने इस ट्यूटोरियल में रैखिक लिंक्ड सूची के बारे में सीखा है। लिंक की गई सूचियाँ गोलाकार या दोहरी भी हो सकती हैं। हम अपने आगामी ट्यूटोरियल में इन सूचियों पर गहराई से विचार करेंगे।
=> पूर्ण सी ++ प्रशिक्षण श्रृंखला के लिए यहां देखें।
अनुशंसित पाठ
- चित्रण के साथ C ++ में परिपत्र लिंक्ड सूची डेटा संरचना
- संदेह के साथ सी ++ में संदिग्ध रूप से सूचीबद्ध डेटा संरचना
- कतार डेटा संरचना चित्रण के साथ C ++ में
- चित्रण के साथ C ++ में स्टैक डेटा संरचना
- चित्रण के साथ C ++ में प्राथमिकता कतार डेटा संरचना
- शीर्ष 15 सर्वश्रेष्ठ मुफ्त डेटा खनन उपकरण: सबसे व्यापक सूची
- 2021 में 15 सर्वश्रेष्ठ ईटीएल उपकरण (पूरी अपडेट सूची)
- C ++ में डेटा स्ट्रक्चर्स का परिचय