عند مراجعة الشيفرة البرمجية التي قدمتها، يتضح أن هناك سببًا لظهور رسالة “liste vide” عند تشغيل البرنامج، وهذا يعود إلى الطريقة التي تم بها استدعاء دوال القائمة المتسلسلة.
في دالة initialiserListe
، تم تعيين قيمة NULL
للمؤشر L
ولكنه لا يتم استرجاع هذا التغيير في الدالة الرئيسية main
. يفضل تعديل الدالة initialiserListe
لتأخذ مؤشرًا إلى مؤشر (عنوان مؤشر) بدلاً من مؤشر عادي، بحيث يمكن تحديث قيمة المؤشر المستخدم في الدالة الرئيسية. إليك التعديل:
-
حلول قراءة ملفات CSV في Java01/04/2024
cElement* initialiserListe(Element** L){
*L = NULL;
return *L;
}
ثم في الدالة الرئيسية main
، قم بتمرير عنوان المؤشر L
إلى initialiserListe
:
cint main() {
printf("Hello world!\n");
Element *L = NULL;
initialiserListe(&L);
insererEnTete(L);
affichageListe(L);
return 0;
}
بهذا التعديل، يتم تحديث المؤشر L
بشكل صحيح، ويجب أن يظهر النتيجة المتوقعة عند تشغيل البرنامج.
المزيد من المعلومات
بالطبع، دعنا نقوم بمراجعة الشيفرة البرمجية بشكل أكثر تفصيلاً ونقدم بعض التوضيحات حول كيفية عمل البرنامج وما قد يكون سبب ظهور رسالة “liste vide”.
-
دالة
initialiserListe
:
في هذه الدالة، تم تعيينNULL
للمؤشرL
. ومع ذلك، يتم تمرير المؤشرL
بقيمة، وليس بعنوانه. هذا يعني أن أي تغيير في قيمةL
داخل الدالة لن يؤثر على المتغيرL
في الدالة الرئيسية. -
الدالة
insererEnTete
:
في هذه الدالة، يتم إنشاء عنصر جديدnouveau
باستخدامmalloc
، ويتم قراءة القيمة من المستخدم وتعيينها فيnouveau->val
. ثم يتم تعيينL
كقيمة للحقلsuivant
فيnouveau
. ولكن هنا تكمن المشكلة: يجب أن يتم تحديث المؤشرL
في الدالة الرئيسية بقيمةnouveau
الجديدة.لحل هذه المشكلة، قد يكون من الأفضل إرجاع المؤشر
L
من الدالةinsererEnTete
:cElement* 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
كما يلي:cL = insererEnTete(L);
-
الدالة
affichageListe
:
تقوم هذه الدالة بفحص ما إذا كانت القائمة فارغة أم لا، وإذا كانت فارغة تطبع “liste vide”. وإلا، فإنها تقوم بطباعة عناصر القائمة. هنا يبدو أن البرنامج لا يدخل في الحالة الثانية. ربما يكون السبب في تنسيق الطباعة أو في عدم وجود فراغات بين الأرقام. يمكنك إضافة فراغ بين الأرقام عن طريق طباعة فراغ بعد كل عنصر:cwhile (temp != NULL) { printf("%d ", temp->val); // أضف فراغ بعد القيمة temp = temp->suivant; }
بعد هذه التعديلات، قد يظهر البرنامج النتيجة المتوقعة عند تشغيله. تأكد من تنفيذ هذه التعديلات وجرب مرة أخرى.