C भाषा मा सूची संरचनाको अनुप्रयोग: कार्यान्वयनदेखि प्रयोगसम्म

目次

1. परिचय

C भाषा प्रणाली प्रोग्रामिङ र एम्बेडेड प्रणाली विकासमा व्यापक रूपमा प्रयोग हुने प्रोग्रामिङ भाषा हो। त्यसमा, “सूची संरचना” डेटा व्यवस्थापन र सञ्चालनको लागि अत्यन्त उपयोगी उपकरणको रूपमा प्रयोग गरिन्छ। यस लेखमा, C भाषामा सूची संरचना बारे, आधारभूत अवधारणा देखि विशिष्ट कार्यान्वयन उदाहरणसम्म विस्तृत रूपमा व्याख्या गरिनेछ।

सूची संरचनाको महत्त्व

सूची संरचना डेटा क्रमलाई कायम राख्दै व्यवस्थापन गर्नको लागि डेटा संरचना हो। विशेष गरी तलका परिस्थितिहरूमा उपयोगी हुन्छ।

  • क्रमबद्ध डेटा व्यवस्थापन
  • डायनामिक डेटा थप वा हटाउन आवश्यक परेमा
  • स्मृति (मेमोरी) को प्रभावकारी उपयोग

उदाहरणका लागि, टास्क व्यवस्थापन अनुप्रयोगमा, टास्कको थप र हटाउने कार्य बारम्बार गरिनु भएकाले, एरेको तुलनामा लचिलो सूची संरचना उपयुक्त हुन्छ।

यस लेखको उद्देश्य

यस लेखमा, C भाषामा सूची संरचना कार्यान्वयन गरी, विशिष्ट कोड उदाहरणसँगै त्यसको सञ्चालन विधि प्रस्तुत गरिनेछ। अन्ततः पाठकले सूची संरचनाको आधारभूत अवधारणा र व्यावहारिक प्रयोग बुझ्नेछन्, र आफ्नो प्रोग्राममा लागू गर्न सक्षम हुनेछन्।

शिक्षण लक्ष्य

  1. सूची संरचनाको मूलभूत बुझ्न।
  2. C भाषामा लिंक्ड लिस्टको कार्यान्वयन विधि सिक्न।
  3. व्यावहारिक कोड उदाहरणलाई सन्दर्भ गर्दै, अनुप्रयोग क्षमता हासिल गर्न।

2. सूची संरचना के हो

सूची संरचना डेटा क्रमबद्ध रूपमा व्यवस्थापन गर्नको लागि डेटा संरचनाको एक प्रकार हो। यहाँ, सूची संरचनाको मूल अवधारणा र प्रकारहरू बारे व्याख्या गरिन्छ।

सूची संरचनाको मूल अवधारणा

सूची संरचना डेटा तत्वहरू (नोड) लाई श्रृंखलाबद्ध रूपमा जडान गरी व्यवस्थापन गरिन्छ। प्रत्येक नोडले तलका दुई जानकारीहरू राख्छ।

  1. डेटा भाग: वास्तविक मानलाई राख्ने भाग हो।
  2. लिंक भाग: अर्को नोडको सन्दर्भ (पॉइन्टर) राख्छ।

यस प्रणालीले डेटा थप्ने र हटाउने कार्यलाई गतिशील रूपमा गर्न सकिन्छ, जसले परिवर्तनशील लम्बाइको डेटा ह्यान्डल गर्दा उपयोगी हुन्छ।

एरे र सूचीको भिन्नता

सूची संरचना र एरे डेटा व्यवस्थापन गर्ने तरिकामा तलका बुँदाहरूमा भिन्नता छन्।

