اذهب إلى المحتوى

السؤال

نشر (معدل)

ممكن مساعدتي بحل سؤال 

Create a doubly linked list of strings, each string has the following information: string S; // the string itself string language; // the language of the string 

Note: Use the STL string (#include “string”) In your main function, create 3 lists, read their information from a text file, and use the lists to test the following functions. The text file has the following format: You need to implement the following functions: 1. AddFront: Takes a word and its language as parameters, and adds the word to the front of the list. 2. AddBack: Takes a word and its language as parameters, and adds the word to the end of the list. 3. AddInOrder: Takes a word and its language as parameters, and adds the word to the list according to the alphabetical order. This function must call the function (Sort) first. 4. Sort: Sorts the words in the list according to the alphabetical order of the words 5. RemoveFront 6. RemoveBack 7. CountLanguage: This function takes a language as a parameter and returns the number of words in the list that are in that language. List1: Hello English merci French table English List2: ……………………………….. List 3: ………………………………. 8. Search: Takes a word as a parameter and returns the number of the node that contains the word if it exists, it returns 0 otherwise. 9. RemoveWord: Takes a word as a parameter, searches for the word and removes it from the list (this function must call the function Search) 10. Equal: in this function you need to overload the (==) operator to test of two lists are equal or not.

تم التعديل في بواسطة omar haddad
تعديل العنوان

Recommended Posts

  • 0
نشر

السلام عليكم.
تمام، سأستخدم أساليب أساسية وأقل تعقيدًا:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

// Node structure
struct Node {
    string s;
    string language;
    Node* next;
    Node* prev;
    
    Node(string str, string lang) : s(str), language(lang), next(nullptr), prev(nullptr) {}
};

// DoublyLinkedList class
class DoublyLinkedList {
private:
    Node* head;
    Node* tail;
    
public:
    DoublyLinkedList() : head(nullptr), tail(nullptr) {}
    
    // Add a word to the front of the list
    void AddFront(string str, string lang);
    
    // Add a word to the end of the list
    void AddBack(string str, string lang);
    
    // Add a word in alphabetical order
    void AddInOrder(string str, string lang);
    
    // Remove the front node
    void RemoveFront();
    
    // Remove the back node
    void RemoveBack();
    
    // Count words of a specific language
    int CountLanguage(string lang);
    
    // Search for a word
    int Search(string str);
    
    // Remove a specific word
    void RemoveWord(string str);
    
    // Overload the equality operator to compare lists
    bool operator==(const DoublyLinkedList& other);
    
    // Print the list for debugging
    void Print();
    
    // Load data from file
    void LoadFromFile(const string& filename);
};

// Add a word to the front of the list
void DoublyLinkedList::AddFront(string str, string lang) {
    Node* newNode = new Node(str, lang);
    if (!head) {
        head = tail = newNode;
    } else {
        newNode->next = head;
        head->prev = newNode;
        head = newNode;
    }
}

// Add a word to the end of the list
void DoublyLinkedList::AddBack(string str, string lang) {
    Node* newNode = new Node(str, lang);
    if (!tail) {
        head = tail = newNode;
    } else {
        newNode->prev = tail;
        tail->next = newNode;
        tail = newNode;
    }
}

// Add a word in alphabetical order
void DoublyLinkedList::AddInOrder(string str, string lang) {
    Node* newNode = new Node(str, lang);
    if (!head || head->s >= str) {
        AddFront(str, lang);
    } else if (tail->s <= str) {
        AddBack(str, lang);
    } else {
        Node* current = head;
        while (current->next && current->next->s < str) {
            current = current->next;
        }
        newNode->next = current->next;
        newNode->prev = current;
        if (current->next) {
            current->next->prev = newNode;
        }
        current->next = newNode;
    }
}

// Remove the front node
void DoublyLinkedList::RemoveFront() {
    if (!head) return;
    Node* temp = head;
    if (head == tail) {
        head = tail = nullptr;
    } else {
        head = head->next;
        head->prev = nullptr;
    }
    delete temp;
}

// Remove the back node
void DoublyLinkedList::RemoveBack() {
    if (!tail) return;
    Node* temp = tail;
    if (head == tail) {
        head = tail = nullptr;
    } else {
        tail = tail->prev;
        tail->next = nullptr;
    }
    delete temp;
}

// Count words of a specific language
int DoublyLinkedList::CountLanguage(string lang) {
    int count = 0;
    Node* current = head;
    while (current) {
        if (current->language == lang) {
            count++;
        }
        current = current->next;
    }
    return count;
}

// Search for a word
int DoublyLinkedList::Search(string str) {
    int pos = 1;
    Node* current = head;
    while (current) {
        if (current->s == str) {
            return pos;
        }
        pos++;
        current = current->next;
    }
    return 0; // Not found
}

// Remove a specific word
void DoublyLinkedList::RemoveWord(string str) {
    Node* current = head;
    while (current) {
        if (current->s == str) {
            if (current == head) {
                RemoveFront();
            } else if (current == tail) {
                RemoveBack();
            } else {
                current->prev->next = current->next;
                current->next->prev = current->prev;
                delete current;
            }
            return;
        }
        current = current->next;
    }
}

// Overload the equality operator
bool DoublyLinkedList::operator==(const DoublyLinkedList& other) {
    Node* thisCurrent = head;
    Node* otherCurrent = other.head;
    
    while (thisCurrent && otherCurrent) {
        if (thisCurrent->s != otherCurrent->s || thisCurrent->language != otherCurrent->language) {
            return false;
        }
        thisCurrent = thisCurrent->next;
        otherCurrent = otherCurrent->next;
    }
    
    return !thisCurrent && !otherCurrent;
}

// Print the list
void DoublyLinkedList::Print() {
    Node* current = head;
    while (current) {
        cout << "Word: " << current->s << ", Language: " << current->language << endl;
        current = current->next;
    }
}

// Load data from file
void DoublyLinkedList::LoadFromFile(const string& filename) {
    ifstream file(filename);
    string str, lang;
    if (file.is_open()) {
        while (file >> str >> lang) {
            AddBack(str, lang);
        }
        file.close();
    } else {
        cerr << "Unable to open file." << endl;
    }
}

// Main function
int main() {
    DoublyLinkedList list1;
    DoublyLinkedList list2;
    DoublyLinkedList list3;
    
    list1.LoadFromFile("list1.txt");
    list2.LoadFromFile("list2.txt");
    list3.LoadFromFile("list3.txt");
    
    // Test the functions
    list1.Print();
    list2.Print();
    list3.Print();
    
    // Additional test code here...

    return 0;
}


 التوضيحات
- **Node Structure**: يحتوي على الحقلين `s` و `language` مع مؤشرين للإشارة إلى العنصر التالي والسابق.
- **DoublyLinkedList Class**: ينفذ الطرق المطلوبة لتعديل القائمة.
  - **AddFront** و **AddBack**: لإضافة العقد في البداية أو النهاية.
  - **AddInOrder**: لإضافة العقد بترتيب أبجدي.
  - **RemoveFront** و **RemoveBack**: لإزالة العقد من البداية أو النهاية.
  - **CountLanguage**: لحساب الكلمات بلغة معينة.
  - **Search**: للبحث عن كلمة وإرجاع موقعها.
  - **RemoveWord**: لإزالة كلمة معينة.
  - **operator==**: لمقارنة قائمتين.
  - **Print**: لطباعة العناصر.
  - **LoadFromFile**: لتحميل البيانات من ملف.

يمكنك استخدام هذا الكود كأساس وتجربة تشغيله مع ملفات نصية تتبع التنسيق المحدد.

حظ موفق صديقي

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...