المشكلة التي تواجهها في برنامجك تتعلق بكيفية تخزين البيانات في القائمة المرتبطة. في الواقع، السبب في عدم عرض جميع القيم بشكل صحيح هو أنك تستخدم نفس المؤشر لـ p->next
في كل إضافة جديدة للعناصر إلى القائمة.
عندما تقوم بإنشاء عنصر جديد في الدالة inserti
، يجب عليك أن تحجز مساحة جديدة للعنصر القادم next
، وليس استخدام نفس المساحة في كل مرة. هذا يعني أنك تحتاج إلى تغيير السطر:
-
تحليل برنامج C++: قوائم مرتبطة وأخطاء شائعة30/01/2024
-
حل مشكلة تعيين السلاسل في لغة C08/04/2024
-
تحويل درجات الحرارة في لغة C21/03/2024
-
تحويل نتائج Soap UI إلى CSV28/03/2024
cif(*head!=NULL)
p->next=*head;
إلى:
cp->next = *head;
بهذه الطريقة، ستنشئ مساحة جديدة لكل عنصر تقوم بإضافته إلى القائمة، وستكون القائمة تعمل بشكل صحيح وتعرض كل القيم بشكل صحيح.
المزيد من المعلومات
بالطبع! يبدو أنك تستخدم الدالة strtok
لتقسيم السلاسل إلى جزئين باستخدام فاصلة ,
. ومن الجيد أيضًا أنك تقوم بإنشاء عنصر جديد llist
لكل سطر في الملف CSV وتقوم بإضافته إلى القائمة المرتبطة.
ومن المهم أيضًا أن تتحقق من إغلاق الملف بعد الانتهاء من استخدامه باستخدام fclose(fp)
في نهاية الدالة main
، وهذا ما تقوم به بالفعل.
واحدة من التحسينات التي يمكنك تطبيقها هي استخدام دالة strdup
لنسخ السلاسل المقسمة بواسطة strtok
، بدلاً من استخدام مؤشرات char*
مباشرة. هذا يمكن أن يمنع بعض المشاكل المحتملة في تعاملك مع السلاسل.
على سبيل المثال، يمكنك تحسين الجزء الخاص بالتبديل في inserti
كالتالي:
ccase 0:
p->d.dat = strdup(tok);
break;
case 1:
p->d.uname = strdup(tok);
break;
لكن لا تنسى أن تحرر الذاكرة المخصصة للسلاسل عندما تكون قد انتهيت من استخدامها في القائمة المرتبطة.