विषयएरेसूची संरचना
आकारस्थिर(घोषणाको समयमा निर्धारण)परिवर्तनीय(गतिशील रूपमा आकार परिवर्तन गर्न सकिन्छ)
डेटा पहुँचइन्डेक्स द्वारा प्रत्यक्ष पहुँचशुरुबाट क्रमिक खोज आवश्यक
मेमोरी व्यवस्थापनलगातार मेमोरी क्षेत्र प्रयोगविखरिएको मेमोरी क्षेत्र प्रयोग
डेटा थप/हटाउनेउच्च लागत(तत्वको स्थानान्तरण आवश्यक)न्यून लागत(पॉइन्टरको परिवर्तन मात्र)

यसरी, सूची संरचना लचिलोको आवश्यकता भएको अवस्थामा उपयुक्त हुन्छ, जबकि एरे उच्च गति डेटा पहुँच आवश्यक पर्ने परिस्थितिमा उपयुक्त हुन्छ।

जडित सूचीको सारांश र विशेषताहरू

सूची संरचनाको प्रतिनिधि उदाहरणको रूपमा “जडित सूची” छ। जडित सूचीले तलका विशेषताहरू राख्छ।

  1. गतिशील आकार परिवर्तन-सम्भव
    आवश्यकतानुसार नोड थप्न/हटाउन सकिन्छ, जसले प्रभावकारी मेमोरी व्यवस्थापन सम्भव बनाउँछ।
  2. नोडको सम्मिलन/हटाउने सरल
    पॉइन्टरको परिवर्तनद्वारा तत्वलाई सञ्चालन गर्न सकिन्छ, जसले सूचीको मध्य वा अन्त्यमा सम्मिलन/हटाउने पनि सजिलो बनाउँछ।
  3. खोजमा समय लाग्छ
    डेटा पहुँच सुरुबाट क्रमिक रूपमा गरिन्छ, त्यसैले विशेष तत्व खोज्न तुलनात्मक रूपमा समय लाग्छ।

जडित सूचीका प्रकारहरू

जडित सूचीमा तलका ३ प्रकारहरू छन्।

  1. एकतर्फी सूची
    प्रत्येक नोडले केवल अर्को नोडलाई संकेत गर्ने संरचना हो।
  • मेमोरी खपत कम र सरल संरचना।
  • पछाडि सर्न सम्भव छ, तर अगाडि सर्न सकिँदैन।
  1. द्विदिश सूची
    प्रत्येक नोडले अगाडि र पछाडि दुवै नोडलाई संकेत गर्ने संरचना हो।
  • अगाडि-पछाडि सर्न सम्भव भएकाले, लचिलो सञ्चालन सम्भव।
  • एकतर्फी सूचीको तुलनामा मेमोरी प्रयोग बढी हुन्छ।
  1. साइकलिक सूची
    अन्तिम नोडले पहिलो नोडलाई संकेत गर्ने संरचना हो।
  • सूचीको अन्त्यमा पुगेर पनि पुनरावृत्ति गर्न सकिने कारण, लूप प्रोसेसिङमा उपयुक्त छ।
  • विशेष प्रयोजनहरूमा उपयोगी।

अगामी खण्डमा, “C भाषा मा जडित सूचीको कार्यान्वयन विधि” बारे, विशिष्ट कोड उदाहरणहरू सहित व्याख्या गरिनेछ।

3. C भाषा मा लिंक्ड लिस्टको कार्यान्वयन

यस खण्डमा, C भाषा प्रयोग गरेर लिंक्ड लिस्ट कार्यान्वयन गर्ने तरिका, विशिष्ट कोड उदाहरणसँगै व्याख्या गरिन्छ।

लिंक्ड लिस्टको मूल संरचना

लिंक्ड लिस्ट तलका तत्वहरूद्वारा बनाइन्छ।

  1. नोडको परिभाषा
  • प्रत्येक नोडमा डेटा र अर्को नोडको पोइन्टर समावेश हुन्छ।
  1. हेड पोइन्टर
  • सूचीको सुरु भागलाई संकेत गर्ने पोइन्टर, जसले सम्पूर्ण सूचीलाई व्यवस्थापन गर्छ।

कोड उदाहरण: लिंक्ड लिस्टको मूल कार्यान्वयन

