في محاولتك لإنشاء قائمة متجاورة لتمثيل رسم بياني من قائمة من الحواف في ملف “input.txt”، تواجهك بعض المشاكل في التعامل مع مصفوفة الهياكل الديناميّة والتعامل مع البرنامج في وضع التصحيح والتشغيل العادي. لنقم بمراجعة الكود وتوضيح الأخطاء وتقديم بعض التعديلات.
أولًا، دعونا نناقش الدالة create_list
. يبدو أن هناك بعض الأخطاء في التعامل مع مصفوفة الهياكل الدينامية. قمت باستخدام struct list* **array
ولكن يجب أن تكون هذه ببساطة struct list* *array
، لأن مصفوفة الهياكل هي بالفعل مؤشر.
ثانيًا، يجب أن يتم تحديد الحافظة array[i]
كـ NULL
في نهاية الحلقة for
الأولى في main
، وليس بعد الحلقة.
ثالثًا، في دالة create_list
، يجب عليك التحقق مما إذا كان المؤشر *array[m]
هو NULL
قبل أن تقوم بالمقارنة بقيمته. يمكن أن يكون ذلك هو مصدر الخطأ الذي يؤدي إلى تعطل البرنامج.
رابعًا، في جزء آخر من سؤالك، تستفسر عن سبب تغيير الإخراج عند تشغيل البرنامج بشكل عادي. يمكن أن يكون ذلك بسبب الذاكرة المحتملة المحذوفة بين الوقت الذي يتم فيه تصحيح البرنامج والوقت الذي يتم فيه تشغيله بشكل عادي. يجب عليك التأكد من أن جميع المتغيرات تتم معالجتها بشكل صحيح في كل مرة.
بناءً على ملاحظاتنا السابقة، يمكن تعديل الكود على النحو التالي:
c#include
#include
struct list {
int vertex;
struct list* next;
};
void create_list(int v, struct list* *array);
int main() {
int i, v = 5;
struct list *ptr, *array[v];
for (i = 0; i < v; i++)
array[i] = NULL;
create_list(v, array);
for (i = 0; i < v; i++) {
ptr = array[i];
printf("%d: ", i);
while (ptr != NULL) {
printf(" -> %d", ptr->vertex);
ptr = ptr->next;
}
printf("\n");
}
return 0;
}
void create_list(int v, struct list* *array) {
int m, n;
struct list *ptr, *tmp;
FILE *luki;
luki = fopen("input.txt", "r");
while (fscanf(luki, "%d %d\n", &m, &n) == 2) {
tmp = (struct list*)malloc(sizeof(struct list));
tmp->vertex = n;
tmp->next = NULL;
if (array[m] == NULL)
array[m] = tmp;
else {
ptr = array[m];
while (ptr->next != NULL)
ptr = ptr->next;
ptr->next = tmp;
}
}
fclose(luki);
}
تحقق من هذا التعديل وجرب تشغيل البرنامج. يجب أن يكون الكود أكثر دقة الآن، وتعتمد نتيجة البرنامج على محتوى ملف “input.txt”.
المزيد من المعلومات
في سياق برمجة تمثيل الرسوم البيانية باستخدام قائمة متجاورة، يعتبر الكود السابق بداية جيدة لفهم الفكرة الأساسية. تجمع الأطروحات البرمجية التي تعتمد على تمثيل الرسوم البيانية باستخدام قائمة متجاورة بين بساطة الهياكل ومرونة تحمل البيانات.
لفهم الكود بشكل أعمق، يجدر بنا التركيز على العناصر الرئيسية:
-
الهيكل
struct list
:- يمثل كل عنصر في القائمة المتجاورة.
- يحتوي على
vertex
الذي يمثل الفهرس أو العقدة في الرسم البياني. - يحتوي على
next
الذي يشير إلى العنصر التالي في القائمة.
-
دالة
create_list
:- تقوم بفتح ملف “input.txt” لقراءة الحواف (الربط بين العقدتين).
- تقوم بتكوين القائمة المتجاورة باستخدام الهياكل المتجاورة وتحديث المصفوفة
array
. - تحتاج إلى ضمان استخدام المؤشرات بشكل صحيح لتجنب الأخطاء في التعامل مع الذاكرة.
-
دالة
main
:- تقوم بتهيئة المصفوفة
array
وتعيين كل عنصر فيها إلىNULL
. - تقوم بالتعامل مع القائمة المتجاورة التي تم إنشاؤها وطباعتها للتحقق من صحة النتائج.
- تقوم بتهيئة المصفوفة
عليك أن تأخذ في اعتبارك أن مصفوفة array
هنا تحمل عناوين البداية لكل قائمة متجاورة. إذا كان لديك مشكلة محددة أو إضافية تحتاج إلى مساعدة فيها، فلا تتردد في توضيحها، وسأكون سعيدًا بتقديم المساعدة الإضافية.