إنشاء قائمة متسلسلة لحروف الكلمة باستخدام 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
، يمكنك التعامل مع الكلمة بشكل دينامي دون الحاجة إلى التعامل مع حجم محدد.
المزيد من المعلومات
بالتأكيد، دعنا نوسع قليلا على الكود ونقدم بعض المعلومات الإضافية حول البرنامج.
-
استخدام std::string:
يتيح استخدامstd::string
تحقيق المرونة وتجنب قضايا تجاوز الحجم. هذا يعني أنك لست ملزمًا بتحديد حجم الكلمة المدخلة مسبقًا، وهذا يسهل على المستخدم إدخال كلمات ذات أطوال مختلفة. -
هيكل القائمة المتسلسلة:
يتم تمثيل القائمة المتسلسلة باستخدام هيكلslistEl
الذي يحتوي على حقلين:next
الذي يشير إلى العنصر التالي في القائمة، وdata
الذي يحتوي على الحرف الذي يتم تخزينه في العنصر. -
الوظائف:
l_size
: تعيد حجم القائمة المتسلسلة، أي عدد العناصر فيها.l_printl
: تقوم بطباعة العناصر في القائمة المتسلسلة.l_push
: تقوم بإضافة عنصر جديد إلى بداية القائمة.l_pop
: تقوم بإزالة عنصر من بداية القائمة.
-
الحلقة التكرارية:
يتم استخدام حلقةfor
للمرور على كل حرف في الكلمة المدخلة باستخدام نطاقfor (char c : word)
، حيث يتم إضافة كل حرف إلى القائمة المتسلسلة باستخدامl_push
ثم يتم طباعة حالة القائمة بواسطةl_printl
. -
التحرير الدينامي للذاكرة:
يتم استخدامnew
لتخصيص ذاكرة جديدة لكل عنصر في القائمة، ويتم استخدامdelete
لتحرير هذه الذاكرة عند إزالة العنصر من القائمة باستخدامl_pop
.
باختصار، البرنامج يقوم بإنشاء قائمة متسلسلة من حروف الكلمة التي يدخلها المستخدم، ويظهر كيف يمكن استخدام هيكل البيانات والتحكم في الذاكرة بطريقة فعالة وديناميكية.