तल लिंक्ड लिस्टलाई सञ्चालन गर्नको लागि नमुना कोड दिइएको छ।

#include <stdio.h>
#include <stdlib.h>

// नोडको परिभाषा
typedef struct Node {
    int data;                 // डेटा भाग
    struct Node* next;        // अर्को नोडको सूचक
} Node;

// नोड बनाउने
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node)); // मेमोरी सुरक्षित गर्ने
    if (newNode == NULL) {
        printf("मेमोरी सुरक्षित गर्न असफल भयो।n");
        exit(1);
    }
    newNode->data = data;
    newNode->next = NULL; // अर्को नोड प्रारम्भिक अवस्थामा NULL हुन्छ
    return newNode;
}

// नोड थप्ने (सूचीको पहिलो)
void insertAtHead(Node** head, int data) {
    Node* newNode = createNode(data); // नयाँ नोड बनाउने
    newNode->next = *head;            // नयाँ नोडले वर्तमान हेडलाई सूचित गर्छ
    *head = newNode;                  // हेडलाई नयाँ नोडमा अपडेट गर्ने
}

// सूची प्रदर्शन गर्ने
void printList(Node* head) {
    Node* temp = head;
    while (temp != NULL) {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("NULLn");
}

// मेमोरी मुक्त गर्ने
void freeList(Node* head) {
    Node* temp;
    while (head != NULL) {
        temp = head;
        head = head->next;
        free(temp); // मेमोरी मुक्त गर्ने
    }
}

int main() {
    Node* head = NULL; // खाली सूची प्रारम्भ गर्ने

    // सूचीमा डेटा थप्ने
    insertAtHead(&head, 3);
    insertAtHead(&head, 2);
    insertAtHead(&head, 1);

    // सूची प्रदर्शन गर्ने
    printList(head);

    // मेमोरी मुक्त गर्ने
    freeList(head);

    return 0;
}

कोड व्याख्या

  1. नोडको सिर्जना
  • डायनामिक मेमोरी आवंटनद्वारा नयाँ नोड सिर्जना गरिन्छ।
  1. नोडको सम्मिलन
  • सुरु वा अन्त्यमा डेटा सम्मिलन गरेर सूचीलाई विस्तार गरिन्छ।
  1. नोडको हटाउने
  • विशिष्ट मान भएको नोड वा सुरु नोडलाई हटाउने प्रक्रिया कार्यान्वयन गरिएको छ।
  1. मेमोरी व्यवस्थापन
  • प्रयोग गरिएको मेमोरीलाई उचित रूपमा मुक्त गरेर मेमोरी लीकलाई रोक्छ।

4. लिंक्ड लिस्टका प्रकारहरू

यस भागमा, लिंक्ड लिस्टका मुख्य प्रकारहरू र प्रत्येकको विशेषताहरूको व्याख्या गर्नेछौं। साथै, प्रत्येक लिस्टको फाइदा र बेफाइदाहरूलाई स्पष्ट रूपमा वर्णन गरी, आवश्यक अनुसारको प्रयोग बुझ्न सकिने बनाउनेछौं।

1. एकदिशा सूची

एकदिशा सूची भनेको प्रत्येक नोडले केवल अर्को नोडलाई मात्र सन्दर्भ गर्ने संरचना हो।

विशेषताहरू:

  • सूचीका तत्वहरू केवल एक दिशामा मात्र अगाडि बढ्न सक्छन्।
  • मेमोरी प्रयोग कम हुन्छ, र कार्यान्वयन तुलनात्मक रूपमा सरल छ।

फाइदाहरू:

  • डायनामिक मेमोरी आवंटनको कारण आकार परिवर्तनशील हुन्छ, जसले लचिलो रूपमा अनुकूलन गर्न सकिन्छ।
  • तत्वहरू थप्ने वा हटाउने कार्य कुशल हुन्छ।

बेफाइदाहरू:

  • पहिलेको नोडमा जान नसक्ने कारण, उल्टो दिशामा खोजी अक्षम हुन्छ।

2. द्विदिशा सूची

द्विदिशा सूची भनेको प्रत्येक नोडले अगाडि र पछाडि दुवै नोडलाई सन्दर्भ गर्ने संरचना हो।

विशेषताहरू:

  • प्रत्येक नोडसँग ‘अघिको लिङ्क’ र ‘अर्को लिङ्क’ दुवै हुन्छ।
  • अघिको र पछिको दुवै दिशामा सर्न सकिने कारण, लचिलो सञ्चालन सम्भव हुन्छ।

फाइदाहरू:

  • दुवै दिशामा सर्न सकिने कारण, डेटा खोजी र हटाउन सजिलो हुन्छ।
  • सूचीको उल्टो दिशाको सञ्चालन सजिलो हुन्छ।

बेफाइदाहरू:

  • एकदिशा सूचीको तुलनामा मेमोरी प्रयोग बढी हुन्छ (दुई पोइन्टर आवश्यक पर्छ)।
  • नोडको सञ्चालन जटिल बन्ने सम्भावना हुन्छ।

3. चक्राकार सूची

चक्राकार सूची भनेको अन्तिम नोडले पहिलो नोडलाई सन्दर्भ गर्ने संरचना हो।

विशेषताहरू:

  • सूचीको अन्त्य छैन, र अनन्त रूपमा घुम्ने संरचना हुन्छ।
  • एकदिशा वा द्विदिशा दुवै रूपमा निर्माण गर्न सकिन्छ।

फाइदाहरू:

  • सूचीको सुरु र अन्त्यलाई सजिलै सर्न सकिने कारण, लूप प्रोसेसिङका लागि उपयुक्त छ।
  • क्यू र बफरिङ कार्यहरूमा उपयोगी हुन्छ।

बेफाइदाहरू:

  • अन्त्य नहुनुका कारण, खोजी र हटाउने कार्यहरूमा सावधानी आवश्यक हुन्छ।

सूचीहरूको तुलना तालिका

प्रकारविशेषताहरूफाइदाहरूबेफाइदाहरू
एकदिशा सूचीएक दिशामा मात्र अगाडि बढ्नेकार्यान्वयन सरल र मेमोरी प्रयोग कमउल्टो दिशामा सर्न सकिँदैन
द्विदिशा सूचीअघिको र पछिको दुवै दिशामा सर्न सकिनेलचिलो सञ्चालन र खोजी सम्भवमेमोरी प्रयोग धेरै, कार्यान्वयन जटिल
चक्राकार सूचीसूचीको अन्त्यले पहिलो नोडमा फर्कन्छलूप प्रोसेसिङका लागि उपयुक्त, अन्त्य र सुरु जोडिएका छन्अन्त्य नहुनुका कारण, व्यवस्थापन गाह्रो हुन सक्छ

अर्को भागमा, ‘लिंक्ड लिस्टको सञ्चालन’ बारे व्याख्या गर्नेछौं, डेटा सम्मिलन, हटाउने, खोजी आदिका विशिष्ट चरणहरू वर्णन गर्नेछौं।

5. Linked List को अपरेशन

यस खण्डमा, लिंक्ड लिस्टमा हुने आधारभूत अपरेसनहरूबारे विस्तृत रूपमा व्याख्या गरिन्छ। विशेष गरी, तत्वको सम्मिलनहटाउनेखोज को कार्यान्वयन विधिहरूलाई कोड उदाहरणसँगै वर्णन गरिन्छ।

1. तत्वको सम्मिलन

Linked List मा तत्व सम्मिलन गर्ने तरिकाहरू तीनवटा छन्।

(1) सूचीको सुरुमा सम्मिलन

सूचीको सुरुमा नयाँ नोड थपिन्छ।

void insertAtHead(Node** head, int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = *head; // नयाँ नोडले वर्तमान हेडलाई सूचाउँछ
    *head = newNode;       // नयाँ नोडलाई हेड बनाउँछ
}

(2) सूचीको अन्त्यमा सम्मिलन

सूचीको अन्त्यमा नयाँ नोड थपिन्छ।

void insertAtTail(Node** head, int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;

    if (*head == NULL) { // सूची खाली भएमा
        *head = newNode;
        return;
    }

    Node* temp = *head;
    while (temp->next != NULL) { // अन्तिम नोडसम्म सार्नुहोस्
        temp = temp->next;
    }
    temp->next = newNode; // अन्तिम नोडमा थप्नुहोस्
}

2. तत्वको हटाउने

Linked List बाट तत्व हटाउने तरिकाहरू व्याख्या गरिन्छ।

(1) सुरुको तत्वको हटाउने

void deleteAtHead(Node** head) {
    if (*head == NULL) {
        printf("सूची खाली छ।n");
        return;
    }
    Node* temp = *head;
    *head = (*head)->next; // हेडलाई अर्को नोडमा अपडेट गर्नुहोस्।
    free(temp); // स्मृति मुक्त गर्नुहोस्।
}

(2) निश्चित मान भएको तत्वको हटाउने

void deleteNode(Node** head, int key) {
    Node* temp = *head;
    Node* prev = NULL;

    // पहिलो नोड हटाउने लक्ष्य भएमा
    if (temp != NULL && temp->data == key) {
        *head = temp->next;
        free(temp);
        return;
    }

    // हटाउने लक्ष्य नोड खोज्नुहोस्
    while (temp != NULL && temp->data != key) {
        prev = temp;
        temp = temp->next;
    }

    if (temp == NULL) {
        printf("मूल्य फेला परेन。n");
        return;
    }

    prev->next = temp->next;
    free(temp);
}

3. तत्वको खोज

सूचीभित्रको निश्चित डेटा खोजी गरिन्छ।

int search(Node* head, int key) {
    Node* temp = head;
    int position = 0;

    while (temp != NULL) {
        if (temp->data == key) {
            return position; // पत्ता लागेको स्थान फर्काउँछ
        }
        temp = temp->next;
        position++;
    }
    return -1; // यदि पत्ता नलग्यो भने
}

4. सूचीको प्रदर्शन

सूचीका सबै तत्वहरू क्रमशः आउटपुट गरिन्छ।

void printList(Node* head) {
    Node* temp = head;
    while (temp != NULL) {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("NULLn");
}

सारांश

यस खण्डमा, लिंक्ड लिस्टको सम्मिलन, हटाउने, खोजका आधारभूत अपरेसनहरू कार्यान्वयन गरियो।

  • सम्मिलन अपरेशनले, सुरु, अन्त्य, वा इच्छित स्थानमा तत्व थप्ने समर्थन गर्दछ।
  • हटाउने अपरेशनले, सुरु वा निश्चित मान भएको तत्वलाई हटाउन सक्छ।
  • खोज अपरेशनले, सूचीभित्रको डेटा खोजी गरी, त्यसको स्थान फिर्ता गर्दछ।

6. मेमोरी व्यवस्थापनका ध्यान दिनुपर्ने बुँदाहरू

यस खण्डमा, लिङ्क्ड लिस्टको कार्यान्वयनमा विशेष महत्त्वपूर्ण मेमोरी व्यवस्थापनबारे व्याख्या गर्नेछौं। विशेष गरी, डायनामिक मेमोरी एलोकेशनमेमोरी लीक रोकथामका बुँदाहरूलाई समेट्दै, सुरक्षित र प्रभावकारी प्रोग्राम बनाउने तरिका प्रस्तुत गर्नेछौं।

1. डायनामिक मेमोरी एलोकेशन के हो?

C भाषामा, लिङ्क्ड लिस्टको नोड बनाउँदा डायनामिक मेमोरी एलोकेशन गरिन्छ। यसले चलाउदा आवश्यक मेमोरी क्षेत्र सुरक्षित गर्न सकिन्छ, जसले लचिलो डेटा व्यवस्थापन सम्भव बनाउँछ।

कोड उदाहरण: नोडको डायनामिक मेमोरी एलोकेशन

Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node)); // स्मृति आवंटन
    if (newNode == NULL) { // स्मृति आवंटन असफलताको जाँच
        printf("स्मृति सुरक्षित गर्न असफल भयो।n");
        exit(1); // प्रोग्राम समाप्त
    }
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

