القوائم المرتبطة أحادية الاتجاه
العُقد والمؤشرات
القوائم المرتبطة أحادية الاتجاه درس مجاني في C Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
ما القائمة المرتبطة؟
القائمة المرتبطة هي سلسلة من البنى الصغيرة التي تسمى العُقد. تحتوي كل عقدة على قيمة ومؤشر إلى العقدة التالية.
بخلاف المصفوفات، لا يلزم أن تكون العناصر متجاورة في الذاكرة، كما يمكن أن تكبر القائمة أو تصغر بسهولة.
#include <stdio.h>
struct Node {
int value;
struct Node *next;
};
int main(void) {
printf("A node holds a value and a next pointer\n");
return 0;
}تعريف عقدة
تحتوي بنية العقدة على البيانات بالإضافة إلى struct Node *next الذي يشير إلى العقدة التالية.
يشير نوع المؤشر إلى البنية نفسها، وبذلك ترتبط العقد ببعضها.
#include <stdio.h>
struct Node {
int value;
struct Node *next;
};
int main(void) {
struct Node n;
n.value = 42;
n.next = NULL;
printf("value=%d, next is NULL: %d\n", n.value, n.next == NULL);
return 0;
}مؤشر الرأس
يُعرَف موقع القائمة بمؤشر واحد يشير إلى عقدتها الأولى، ويُسمى الرأس.
القائمة الفارغة هي ببساطة قائمة يكون رأسها مساويًا لـ NULL.
#include <stdio.h>
struct Node { int value; struct Node *next; };
int main(void) {
struct Node *head = NULL;
printf("List is empty: %d\n", head == NULL);
return 0;
}تخصيص عقدة
تُنشأ العقد عادةً في الكومة باستخدام malloc حتى تبقى موجودة بعد انتهاء الدالة التي أنشأتها.
تحقق دائمًا من القيمة المعادة، وتذكّر تحرير العقد لاحقًا.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
int main(void) {
struct Node *n = malloc(sizeof(struct Node));
n->value = 7;
n->next = NULL;
printf("%d\n", n->value);
free(n);
return 0;
}عامل السهم
عندما يكون لديك مؤشر إلى بنية، استخدم -> للوصول إلى الأعضاء. وتعني n->value الشيء نفسه الذي تعنيه (*n).value.
ستستخدم عامل السهم باستمرار مع القوائم المرتبطة.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
int main(void) {
struct Node *n = malloc(sizeof(struct Node));
n->value = 99;
printf("%d\n", n->value);
free(n);
return 0;
}ربط عقدتين
لربط العقد، اضبط next في العقدة الأولى ليشير إلى الثانية. ويظل next في العقدة الأخيرة مساويًا لـ NULL لتحديد النهاية.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
int main(void) {
struct Node *a = malloc(sizeof(struct Node));
struct Node *b = malloc(sizeof(struct Node));
a->value = 1; a->next = b;
b->value = 2; b->next = NULL;
printf("%d -> %d\n", a->value, a->next->value);
free(a); free(b);
return 0;
}مساعد لإنشاء العقد
يُعد تكرار التخصيص أمرًا مرهقًا، لذا غلّفه داخل دالة مساعدة تخصص عقدة جديدة وتهيئها وتعيدها.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v) {
struct Node *n = malloc(sizeof(struct Node));
n->value = v;
n->next = NULL;
return n;
}
int main(void) {
struct Node *n = make(5);
printf("%d\n", n->value);
free(n);
return 0;
}إنشاء قائمة صغيرة
باستخدام الدالة المساعدة، أنشئ قائمة من ثلاث عقد 1 -> 2 -> 3 من خلال ربط مؤشرات next.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
int main(void) {
struct Node *head = make(1);
head->next = make(2);
head->next->next = make(3);
printf("%d %d %d\n", head->value, head->next->value, head->next->next->value);
return 0;
}طباعة القائمة
لطباعة كل قيمة، ابدأ من الرأس واتبع مؤشرات next حتى تصل إلى NULL.
يُعد هذا النمط من الاجتياز أساس معظم عمليات القوائم.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
int main(void) {
struct Node *head = make(1);
head->next = make(2);
for (struct Node *p = head; p; p = p->next)
printf("%d ", p->value);
printf("\n");
return 0;
}المصفوفات مقابل القوائم المرتبطة
توفر المصفوفات وصولًا سريعًا باستخدام الفهرس، لكن حجمها ثابت. أما القوائم المرتبطة فتتيح الإدراج والحذف بسهولة، لكن الوصول إليها أبطأ، إذ يجب اجتيازها للوصول إلى عنصر.
اختر بناءً على العمليات الأكثر تكرارًا في برنامجك.
#include <stdio.h>
int main(void) {
printf("Array: O(1) index, costly resize\n");
printf("List: O(n) index, cheap insert/delete\n");
return 0;
}تحرير القائمة بالكامل
يجب تحرير كل عقدة تم تخصيصها باستخدام malloc. تجوّل في القائمة، لكن احفظ مؤشر التالية قبل تحرير كل عقدة، وإلا فقدت بقية السلسلة.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
int main(void) {
struct Node *head = make(1);
head->next = make(2);
struct Node *p = head;
while (p) {
struct Node *nxt = p->next;
free(p);
p = nxt;
}
printf("freed all nodes\n");
return 0;
}تحقق سريع
اختبر مدى فهمك لبنية القائمة المرتبطة.
مراجعة
تعلّمت أساسيات القوائم المرتبطة أحادية الاتجاه:
- تحتوي العقدة على قيمة ومؤشر
next؛ ويشير الرأس إلى العقدة الأولى. - خصّص العقد باستخدام
malloc، ووصِل إلى الأعضاء باستخدام->. - تكون قيمة
nextللعقدة الأخيرة هيNULL؛ وتجوّل في القائمة باتباع المؤشرات. - احرص دائمًا على تحرير كل عقدة، مع حفظ
nextقبل التحرير.
الأسئلة الشائعة
هل درس «القوائم المرتبطة أحادية الاتجاه» مجاني؟
نعم — نص درس «القوائم المرتبطة أحادية الاتجاه» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «القوائم المرتبطة أحادية الاتجاه»؟
العُقد والمؤشرات تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «القوائم المرتبطة أحادية الاتجاه»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- القوائم المرتبطة أحادية الاتجاه
- الإدراج والحذف
- الاجتياز والبحث
- القوائم المرتبطة ثنائية الاتجاه