تصحيح أخطاء إدراج البيانات في قائمة متسلسلة بلغة 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
تتحدث بشكل صحيح عند استخدامها في دوال الإدراج والطباعة. يمكنك الآن تجربة الكود مرة أخرى ويجب أن يكون لديك نتيجة صحيحة وخالية من الأخطاء.
المزيد من المعلومات
بالطبع، سنواصل النظر في بعض التفاصيل الفنية والمعلومات الإضافية حول الكود وعملية إدراج البيانات في القائمة المتسلسلة.
-
هيكلية الكلاس:
-
يُلاحظ أن الهيكلية
node
تكون جزءًا من الكلاسLink_no
داخل القطاع العام. يمكن أن يكون هذا تنظيمًا مناسبًا، ولكن في بعض الحالات قد تكون مناسبة أيضًا إذا كانت الهيكلية تحتوي على تعليمات برمجية خاصة بها، لذلك يمكن فصلها إلى كلاس مستقل. -
يتم إضافة الكلمة الرئيسية
public:
قبل الدوال في الكلاس لضمان أن الدوال يمكن الوصول إليها خارج الكلاس.
-
-
دالة الإدراج:
-
تم تصحيح الدالة
insert
بحيث يتم تحديثhead
باستخدام المرجع&
لضمان أن التغييرات تُجرى على العنوان الفعلي للمتغيرhead
في الدالة الرئيسية. -
تم تعديل المربعات الزمنية للحلقة لتحديد الموقع الصحيح للإدراج.
-
تم تعديل الخطوة
temp->next = temp1->next;
لتكونtemp->next = temp1->next;
حتى يتم تحديد العنصر الجديد بشكل صحيح.
-
-
دالة الطباعة:
- دالة الطباعة
print
تعمل بشكل صحيح، حيث تقوم بطباعة قيم العناصر في القائمة المتسلسلة.
- دالة الطباعة
-
الدالة الرئيسية:
-
في الدالة الرئيسية، يتم إنشاء كائن من الكلاس
Link_no
باسمo1
وكائن من الهيكليةnode
بإسمhead
ويتم استخدامه في عمليات الإدراج والطباعة. -
تم استخدام الدالة
insert
لإدراج قيم مختلفة في القائمة المتسلسلة ومن ثم تم طباعتها باستخدام الدالةprint
.
-
هذه التوضيحات تهدف إلى فهم أفضل للكود والتغييرات التي تم إجراؤها لتحسين أداء البرنامج. إذا كانت لديك أي أسئلة إضافية أو تحتاج إلى توضيحات إضافية، فلا تتردد في طرحها.