2. मेमोरी मुक्त गर्ने महत्त्व

लिङ्क्ड लिस्टमा, नयाँ नोडलाई डायनामिक रूपमा सुरक्षित गरिन्छ, तर प्रयोग नहुनु भएको मेमोरीलाई उचित रूपमा मुक्त नगरेमा मेमोरी लीक उत्पन्न हुन्छ।

कोड उदाहरण: मेमोरी मुक्त गर्नु

void freeList(Node* head) {
    Node* temp;
    while (head != NULL) {
        temp = head;         // वर्तमान नोड राख्नुहोस्
        head = head->next;   // अर्को नोडमा जानुहोस्
        free(temp);          // मेमोरी मुक्त गर्नुहोस्
    }
}

3. मेमोरी लीक रोकथामका सर्वश्रेष्ठ अभ्यासहरू

  1. मेमोरी मुक्त गर्ने कार्यलाई पूर्ण रूपमा लागू गर्नु
  • प्रयोग समाप्त भएको मेमोरीलाई अनिवार्य रूपमा मुक्त गर्नुहोस्।
  1. डिबग टूलहरू प्रयोग गर्नु
  • Valgrind वा AddressSanitizer जस्ता टूलहरू प्रयोग गर्दा, मेमोरी लीकको उत्पन्न स्थान पत्ता लगाउन सकिन्छ।

