🔥 أحدث الأخبار

موقع يهتم بكل ماهو جديد في عالم التكنولوجيا والرياضة

كورس C++ المتوسط – الحلقة الثامنة: Linked List (القوائم المرتبطة)


 

كورس C++ المتوسط – الحلقة الثامنة: Linked List (القوائم المرتبطة)

#برمجة

مقدمة

مرحباً بك في الحلقة الثامنة من المستوى المتوسط في C++.

في الحلقة السابقة تعلمنا:

  • Struct
  • Enum
  • تنظيم البيانات
  • إنشاء أنظمة طلاب بسيطة

واليوم سندخل إلى عالم هياكل البيانات (Data Structures) الحقيقي.

وسنتعلم أول هيكل بيانات احترافي:

Linked List


ما هي Linked List؟

في المصفوفات (Arrays):

int arr[5] = {10,20,30,40,50};

العناصر تكون متجاورة في الذاكرة.

أما في Linked List فالعناصر يمكن أن تكون في أماكن مختلفة من الذاكرة لكنها مرتبطة ببعضها بواسطة مؤشرات.


الشكل التوضيحي

[10|*] ---> [20|*] ---> [30|*] ---> NULL

كل عنصر يسمى:

Node

وكل Node يحتوي على:

  1. البيانات (Data)
  2. مؤشر للعنصر التالي (Next)

لماذا نستخدم Linked List؟

لأنها تسمح بـ:

✔ إضافة عناصر بسهولة

✔ حذف عناصر بسهولة

✔ حجم ديناميكي

✔ عدم الحاجة لمعرفة الحجم مسبقاً


إنشاء أول Node

struct Node
{
    int data;
    Node* next;
};

شرح

int data;

لتخزين القيمة.


Node* next;

لتخزين عنوان العقدة التالية.


إنشاء عقدة يدوياً

#include <iostream>
using namespace std;

struct Node
{
    int data;
    Node* next;
};

int main()
{
    Node* first = new Node();

    first->data = 10;
    first->next = nullptr;

    cout << first->data;

    delete first;

    return 0;
}

إنشاء عقدتين وربطهما

#include <iostream>
using namespace std;

struct Node
{
    int data;
    Node* next;
};

int main()
{
    Node* first = new Node();
    Node* second = new Node();

    first->data = 10;
    second->data = 20;

    first->next = second;
    second->next = nullptr;

    cout << first->data << endl;
    cout << first->next->data;

    delete first;
    delete second;

    return 0;
}

الشكل

10 ---> 20 ---> NULL

إنشاء ثلاث عقد

10 ---> 20 ---> 30 ---> NULL

Node* first = new Node();
Node* second = new Node();
Node* third = new Node();

first->data = 10;
second->data = 20;
third->data = 30;

first->next = second;
second->next = third;
third->next = nullptr;

المرور على Linked List

بدلاً من الحلقة العادية في المصفوفات نستخدم مؤشراً مؤقتاً.

Node* temp = first;

مثال

#include <iostream>
using namespace std;

struct Node
{
    int data;
    Node* next;
};

int main()
{
    Node* first = new Node();
    Node* second = new Node();
    Node* third = new Node();

    first->data = 10;
    second->data = 20;
    third->data = 30;

    first->next = second;
    second->next = third;
    third->next = nullptr;

    Node* temp = first;

    while(temp != nullptr)
    {
        cout << temp->data << endl;

        temp = temp->next;
    }

    delete first;
    delete second;
    delete third;

    return 0;
}

الناتج

10
20
30

إضافة عنصر في البداية

قبل:

10 -> 20 -> 30

بعد:

5 -> 10 -> 20 -> 30

الكود

Node* newNode = new Node();

newNode->data = 5;

newNode->next = first;

first = newNode;

إضافة عنصر في النهاية

10 -> 20 -> 30

تصبح:

10 -> 20 -> 30 -> 40

الكود

Node* newNode = new Node();

newNode->data = 40;
newNode->next = nullptr;

Node* temp = first;

while(temp->next != nullptr)
{
    temp = temp->next;
}

temp->next = newNode;

حذف أول عنصر

قبل:

10 -> 20 -> 30

بعد:

20 -> 30

الكود

Node* temp = first;

first = first->next;

delete temp;

البحث عن قيمة

bool found = false;

Node* temp = first;

while(temp != nullptr)
{
    if(temp->data == 20)
    {
        found = true;
        break;
    }

    temp = temp->next;
}

حساب عدد العناصر

int count = 0;

Node* temp = first;

while(temp != nullptr)
{
    count++;

    temp = temp->next;
}

مشروع عملي: قائمة أرقام

#include <iostream>
using namespace std;

struct Node
{
    int data;
    Node* next;
};

int main()
{
    Node* first = nullptr;

    Node* n1 = new Node();
    Node* n2 = new Node();
    Node* n3 = new Node();

    n1->data = 10;
    n2->data = 20;
    n3->data = 30;

    first = n1;

    n1->next = n2;
    n2->next = n3;
    n3->next = nullptr;

    Node* temp = first;

    while(temp != nullptr)
    {
        cout << temp->data << endl;

        temp = temp->next;
    }

    delete n1;
    delete n2;
    delete n3;

    return 0;
}

مقارنة بين Array و Linked List

Array Linked List
سريعة للوصول أبطأ للوصول
حجم ثابت غالباً حجم ديناميكي
الحذف أصعب الحذف أسهل
الإدراج أصعب الإدراج أسهل

متى نستخدم Linked List؟

عندما:

✔ يكثر الحذف والإضافة

✔ لا تعرف عدد العناصر مسبقاً

✔ تحتاج مرونة في إدارة البيانات


أخطاء شائعة

❌ نسيان:

temp = temp->next;

داخل الحلقة.


❌ نسيان:

delete

بعد استخدام new.


❌ الوصول إلى:

temp->next

عندما يكون temp يساوي nullptr.


تمارين

التمرين 1

أنشئ Linked List تحتوي:

5 -> 10 -> 15

التمرين 2

اطبع جميع العناصر.


التمرين 3

احسب عدد العناصر.


التمرين 4

ابحث عن رقم معين.


التمرين 5

أضف عنصراً في نهاية القائمة.


ملخص الحلقة الثامنة

تعلمنا:

  • ما هي Linked List
  • Node
  • المؤشرات داخل الهياكل
  • الربط بين العقد
  • المرور على القائمة
  • الإضافة
  • الحذف
  • البحث
  • العد

في الحلقة التاسعة سنتعلم:

🔥 Doubly Linked List و Stack

وسنتعرف على:

  • القوائم المرتبطة المزدوجة
  • بنية Stack
  • تطبيقات Undo / Redo
  • إدارة الذاكرة بشكل أقوى

وهذه من أهم هياكل البيانات المستخدمة في البرامج الاحترافية. 🚀

تعليقات

💬 🙋🏻‍♂️