فيما يبدو أن البرنامج الذي قدمته يتعامل مع قائمة مرتبطة (Linked List) في لغة البرمجة C++. لنقم بفحص الشيفرة وتوضيح كيف تعمل الدوال وما هي النتائج المتوقعة.
لنقم أولاً بتحليل الكود:
-
دالة
display
:cppvoid display(Node *head){ if(head == NULL) cout<<"head is NULL"<
for(Node *tmp=head; tmp!=NULL; tmp = tmp->next ) cout<<" "< data; cout< هذه الدالة تقوم بعرض قيم العقد (
Node
) في القائمة المرتبطة. إذا كانhead
يشير إلىNULL
، فإنها تعرض "head is NULL". في حالة عدم وجودNULL
، يتم طباعة قيم العقد في القائمة. -
دالة
func1
:cppNode *func1(int value1, int value2, int value3){ Node *head = new Node; head->next = new Node; head->next->next = new Node; head->next->next->next = NULL; head->data = value1; head->next->data = value2; head->next->next->data = value3; return head; }
تقوم هذه الدالة بإنشاء وإعادة رأس لقائمة مرتبطة مكونة من ثلاث عقد، حيث يتم تعيين قيم العقد بالترتيب:
value1
،value2
،value3
. -
دالة
func2
:cppvoid func2(Node *head1, Node *head2, Node *head3){ head1->next = head3; head1->next->data =3; head1= head2; head1->data = 5; head1->next->data = 7; head2 = head1; head3 = head1; }
هنا تقوم الدالة بتعديل القوائم المرتبطة وتحديد بعض القيم. ولكن يبدو أن هناك بعض الأخطاء البرمجية، حيث يتم تعيين
head1
ليشير إلىhead2
، وهذا قد يؤدي إلى فقدان الوصول إلى القائمة الأصلية. -
دالة
func3
:cppvoid func3(Node *head){ for(; head!= NULL; head = head->next) head->data *=2; }
هذه الدالة تضرب قيم عقد القائمة في 2.
-
دالة
main
:cppint main(){ Node *head1 = func1(10,20,30); Node *head2 = func1(2,4,6); Node *head3 = func1(11,22,33); func2(head1, head2, head3); display(head1); display(head2); display(head3); head1 = func1(1,2,3); func3(head1); display(head1); return 0; }
في
main
، يتم إنشاء ثلاث قوائم مرتبطة باستخدامfunc1
، ثم يتم تعديلها باستخدامfunc2
، وأخيرًا يتم ضرب قيم عقد القائمة في 2 باستخدامfunc3
. تُظهرdisplay
النتائج في كل خطوة.
بناءً على الشيفرة المقدمة، يمكن توقع النتائج كالتالي:
10 3 22 33
5 7 6
3 22 33
2 4 6
2 4 6
لكن يجب التنويه إلى أن هناك بعض الأخطاء البرمجية في func2
، وقد يكون هناك تغييرات ضرورية للحصول على النتائج المرجوة.
المزيد من المعلومات
بالطبع، دعونا نوسع على الشرح ونقوم بفحص الشيفرة بشكل أكثر تفصيلاً:
-
دالة display
:
cppvoid display(Node *head){
if(head == NULL)
cout<<"head is NULL"<for(Node *tmp=head; tmp!=NULL; tmp = tmp->next )
cout<<" "<data;
cout<
هذه الدالة تقوم بفحص القائمة المرتبطة وطباعة قيم عقدها. إذا كان head
يشير إلى NULL
، يتم طباعة "head is NULL". في حالة وجود عقد، يتم طباعة قيم كل عقد في القائمة.
-
دالة func1
:
cppNode *func1(int value1, int value2, int value3){
Node *head = new Node;
head->next = new Node;
head->next->next = new Node;
head->next->next->next = NULL;
head->data = value1;
head->next->data = value2;
head->next->next->data = value3;
return head;
}
هذه الدالة تقوم بإنشاء قائمة مرتبطة جديدة مكونة من ثلاثة عقد، وتعيين قيم لكل عقد. يتم إعادة رأس القائمة.
-
دالة func2
:
cppvoid func2(Node *head1, Node *head2, Node *head3){
head1->next = head3;
head1->next->data =3;
head1= head2;
head1->data = 5;
head1->next->data = 7;
head2 = head1;
head3 = head1;
}
في هذه الدالة، هناك بعض الأخطاء البرمجية. في البداية، يتم تعيين head1->next
ليشير إلى head3
، ثم يتم تعيين قيمة 3
لـ head1->next->data
. بعد ذلك، يتم تعيين head1
ليشير إلى head2
، ويتم تغيير قيم head1->data
و head1->next->data
إلى 5
و 7
على التوالي. ومع ذلك، يبدو أن هناك سوء في التفاهم حول كيفية استخدام المؤشرات، وقد يؤدي ذلك إلى فقدان الوصول إلى القوائم الأصلية.
-
دالة func3
:
cppvoid func3(Node *head){
for(; head!= NULL; head = head->next)
head->data *=2;
}
تقوم هذه الدالة بضرب قيم عقد القائمة في 2.
-
دالة main
:
cppint main(){
Node *head1 = func1(10,20,30);
Node *head2 = func1(2,4,6);
Node *head3 = func1(11,22,33);
func2(head1, head2, head3);
display(head1);
display(head2);
display(head3);
head1 = func1(1,2,3);
func3(head1);
display(head1);
return 0;
}
في main
، يتم إنشاء ثلاث قوائم مرتبطة باستخدام func1
، ثم يتم تعديلها باستخدام func2
، وأخيرًا يتم ضرب قيم عقد القائمة في 2 باستخدام func3
. تُظهر display
النتائج في كل خطوة.
لتصحيح الأخطاء في func2
، يمكننا إعادة كتابتها كالتالي:
cppvoid func2(Node *&head1, Node *head2, Node *&head3){
head1->next = head3;
head1->next->data = 3;
head1 = head2;
head1->data = 5;
head1->next->data = 7;
head2 = head1;
head3 = head1;
}
تم إضافة الرمز &
قبل المؤشر لـ head1
و head3
للإشارة إلى المؤشر نفسه بدلاً من إلى نسخة من قيمته، مما يسمح بتغيير القائمة الأصلية.