Valgrind को प्रयोग उदाहरण (Linux वातावरण)

valgrind --leak-check=full ./a.out
  1. पॉइन्टरको व्यवस्थापन स्पष्ट बनाउनु
  • सुरक्षित गरिएको पॉइन्टरको स्वामित्व स्पष्ट पार्नुहोस्, र विभिन्न स्थानहरूमा एउटै पॉइन्टरलाई सञ्चालन गर्ने कार्यबाट बच्नुहोस्।
  • प्रयोगपछि यसलाई NULL मा सेट गरेर पहुँच रोकथाम गर्नुहोस्।

सारांश

  • डायनामिक मेमोरी एलोकेशन लिङ्क्ड लिस्टको लचिलो डेटा व्यवस्थापनलाई सम्भव बनाउने महत्त्वपूर्ण प्रविधि हो।
  • प्रयोगपछि मेमोरी मुक्त गर्न बिर्सिएमा, मेमोरी लीक उत्पन्न हुन्छ र प्रोग्राम अस्थिर हुन्छ।
  • डिबग टूलहरू प्रयोग गर्दै सुरक्षित प्रोग्राम डिजाइन गर्ने प्रयास गरौं।

7. अनुप्रयोग उदाहरणहरू र व्यावहारिक प्रयोग

यस खण्डमा, लिङ्क्ड लिस्टलाई प्रयोग गरेर बनाइएका डेटा संरचनाका उदाहरणहरू प्रस्तुत गरिन्छ। विशेष गरी, स्ट्याकक्यू जस्ता संरचनाहरूको कार्यान्वयन उदाहरणहरू देखाइन्छ, लिङ्क्ड लिस्टको लचिलोपन र व्यावहारिकतामा जोड दिइन्छ।

