البرمجة

تحليل برنامج C++: قوائم مرتبطة وأخطاء شائعة

فيما يبدو أن البرنامج الذي قدمته يتعامل مع قائمة مرتبطة (Linked List) في لغة البرمجة C++. لنقم بفحص الشيفرة وتوضيح كيف تعمل الدوال وما هي النتائج المتوقعة.

لنقم أولاً بتحليل الكود:

  1. دالة display:

    cpp
    void 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، يتم طباعة قيم العقد في القائمة.

  2. دالة func1:

    cpp
    Node *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.

  3. دالة func2:

    cpp
    void 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، وهذا قد يؤدي إلى فقدان الوصول إلى القائمة الأصلية.

  4. دالة func3:

    cpp
    void func3(Node *head){ for(; head!= NULL; head = head->next) head->data *=2; }

    هذه الدالة تضرب قيم عقد القائمة في 2.

  5. دالة main:

    cpp
    int 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، وقد يكون هناك تغييرات ضرورية للحصول على النتائج المرجوة.

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

بالطبع، دعونا نوسع على الشرح ونقوم بفحص الشيفرة بشكل أكثر تفصيلاً:

  1. دالة display:

    cpp
    void 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". في حالة وجود عقد، يتم طباعة قيم كل عقد في القائمة.

  2. دالة func1:

    cpp
    Node *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; }

    هذه الدالة تقوم بإنشاء قائمة مرتبطة جديدة مكونة من ثلاثة عقد، وتعيين قيم لكل عقد. يتم إعادة رأس القائمة.

  3. دالة func2:

    cpp
    void 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 على التوالي. ومع ذلك، يبدو أن هناك سوء في التفاهم حول كيفية استخدام المؤشرات، وقد يؤدي ذلك إلى فقدان الوصول إلى القوائم الأصلية.

  4. دالة func3:

    cpp
    void func3(Node *head){ for(; head!= NULL; head = head->next) head->data *=2; }

    تقوم هذه الدالة بضرب قيم عقد القائمة في 2.

  5. دالة main:

    cpp
    int 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، يمكننا إعادة كتابتها كالتالي:

cpp
void 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 للإشارة إلى المؤشر نفسه بدلاً من إلى نسخة من قيمته، مما يسمح بتغيير القائمة الأصلية.

مقالات ذات صلة

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

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر