كورس 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 يحتوي على:
- البيانات (Data)
- مؤشر للعنصر التالي (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
- إدارة الذاكرة بشكل أقوى
وهذه من أهم هياكل البيانات المستخدمة في البرامج الاحترافية. 🚀

تعليقات
إرسال تعليق