1. स्ट्याकको कार्यान्वयन उदाहरण

स्ट्याक भनेको “पछिल्लो प्रवेश, पहिलो निकास (LIFO)” को डेटा संरचना हो। अन्तिममा थपिएको तत्व पहिलोमा निकालिन्छ।

कोड उदाहरण:लिङ्क्ड लिस्टद्वारा स्ट्याकको कार्यान्वयन

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node;

Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

void push(Node** top, int data) {
    Node* newNode = createNode(data);
    newNode->next = *top;
    *top = newNode;
}

int pop(Node** top) {
    if (*top == NULL) {
        printf("स्ट्याक खाली छ。n");
        exit(1);
    }
    Node* temp = *top;
    int poppedData = temp->data;
    *top = (*top)->next;
    free(temp);
    return poppedData;
}

void printStack(Node* top) {
    while (top != NULL) {
        printf("%d -> ", top->data);
        top = top->next;
    }
    printf("NULLn");
}

int main() {
    Node* stack = NULL;

    push(&stack, 10);
    push(&stack, 20);
    push(&stack, 30);

    printf("स्ट्याकको सामग्री: ");
    printStack(stack);

    printf("पप गरिएको मान: %dn", pop(&stack));
    printf("पप गरिएको मान: %dn", pop(&stack));

    printf("स्ट्याकको सामग्री: ");
    printStack(stack);

    return 0;
}

