البرمجة

تصحيح أخطاء إدراج البيانات في قائمة متسلسلة بلغة C++

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

في البداية، يجب التنويه إلى أن هناك خطأ في هيكلة الكود. يظهر أن هناك تلاعباً غير صحيح في الصف الذي يحتوي على الدوال والتي يمكن أن تكون جزءًا من كلاس. لاحظ أيضاً أن الدالة insert يتم استدعاؤها باستخدام كائن من نوع Link_no وليس من نوع node. يجب أن يتم استدعاء الدالة insert باستخدام كائن من نوع Link_no بدلاً من ذلك.

بالإضافة إلى ذلك، يجب علينا التأكد من تمرير العنصر الرئيسي head بالقيمة وليس بالمرجعة في الدالة insert. يفترض أن يتم تحديث قيمة head داخل الدالة insert وهذا يتطلب استخدام المرجع &.

لحل المشكلة المحددة، يمكن تعديل الكود على النحو التالي:

cpp
#include using namespace std; class Link_no { struct node { int data; node *next; }; public: void insert(int n, int d, node *&head) { node *temp = new node(); temp->data = d; temp->next = NULL; node *temp1; if (n == 1) { temp->next = head; head = temp; return; } else temp1 = head; { for (int i = 0; i < n - 1; i++) { temp1 = temp1->next; } temp->next = temp1->next; temp1->next = temp; } } void print(node *start) { node *temp = start; while (temp != NULL) { cout << temp->data << endl; temp = temp->next; } } }; int main() { Link_no o1; Link_no::node *head = NULL; o1.insert(1, 5, head); o1.insert(2, 7, head); o1.insert(1, 9, head); o1.print(head); return 0; }

تم إجراء بعض التعديلات لضمان أن الدوال يتم استدعاؤها بشكل صحيح وأن قيمة head تتحدث بشكل صحيح عند استخدامها في دوال الإدراج والطباعة. يمكنك الآن تجربة الكود مرة أخرى ويجب أن يكون لديك نتيجة صحيحة وخالية من الأخطاء.

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

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

  1. هيكلية الكلاس:

    • يُلاحظ أن الهيكلية node تكون جزءًا من الكلاس Link_no داخل القطاع العام. يمكن أن يكون هذا تنظيمًا مناسبًا، ولكن في بعض الحالات قد تكون مناسبة أيضًا إذا كانت الهيكلية تحتوي على تعليمات برمجية خاصة بها، لذلك يمكن فصلها إلى كلاس مستقل.

    • يتم إضافة الكلمة الرئيسية public: قبل الدوال في الكلاس لضمان أن الدوال يمكن الوصول إليها خارج الكلاس.

  2. دالة الإدراج:

    • تم تصحيح الدالة insert بحيث يتم تحديث head باستخدام المرجع & لضمان أن التغييرات تُجرى على العنوان الفعلي للمتغير head في الدالة الرئيسية.

    • تم تعديل المربعات الزمنية للحلقة لتحديد الموقع الصحيح للإدراج.

    • تم تعديل الخطوة temp->next = temp1->next; لتكون temp->next = temp1->next; حتى يتم تحديد العنصر الجديد بشكل صحيح.

  3. دالة الطباعة:

    • دالة الطباعة print تعمل بشكل صحيح، حيث تقوم بطباعة قيم العناصر في القائمة المتسلسلة.
  4. الدالة الرئيسية:

    • في الدالة الرئيسية، يتم إنشاء كائن من الكلاس Link_no باسم o1 وكائن من الهيكلية node بإسم head ويتم استخدامه في عمليات الإدراج والطباعة.

    • تم استخدام الدالة insert لإدراج قيم مختلفة في القائمة المتسلسلة ومن ثم تم طباعتها باستخدام الدالة print.

هذه التوضيحات تهدف إلى فهم أفضل للكود والتغييرات التي تم إجراؤها لتحسين أداء البرنامج. إذا كانت لديك أي أسئلة إضافية أو تحتاج إلى توضيحات إضافية، فلا تتردد في طرحها.

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