البرمجة

حل مشكلة طباعة قائمة متسلسلة في لغة C

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

في دالة initialiserListe، تم تعيين قيمة NULL للمؤشر L ولكنه لا يتم استرجاع هذا التغيير في الدالة الرئيسية main. يفضل تعديل الدالة initialiserListe لتأخذ مؤشرًا إلى مؤشر (عنوان مؤشر) بدلاً من مؤشر عادي، بحيث يمكن تحديث قيمة المؤشر المستخدم في الدالة الرئيسية. إليك التعديل:

c
Element* initialiserListe(Element** L){ *L = NULL; return *L; }

ثم في الدالة الرئيسية main، قم بتمرير عنوان المؤشر L إلى initialiserListe:

c
int main() { printf("Hello world!\n"); Element *L = NULL; initialiserListe(&L); insererEnTete(L); affichageListe(L); return 0; }

بهذا التعديل، يتم تحديث المؤشر L بشكل صحيح، ويجب أن يظهر النتيجة المتوقعة عند تشغيل البرنامج.

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

بالطبع، دعنا نقوم بمراجعة الشيفرة البرمجية بشكل أكثر تفصيلاً ونقدم بعض التوضيحات حول كيفية عمل البرنامج وما قد يكون سبب ظهور رسالة “liste vide”.

  1. دالة initialiserListe:
    في هذه الدالة، تم تعيين NULL للمؤشر L. ومع ذلك، يتم تمرير المؤشر L بقيمة، وليس بعنوانه. هذا يعني أن أي تغيير في قيمة L داخل الدالة لن يؤثر على المتغير L في الدالة الرئيسية.

  2. الدالة insererEnTete:
    في هذه الدالة، يتم إنشاء عنصر جديد nouveau باستخدام malloc، ويتم قراءة القيمة من المستخدم وتعيينها في nouveau->val. ثم يتم تعيين L كقيمة للحقل suivant في nouveau. ولكن هنا تكمن المشكلة: يجب أن يتم تحديث المؤشر L في الدالة الرئيسية بقيمة nouveau الجديدة.

    لحل هذه المشكلة، قد يكون من الأفضل إرجاع المؤشر L من الدالة insererEnTete:

    c
    Element* insererEnTete(Element* L) { nouveau = (Element*)malloc(sizeof(Element)); if (L == NULL) printf("initialisation : "); printf("donner une valeur : "); scanf("%d", &nouveau->val); nouveau->suivant = L; return nouveau; }

    وفي الدالة الرئيسية، يمكنك تحديث المؤشر L كما يلي:

    c
    L = insererEnTete(L);
  3. الدالة affichageListe:
    تقوم هذه الدالة بفحص ما إذا كانت القائمة فارغة أم لا، وإذا كانت فارغة تطبع “liste vide”. وإلا، فإنها تقوم بطباعة عناصر القائمة. هنا يبدو أن البرنامج لا يدخل في الحالة الثانية. ربما يكون السبب في تنسيق الطباعة أو في عدم وجود فراغات بين الأرقام. يمكنك إضافة فراغ بين الأرقام عن طريق طباعة فراغ بعد كل عنصر:

    c
    while (temp != NULL) { printf("%d ", temp->val); // أضف فراغ بعد القيمة temp = temp->suivant; }

    بعد هذه التعديلات، قد يظهر البرنامج النتيجة المتوقعة عند تشغيله. تأكد من تنفيذ هذه التعديلات وجرب مرة أخرى.

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