2. क्यूको कार्यान्वयन उदाहरण

क्यू भनेको “पहिलो प्रवेश, पहिलो निकास (FIFO)” को डेटा संरचना हो। पहिलोमा थपिएको तत्व पहिलोमा निकालिन्छ।

कोड उदाहरण:लिङ्क्ड लिस्टद्वारा क्यूको कार्यान्वयन

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node;

typedef struct Queue {
    Node* front;
    Node* rear;
} Queue;

Queue* createQueue() {
    Queue* q = (Queue*)malloc(sizeof(Queue));
    q->front = q->rear = NULL;
    return q;
}

void enqueue(Queue* q, int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    if (q->rear == NULL) {
        q->front = q->rear = newNode;
        return;
    }
    q->rear->next = newNode;
    q->rear = newNode;
}

int dequeue(Queue* q) {
    if (q->front == NULL) {
        printf("क्यू खाली छ。n");
        exit(1);
    }
    Node* temp = q->front;
    int data = temp->data;
    q->front = q->front->next;

    if (q->front == NULL) {
        q->rear = NULL;
    }

    free(temp);
    return data;
}

void printQueue(Queue* q) {
    Node* temp = q->front;
    while (temp != NULL) {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("NULLn");
}

int main() {
    Queue* q = createQueue();

    enqueue(q, 1);
    enqueue(q, 2);
    enqueue(q, 3);

    printf("क्यूको सामग्री: ");
    printQueue(q);

    printf("निकालिएको मान: %dn", dequeue(q));
    printf("निकालिएको मान: %dn", dequeue(q));

    printf("क्यूको सामग्री: ");
    printQueue(q);

    return 0;
}

सारांश

यस खण्डमा, लिङ्क्ड लिस्टलाई प्रयोग गरेर बनाइएका स्ट्याक र क्यूको कार्यान्वयन विधिहरू प्रस्तुत गरियो। यसले,

  • स्ट्याक LIFO स्वरूपमा डेटा व्यवस्थापन गर्न सक्षम भएकोले, पुनरावृत्ति प्रक्रिया र गणितीय अभिव्यक्तिको मूल्याङ्कनमा उपयुक्त छ।
  • क्यू FIFO स्वरूपमा व्यवस्थापन गर्न सक्ने कारणले, बफरिङ र कार्य व्यवस्थापनमा उपयोगी छ।

8. सारांश

यस लेखमा, C भाषा मा लिंक्ड लिस्टको बारेमा, यसको आधारभूत अवधारणा देखि ठोस कार्यान्वयन उदाहरणहरू, साथै प्रयोगात्मक उदाहरणहरू सम्म विस्तृत रूपमा व्याख्या गरिएको छ। यहाँ, प्रत्येक भागका महत्वपूर्ण बुँदाहरूलाई पुनरावलोकन गरी, भविष्यको अध्ययन र प्रयोगका लागि कदमहरू प्रस्ताव गरिन्छ।

1. लेखका मुख्य बुँदाहरूको पुनरावलोकन

लिंक्ड लिस्टको आधारभूत

  • लिंक्ड लिस्ट एक यस्तो डेटा संरचना हो जसले गतिशील रूपमा आकार परिवर्तन गर्न सक्छ र लचिलोपनमा उत्कृष्ट छ।
  • एरेहरू भन्दा फरक, तत्वहरू थप्न वा हटाउन सजिलो हुन्छ, तर विशेष तत्व खोज्दा क्रमिक खोज आवश्यक पर्छ।

कार्यान्वयन उदाहरणहरू र आधारभूत अपरेसनहरू

  • हामीले नोड निर्माण, सम्मिलन, हटाउने, खोजी आदि आधारभूत अपरेसनहरूलाई कोड उदाहरणसँगै व्याख्या गरेका छौं।
  • सही मेमोरी व्यवस्थापनले सुरक्षित र प्रभावकारी प्रोग्राम निर्माण गर्न सकिन्छ भन्ने कुरामा जोड दिइयो।

प्रकारहरू र प्रयोगहरू

  • एकतर्फी सूची सरल र हल्का प्रक्रियाका लागि उपयुक्त छ।
  • द्विदिश सूची अगाडि-पछाडि सर्न आवश्यक परेमा प्रभावकारी हुन्छ।
  • परिचक्र सूची दोहोर्याइने प्रक्रिया आवश्यक पर्ने प्रणालीहरूमा लागू गर्न सकिन्छ।

अनुप्रयोग उदाहरणहरू

  • हामीले स्ट्याक र क्यूज जस्ता विभिन्न डेटा संरचनाहरूलाई लिंक्ड लिस्ट प्रयोग गरेर कार्यान्वयन गरेका छौं।
  • यी अनुप्रयोग उदाहरणहरू अल्गोरिदम अनुकूलन र प्रणाली विकासमा सहयोगी हुन्छन्।

2. अध्ययन परिणाम र प्रयोग क्षमताको सुधार

यस लेखमार्फत, तपाईंले तलका सीपहरू हासिल गर्नुभएको हुनुपर्छ।

  • डेटा संरचनाको बुझाइ
  • प्रोग्रामिङ सीपको सुदृढीकरण
  • समस्या समाधान क्षमताको सुधार

3. आगामी सिक्नुपर्ने विषयहरू

  1. डेटा संरचनाको प्रयोग
  • ट्री संरचनाहरू (बाइनरी ट्री, AVL रूख)
  • ग्राफ अल्गोरिदमहरू (ब्रेड्थ-फर्स्ट सर्च, डेप्थ-फर्स्ट सर्च)
  1. उन्नत डेटा व्यवस्थापन
  • ह्यास टेबल र म्याप जस्ता डेटा संरचनाहरू
  • डायनामिक एरे र लिंक्ड लिस्टको हाइब्रिड डिजाइन
  1. अल्गोरिदम अनुकूलन
  • सोर्टिङ अल्गोरिदम र खोज अल्गोरिदमको अनुकूलन
  • समय जटिलता र स्थान जटिलताको विश्लेषण

4. व्यावहारिक प्रयोगका प्रस्तावहरू

परियोजना विचारहरू

  • टास्क व्यवस्थापन अनुप्रयोग
  • सिमुलेशन प्रणाली
  • डेटा विश्लेषण उपकरण

5. अन्तमा

लिंक्ड लिस्ट प्रोग्रामिङको आधारभूत डेटा संरचना हो, तर यसको प्रयोग दायरा व्यापक छ र जटिल प्रणाली निर्माणमा पनि उपयोगी हुन्छ। यस लेखमार्फत, आधारभूतदेखि अनुप्रयोगसम्मको दृढ समझ प्राप्त गर्नुभएको र व्यावहारिक प्रयोगका लागि ज्ञान गहिरो बनाउने आशा गर्दछौं।