मैं एक असाइनमेंट पर काम कर रहा हूं जहां मुझे विशिष्ट सदस्य कार्य दिए गए हैं जिन्हें मुझे एक लिंक्ड-लिस्ट के लिए पूरा करने की आवश्यकता है। उनमें से एक के लिए मुझे एक नोड की प्रतिलिपि बनाने, उसका नाम बदलने, पुराने नोड को हटाने और नए को वापस सूची में डालने की आवश्यकता है। मैं इस कोड के साथ आया हूँ

while(start != NULL)
{
    if(start->id == nID) 
    {
        start->name = newName;
        holdNode = start;
        removeNode(nID); //removes start from the linkedlist
        addNode(holdNode->name, holdNode->id, holdNode->cost); 

        found = true; 
        break;
    }
    else
        start = start->next; 

मुझे एक्सकोड में सही आउटपुट मिलता है, लेकिन जब मैं इसे जी ++ के साथ चलाता हूं तो नाम फ़ील्ड या तो खाली होता है या यादृच्छिक वर्णों की एक श्रृंखला होती है। मुझे लगता है कि इसका प्रारंभ नोड को इंगित करने और फिर इसे हटाने के साथ कुछ करना है, लेकिन मैं यह नहीं समझ सकता कि यह एक स्थान पर क्यों काम करेगा लेकिन दूसरे में नहीं।

एक्सकोड आउटपुट

1, testing, $9.99

जी++

1, , $9.99

किसी भी प्रकार के मदद की बहुत सराहना की जाएगी

0
SelfStudy22 5 सितंबर 2019, 02:42

1 उत्तर

सबसे बढ़िया उत्तर

आपका कोड नोड की कोई प्रतिलिपि नहीं बना रहा है। यह केवल मौजूदा नोड के name को अपडेट करता है जिसे वह पाता है, फिर यह उस नोड में एक पॉइंटर सहेजता है, उस नोड को सूची से हटा देता है आपके द्वारा अभी सहेजे गए पॉइंटर को अमान्य कर देता है मजबूत>, फिर उस अमान्य सूचक का उपयोग करने का प्रयास करता है ताकि एक नया नोड सम्मिलित करते समय मूल्यों का उपयोग किया जा सके। वहीं आपका कोड विफल हो रहा है।

इसके बजाय इसे आजमाएं:

bool changeName(int nID, string newName)
{
    Product *node = head;

    while (node) //while there are items in the list
    {
        if (node->id == nID) //if ids match
        {
            double price = node->price;
            removeNode(nID); //remove node from the linkedlist
            addNode(newName, nID, price); //insert new node
            return true;
        }

        node = node->next; //move to next node
    }

    return false;
}

लाइव डेमो

हालांकि, यह थोड़ा अक्षम है, क्योंकि removeNode() संभवतः वही id खोज फिर से कर रहा है। एक लिंक की गई सूची एक नोड को जल्दी डालने और हटाने में सक्षम है, सूची को कई बार ट्रेस किए बिना। बस पाए गए नोड को उसके आस-पास के नोड्स से अनलिंक करें। कम से कम, आप removeNode() को changeName() में इस तरह कॉल से छुटकारा पा सकते हैं:

bool changeName(int nID, string newName)
{
    Product *node = head, *prev = NULL;

    while (node) //while there are items in the list
    {
        if (node->id == nID) //if ids match
        {
            double price = node->price;

            //remove node from the linkedlist
            //removeNode(nID);
            if (prev) prev->next = node->next;
            if (node == head) head = node->next;
            delete node;

            //insert new node
            addNode(newName, nID, price);

            return true; 
        }

        prev = node;
        node = node->next; //move to next node
    }

    return false;
}

लाइव डेमो

एक अन्य विकल्प यह होगा कि वास्तव में पाए गए नोड को बिल्कुल भी नष्ट न करें, बस इसे यथास्थिति में स्थानांतरित करें। इसे इसके आसपास के नोड्स से अनलिंक करें, और फिर इसे वांछित नई स्थिति में नोड्स से लिंक करें, जैसे:

bool changeName(int nID, string newName)
{
    Product *node = head, *prev = NULL;

    while (node) //while there are items in the list
    {
        if (node->id == nID) //if ids match
        {
            //remove node from the linkedlist
            if (prev) prev->next = node->next;
            if (node == head) head = node->next;

            //insert node in new position
            Product **node2 = &head;
            while ((*node2) && ((*node2)->name < newName)) {
                node2 = &((*node2)->next);
            }

            node->name = newName;
            node->next = *node2;
            *node2 = node;

            return true; 
        }

        prev = node;
        node = node->next; //move to next node
    }

    return false;
}

लाइव डेमो

2
Remy Lebeau 5 सितंबर 2019, 03:34