البرمجة

إنشاء قائمة متسلسلة لحروف الكلمة باستخدام C++ و std::string

في البداية، يظهر أن لديك برنامجًا جيدًا لإنشاء قائمة متسلسلة تحتوي على حروف الكلمة. ومع ذلك، يواجه البرنامج مشكلة عندما تحاول قراءة الكلمة من المستخدم باستخدام cin.

يبدو أن المشكلة تكمن في الفرق بين كيفية تعامل البرنامج مع الكلمة المعرفة مسبقًا (char str[] = "abcdefgh";) وكيفية تعامله مع إدخال المستخدم (cin >> str;).

عندما تقوم بتحديد الكلمة مسبقًا، يتم تخزين الحروف في مصفوفة من نوع char، ويكون لديك نهاية معينة محددة بوجود العلامة النهائية ('\0'). ولكن عند استخدام cin، قد يتسبب إدخال المستخدم في تجاوز حجم المصفوفة المخصصة (str)، مما يؤدي إلى تلف الذاكرة.

لحل هذه المشكلة، يمكنك استخدام std::string بدلاً من مصفوفة char لتخزين الكلمة التي يدخلها المستخدم، وذلك لتجنب قضايا تجاوز الحجم. هنا هو كيف يمكنك تعديل البرنامج:

cpp
#include #include #include using namespace std; struct slistEl { slistEl* next; char data; }; unsigned l_size(slistEl* head) { unsigned c = 0; slistEl* p = head; if (p) do { c++; p = p->next; } while (p != head); return c; } void l_printl(slistEl* head) { slistEl* p; cout << setw(3) << l_size(head) << " ["; p = head; if (p) do { p = p->next; cout << " " << p->data; } while (p != head); cout << " ]\n\n"; } void l_push(slistEl*& head, char v) { slistEl* p = new slistEl; p->data = v; if (head) { p->next = head->next; head->next = p; } else p->next = p; head = p; } void l_pop(slistEl*& head) { if (head) { slistEl* p = head->next; head->next = p->next; if (p->next == p) head = NULL; delete p; } } int main() { slistEl* head = NULL; string word; // استخدام std::string بدلاً من مصفوفة char cout << "Enter a word: "; cin >> word; for (char c : word) { l_push(head, c); l_printl(head); } system("PAUSE"); return 0; }

باستخدام std::string، يمكنك التعامل مع الكلمة بشكل دينامي دون الحاجة إلى التعامل مع حجم محدد.

المزيد من المعلومات

بالتأكيد، دعنا نوسع قليلا على الكود ونقدم بعض المعلومات الإضافية حول البرنامج.

  1. استخدام std::string:
    يتيح استخدام std::string تحقيق المرونة وتجنب قضايا تجاوز الحجم. هذا يعني أنك لست ملزمًا بتحديد حجم الكلمة المدخلة مسبقًا، وهذا يسهل على المستخدم إدخال كلمات ذات أطوال مختلفة.

  2. هيكل القائمة المتسلسلة:
    يتم تمثيل القائمة المتسلسلة باستخدام هيكل slistEl الذي يحتوي على حقلين: next الذي يشير إلى العنصر التالي في القائمة، و data الذي يحتوي على الحرف الذي يتم تخزينه في العنصر.

  3. الوظائف:

    • l_size: تعيد حجم القائمة المتسلسلة، أي عدد العناصر فيها.
    • l_printl: تقوم بطباعة العناصر في القائمة المتسلسلة.
    • l_push: تقوم بإضافة عنصر جديد إلى بداية القائمة.
    • l_pop: تقوم بإزالة عنصر من بداية القائمة.
  4. الحلقة التكرارية:
    يتم استخدام حلقة for للمرور على كل حرف في الكلمة المدخلة باستخدام نطاق for (char c : word)، حيث يتم إضافة كل حرف إلى القائمة المتسلسلة باستخدام l_push ثم يتم طباعة حالة القائمة بواسطة l_printl.

  5. التحرير الدينامي للذاكرة:
    يتم استخدام new لتخصيص ذاكرة جديدة لكل عنصر في القائمة، ويتم استخدام delete لتحرير هذه الذاكرة عند إزالة العنصر من القائمة باستخدام l_pop.

باختصار، البرنامج يقوم بإنشاء قائمة متسلسلة من حروف الكلمة التي يدخلها المستخدم، ويظهر كيف يمكن استخدام هيكل البيانات والتحكم في الذاكرة بطريقة فعالة وديناميكية.

زر الذهاب إلى الأعلى