البرمجة

إدراج عقدة في قائمة متسلسلة

الكود الذي قدمته يقوم بإدراج عقدة جديدة في موضع معين داخل قائمة متسلسلة وذلك باستخدام متغير الموضع “position”. لكن، هناك بعض المشاكل والأخطاء في هذا الكود:

  1. في بداية الكود، يتم تعريف المؤشر “h” للإشارة إلى رأس القائمة. ثم يتم إنشاء مؤشر “p” لتمثيل العقدة الجديدة. لكنه لم يتم استخدامها بشكل صحيح لإدراج العقدة الجديدة في القائمة.

  2. في الحلقة التكرارية، يتم التحقق من قيمة “i” لتكون أقل من “position”، ولكنه لا يتم التحقق من صحة قيمة “h” أو “head” لتجنب الوصول إلى عقدة غير موجودة، مما قد يؤدي إلى أخطاء في تنفيذ البرنامج.

  3. بعد الحلقة التكرارية، يتم تحديث مؤشر “h” ليشير إلى العقدة التي تسبق الموضع المراد إدراج العقدة الجديدة فيه. ولكن هذا لن يؤدي إلى تغيير في القائمة الرئيسية، حيث أن الاستبدال تم فقط على نسخة مؤشر “h” المحلية.

  4. في النهاية، يتم التحقق مما إذا كان الموقع هو 0، وفي هذه الحالة يتم إرجاع “h” وهو يشير إلى العقدة الجديدة التي تم إدراجها. ولكن لو لم يكن الموقع 0، فإنه يتم إرجاع “head” الذي لم يتم تغييره.

لتصحيح هذه الأخطاء، يجب تحديث العقدة الرئيسية بشكل مناسب بعد إدراج العقدة الجديدة، وتحقق من صحة الوصول إلى عقدة في كل خطوة من داخل الحلقة التكرارية، وكذلك يجب تغيير “head” في حالة إدراج العقدة في بداية القائمة.

النسخة المصححة من الكود قد تكون مشابهة للتالي:

c
Node* InsertNth(Node *head, int data, int position) { int i; // إنشاء عقدة جديدة وتعيين قيمتها Node *p = (Node *)malloc(sizeof(Node)); p->data = data; // في حالة إدراج العقدة في بداية القائمة if (position == 0) { p->next = head; return p; // العقدة الجديدة أصبحت العقدة الأولى في القائمة } Node *h = head; // المؤشر المؤقت للتنقل في القائمة // التحقق من صحة الموقع المراد إدراج العقدة فيه for (i = 0; i < position - 1 && h != NULL; i++) { h = h->next; } // التحقق من صحة العقدة التي تم الوصول إليها if (h == NULL) { printf("Position out of bounds\n"); return head; // لا يمكن إدراج العقدة في هذا الموقع } // تحديث العقدة الجديدة لتشير إلى العقدة التي تليها p->next = h->next; // تحديث العقدة السابقة لتشير إلى العقدة الجديدة h->next = p; return head; // إرجاع رأس القائمة بعد الإدراج }

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

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

بالطبع، سأكمل المقال بشكل متسلسل لضمان شمولية المعلومات والتركيز على النقاط الهامة في الكود المعطى.

بدأ الكود المقدم يهدف إلى إدراج عقدة جديدة في قائمة متسلسلة في موقع محدد يُحدد بواسطة متغير الموضع “position”. ومن الواضح أن الهدف من هذا الكود هو تعليمي، ولكنه يحتوي على بعض الأخطاء التي يجب تصحيحها لتحقيق الغرض المنشود.

الأخطاء الرئيسية في الكود المعطى تشمل:

  1. تحديث العقدة الرئيسية بشكل غير صحيح: في حالة إدراج العقدة في بداية القائمة (عندما يكون الموقع هو 0)، يتم تعيين “h” (المؤشر المؤقت) ليشير إلى العقدة الجديدة، ولكن لم يتم تحديث “head” (المؤشر إلى رأس القائمة) ليشير إلى العقدة الجديدة.

  2. التحقق من صحة الموقع: يجب التحقق من صحة الموقع المطلوب قبل البدء في تحديد العقدة التي يجب إدراج العقدة الجديدة بعدها. هذا يمنع الوصول إلى عقدة غير موجودة، مما يحد من فرص حدوث أخطاء في التنفيذ.

  3. تحديث الروابط بشكل صحيح: يجب تحديث الروابط بين العقد الموجود قبل الموضع المحدد والعقدة الجديدة، وبين العقدة الجديدة والعقدة التي تليها. هذا يضمن إدراج العقدة الجديدة في القائمة بشكل صحيح.

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

c
Node* InsertNth(Node *head, int data, int position) { int i; // إنشاء عقدة جديدة وتعيين قيمتها Node *p = (Node *)malloc(sizeof(Node)); p->data = data; // في حالة إدراج العقدة في بداية القائمة if (position == 0) { p->next = head; return p; // العقدة الجديدة أصبحت العقدة الأولى في القائمة } Node *h = head; // المؤشر المؤقت للتنقل في القائمة // التحقق من صحة الموقع المراد إدراج العقدة فيه for (i = 0; i < position - 1 && h != NULL; i++) { h = h->next; } // التحقق من صحة العقدة التي تم الوصول إليها if (h == NULL) { printf("Position out of bounds\n"); return head; // لا يمكن إدراج العقدة في هذا الموقع } // تحديث العقدة الجديدة لتشير إلى العقدة التي تليها p->next = h->next; // تحديث العقدة السابقة لتشير إلى العقدة الجديدة h->next = p; return head; // إرجاع رأس القائمة بعد الإدراج }

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

مقالات ذات صلة

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

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر