قائمة مترابطة أحادية الاتجاه
العُقد والملكية والاجتياز
قائمة مترابطة أحادية الاتجاه درس مجاني في Zig Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Zig Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Zig Academy 4 دروس في المجموع.
ما القائمة المرتبطة
تربط القائمة المرتبطة أحادية الاتجاه القيم معًا؛ إذ تحتوي كل عقدة على قيمة ومؤشر إلى العقدة التالية، أو null عند النهاية. 🔗
تعريف العقدة
العقدة بنية تحتوي على قيمة ومؤشر اختياري إلى العقدة التالية. وتعني كلمة اختياري أن العقدة الأخيرة تشير إلى null.
const Node = struct {
value: i32,
next: ?*Node,
};لماذا المؤشر اختياري
يتيح استخدام ?*Node إنهاء السلسلة بأمان. ولا حاجة إلى قيمة حارسة خاصة لتحديد الذيل.
next: ?*Nodeتتتبع القائمة الرأس
تتذكر القائمة نفسها العقدة الأولى فقط، التي تُسمى الرأس، بالإضافة إلى مخصّص الذاكرة الذي يملك جميع العقد.
const List = struct {
head: ?*Node,
alloc: std.mem.Allocator,
};تخصيص عقدة واحدة
لإضافة قيمة، اطلب من مخصّص الذاكرة إنشاء Node واحدة على الكومة. ويُعيد ذلك مؤشرًا إلى مساحة تخزين جديدة.
const node = try self.alloc.create(Node);الدفع إلى المقدمة
أقل عمليات الإدراج تكلفةً تكون عند الرأس: اجعل العقدة الجديدة تشير إلى الرأس القديم، ثم اجعلها الرأس الجديد. وتتم هذه العملية بزمن ثابت.
node.* = .{ .value = v, .next = self.head };
self.head = node;اجتياز السلسلة
للاجتياز، ابدأ من الرأس واتبع كل مؤشر next حتى تصل إلى null. وتلتقط حلقة while العقدة بطريقة مناسبة.
var cur = self.head;
while (cur) |n| {
std.debug.print("{d}\n", .{n.value});
cur = n.next;
}يفك الالتقاط القيمة الاختيارية
يؤدي استخدام while (cur) |n| إلى تشغيل جسم الحلقة ما دام cur غير فارغ، وتكون n هي المؤشر بعد فك تغليفه. وتنتهي الحلقة عند null.
while (cur) |n| { ... }أنت تملك كل عقدة
جاءت كل عقدة من مخصّص الذاكرة، ولذلك يجب إعادتها جميعًا. ونسيان عقدة واحدة فقط هو تسرّب سيبلّغ عنه مخصّص الاختبار.
تحرير القائمة بأكملها
اجتز السلسلة في deinit، لكن احصل على next قبل التحرير، لأن العقدة تختفي لحظة إتلافها.
var cur = self.head;
while (cur) |n| {
const nxt = n.next;
self.alloc.destroy(n);
cur = nxt;
}جعلها عامة
غلّف Node وList داخل دالة تُعيد نوعًا، حتى تعمل القائمة مع أي نوع عنصر، وليس مع i32 فقط.
fn LinkedList(comptime T: type) type {
return struct {
const Node = struct { value: T, next: ?*Node };
};
}تحقق سريع
أنت تحرر عقد قائمة مرتبطة واحدة تلو الأخرى. ما الذي يجب فعله قبل إتلاف كل عقدة؟
مراجعة
تحتوي العقد على قيمة ومؤشر next اختياري. وتتتبع القائمة الرأس ومخصّص الذاكرة، وتدفع العناصر إلى المقدمة، وتحرر العقد واحدةً تلو الأخرى. 🎯
تعلم Zig مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «قائمة مترابطة أحادية الاتجاه» مجاني؟
نعم — نص درس «قائمة مترابطة أحادية الاتجاه» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Zig Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Zig Academy 4 دروس في المجموع.
ماذا ستتعلم في «قائمة مترابطة أحادية الاتجاه»؟
العُقد والملكية والاجتياز تتمرن على Zig Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Zig Academy؟
لا تُشترط خبرة سابقة. Zig Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «قائمة مترابطة أحادية الاتجاه»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Zig Academy هذا؟
نعم. كل درس في Zig Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مكدس عام من الصفر
- قائمة مترابطة أحادية الاتجاه
- استخدام HashMap وAutoHashMap
- المقارنة بين تحليل الأداء والأمان