‫بسم الله الرحمن الرحيم‬

‫الخوارزميات‬
‫تحليل الخوارزميات‪:‬‬
‫‪ -1‬الغرض هو الحصول على برنامج ذات كفاءة عالية ويمكن الحصول‬
‫على البرنامج ذات الكفاءة العالية بطريقتين‪-:‬‬
‫أ‪ /‬تقليل زمن تنفيذ البرنامج ‪.‬‬
‫ب‪ /‬تقليل المساحة المستخدمة من الذاكرة ‪.‬‬
‫قياس الزمن‪-:‬‬
‫أ ‪ oh notation /‬ونعبر عنه مثل ً ‪. (O(N‬‬
‫ب‪ /‬اللوغريثم ونعبر عنه مثل ً ‪. log 2‬‬
‫يمكن قياس زمن البرنامج بـ ‪ (O(N‬وذلك بمعرفة عدد تكرارات‬
‫العبارات داخل البرنامج ‪.‬‬
‫وعند قياس كفاءة البرنامج بواسطة زمن التنفيذ يجب إهمال جانب‬
‫المساحة المستخدمة في الذاكرة أي ل تعطي اعتبارا ً للمساحة عند‬
‫قياس الكفاءة بالزمن ‪:‬‬
‫قاعدة ‪-:‬‬
‫‪((O(N1) + O(N2) = O(MAX(N1,N2‬‬
‫إذا كان ‪. N1>>N2‬‬
‫مثال ‪ :‬أحسب ‪ oh notation‬للبرنامج التالي ‪:‬‬
‫‪For i :=1 to N do‬‬
‫‪; (Read (x‬‬
‫فإن زمن تنفيذ هذا الجزء من البرنامج هو ‪. (O(N‬‬
‫مثال ‪ :‬أحسب زمن تنفيذ البرنامج التالي ‪:‬‬
‫‪For i:= 1 to n do‬‬
‫‪For j :=1 to n do‬‬
‫‪; (Read (x‬‬
‫فإن زمن تنفيذ البرنامج هو ‪. (O(N2‬‬
‫مثال ‪:‬‬
‫‪For i:= 1 to n do‬‬
‫‪; (Read(x‬‬
‫‪; (Read(y‬‬
‫فإن زمن البرنامج هو ‪. (O(N)+O(1‬‬
‫وحسب القاعدة إذا كانت ‪ N2>>N1‬فإنه نأخذ الكبر فقط فنقول أن‬
‫زمن تنفيذ البرنامج هو ‪. (O(N‬‬
‫تمرين ‪:‬‬
‫أحسب ‪ oh notation‬للعبارات التالية ‪:‬‬
‫; ‪sum = 0‬‬
‫‪/1‬‬
‫‪for I := 1 to n do‬‬
‫‪;sum := sum + 1‬‬
‫‪1‬‬

k := n * n ;
/2
for I := 1 to n do
for j :=1 to k do
sum := sum + 1 ;
for i:= 1 to n do
/3
for j := 1 to I do
;sum := sum + 1
‫مثال لتحسين الكفاءة بمعيار الزمن‬
‫خوارزمية الس‬
N
N/2
N/2
X =X .X
‫ عدد زوجي فان‬N ‫إذا كان‬
N
N-1/2
N-1/2
X =X
.X
.X
‫ عدد فردي فان‬N ‫إذا كان‬
N
‫ مرة مستخدما ً الحلقات ومرة‬X ‫ أكتب برنامج يحسب‬: ‫مثال‬
‫ في كل‬oh notation ‫أخرى مستخدما ً خوارزمية الس وأحسب‬
‫مرة ؟‬
; Function power(x,n:integer ):real
Var
; Sum:real
; I : integer
Begin
; Sum:= 0
For I := 1 to n do
; sum := sum × x
; power := sum
; end
: ‫باستخدام خوارزمية الس‬
Function power(x,n:integer):real;
Begin
If n = 0 then power :=1
Else
If odd (n) then
((Power := x * sqr(power (x,n div 2
Else
; ((Power :=sqr (power (x,n div 2
; End

2

‫تحليل المثالين السابقين إذا تم حساب ‪ X62‬فإن زمن تنفيذ‬
‫البرنامج الول ‪ (O(62‬بينما يتم تنفيذ البرنامج بخوارزمية الس في‬
‫خمسة خطوات فقط ‪-:‬‬
‫‪X62 = X31 . X31‬‬
‫‪X31 = X15 . X15 . X‬‬
‫‪X15 = X7 . X7 . X‬‬
‫‪X7 = X3 . X3 . X‬‬
‫‪X3 = X2 . X‬‬
‫إذن زمن تنفيذ البرنامج ‪X62‬بخوارزمية الس تساوي ‪. (O(5‬‬

‫نستخدم اللوغريثم أيضا ً في قياس زمن تنفيذ البرنامج فمثل ً في‬
‫خوارزميات الترتيب المختلفة ) الفقاع ‪ ،‬الدخال ‪ ،‬البدال ‪ .… ،‬الخ‬
‫( فإن هذه الخوارزميات تختلف من ناحية الكفاءة مع أنها تتفق‬
‫جميعها في هدفها الرئيسي وهي ترتيب العناصر تصاعديا ً أم‬
‫تنازليا ً ‪.‬‬
‫فنقيس أزمنة خوارزميات الترتيب باللوغريثم وكذلك البحث يقاس‬
‫باللوغريثم ‪.‬‬

‫المكدسات ‪STACKS‬‬

‫تعريف المكدسة ‪-:‬‬
‫المكدسة هي قائمة من البيانات تحفظ بطريقة خطية يتم فيها‬
‫حذف وإضافة البيانات من طرف واحد يسمى القمة )‪. (TOP‬‬
‫ويطلق على هذا النوع من البيانات ‪ LIFO‬اختصار لـ ‪LAST IN‬‬
‫‪ ، FIRST OUT‬الداخل أخيرا ً هو الخارج أول ً ‪.‬‬
‫مثال للمكدسة في الحياة العملية ترتيب المتعة داخل الحقيبة‬
‫حيث يكون آخر ما نضعه في الحقيبة عند ملئها هو أول ما يخرج‬
‫منها عند تفريغها ‪.‬‬
‫عمليات المكدسة ‪-:‬‬
‫عملية إضافة عنصر للمكدسة ‪ .‬وتتم بواسطة البرنامج‬
‫‪-1‬‬
‫الفرعي ‪. PUSH‬‬
‫وعملية الضافة تحتاج إلى دالة مساعدة وهي الدالة ‪ FULL‬حيث‬
‫وظيفتها اختبار إذا كانت المكدسة ممتلئة أم ل ‪ ،‬لنه في حالة‬
‫المتلء ل يمكن إضافة عنصر جديد لن ذلك يؤدي إلى مشكلة‬
‫الفيضان ‪. STACK OVER FLOW‬‬
‫‪3‬‬

‪Empty := false‬‬ ‫‪4‬‬ .MAXSTACK‬‬ ‫‪. TOP : 0.top = 0 then‬‬ ‫‪Empty := true‬‬ ‫‪Else‬‬ ‫.‬‬ ‫تنكمش وتتمدد المكدسة أثناء تنفيذ عملية الضافة والحذف وأكبر‬ ‫مدى تصل إلية المكدسة هو المدى المحدد سلفا ً للمكدسة‬ ‫‪ MAXSTACK‬وأقل مدى تصل إلية هو قاع المكدسة‬ ‫‪ ، BOTTOMMOST‬ويحدد الموقع الحالي لقمة المكدسة باستخدام‬ ‫الـ ‪.‬‬ ‫‬‫نوع الوسيط ‪ VALUE PARAMETER‬لنها دالة اختبار‬ ‫‬‫فقط ‪.MAXSTACK] OF INTEGER‬‬ ‫‪.‬‬ ‫الوسائط هي المكدسة فقط ‪.‬‬ ‫‬‫وتكون المكدسة خالية إذا كانت القمة تساوي الصفر ‪..‬‬ ‫‪ -2‬تستخدم السجلت لربط المصفوفة وقمة المكدسة ‪. TOP‬‬ ‫تعريف المكدسات ‪-:‬‬ ‫‪CONST‬‬ ‫‪. ‪Function empty (s:stack):boolean‬‬ ‫‪Begin‬‬ ‫‪If s..‬‬ ‫‬‫وترجع الدالة ‪ EMPTY‬قيمة ‪ TRUE‬إذا كانت المكدسة خالية و‬ ‫‪ FALSE‬إذا كانت غير ذلك ‪. END‬‬ ‫‪VAR‬‬ ‫‪.‬وتتم بواسطة البرنامج‬ ‫الفرعي ‪.S : STACK‬‬ ‫الدالة ‪-: EMPTY‬‬ ‫هي دالة اختبار للمكدسة هل هي خالية أم ل ‪. FLOW‬‬ ‫بناء المكدسات ‪-:‬‬ ‫‪ -1‬تستعمل المصفوفات كمنازل لحتواء عناصر المكدسة ‪. MAXSTACK = 100‬‬ ‫‪TYPE‬‬ ‫‪STACK = RECORD‬‬ ‫‪.‬لنه ل يمكن‬ ‫حذف عنصر من مكدسة فارغة و إل حدثت ‪STACK UNDER‬‬ ‫‪.‬‬ ‫كتابة الدالة ‪-:‬‬ ‫. ITEM : ARRAY [1. POP‬‬ ‫وعملية الحذف تحتاج إلى دالة مساعدة وهي الدالة ‪ EMPTY‬حيث‬ ‫وظيفتها اختبار إذا ما كانت المكدسة فارغة أم ل ‪ .‫‪-2‬عملية حذف عنصر من المكدسة ‪ .

item [s. ‪Full := false‬‬ ‫.top‬‬ ‫.‪End‬‬ ‫ويتم اختبار الدالة كالتي ‪-:‬‬ ‫.‬‬ ‫‬‫نوع الوسيط ‪ VALUE PARAMETER‬لنها دالة اختبار‬ ‫‬‫فقط ‪.‫.‬‬ ‫. ‪Uses stack‬‬ ‫‪Begin‬‬ ‫‪5‬‬ . )'‪If empty (s) then write('stack is empty‬‬ ‫الدالة ‪-: Full‬‬ ‫هي دالة اختبار للمكدسة ممتلئة أم ل ‪. MAXSTACK‬‬ ‫وترجع الدالة ‪ FULL‬قيمة ‪ TRUE‬إذا كانت المكدسة‬ ‫‬‫ممتلئة و ‪ FALSE‬إذا كانت غير ذلك ‪. )'‪If full (s) then write ('stack is full‬‬ ‫الدالة ‪stacktop‬‬ ‫تقوم بطباعة القيمة الموجودة في قمة المكدسة ‪.‬‬ ‫‬‫وتكون المكدسة ممتلئة إذا كانت القمة تساوي الـ‬ ‫‬‫‪. ‪Function stacktop (s:stack ) : integer‬‬ ‫‪Begin‬‬ ‫)'‪If empty (s) then write ('stack is empty‬‬ ‫‪Else‬‬ ‫.‬‬ ‫الوسائط الـ ‪ PARAMETER‬هي المكدسة فقط ‪.‬‬ ‫. ‪Function full (s:stack):boolean‬‬ ‫‪Begin‬‬ ‫‪If s.‬‬ ‫.‪End‬‬ ‫ويتم اختبار الدالة كالتي ‪-:‬‬ ‫.top = maxstack then‬‬ ‫‪Full := true‬‬ ‫‪Else‬‬ ‫. ]‪Stacktop := s. ‪End‬‬ ‫مثال ‪-:‬‬ ‫أكتب برنامج يقوم بتحويل عدد من النظام العشري إلى ما يناظره‬ ‫من النظام السداسي عشري ؟‬ ‫الحل‬ ‫نستخدم الوحدة ‪ stack‬التي تحتوي على كل البرامج الفرعية‬ ‫الخاصة بالمكدسة ‪.

Push (s. 12 : write ('C') . end . N := n div 16 . addtop ‫الجراء‬ . Repeat X := N mod 16 . end .Writeln(' input your decimal number ') . end . 11 : write ('B') . Until n = 0 .op1+op2 ) : ‫ هي‬S ‫إذا كانت المكدسة‬ : ‫ تعطي بالمكدسة‬addtop ‫فإن نداء الجراء‬ 6 . Read(n) . ‫وظيفة هذا الجراء هو جمع أعلى عنصرين في المكدسة‬ -: ‫الخوارزمية‬ Op2 = pop(s) If empty(s) then Element = true Push( s.x) .op2) Else Op1 = pop (s) Element = false Push ( s. While not empty (s) do Begin Case pop(s) of 10 : write ('A') . readln . 14 : write ('E') . else write (pop(s)) . 15 : write ('F') . Writeln(' your number in hex-decimal is ') . 13 : write ('D') .

‫الجراء أو الدالة ‪addstack‬‬ ‫وظيفتها هي جمع محتويات المكدسة ‪.‬‬ ‫تطبيقات على المكدسة )التطبيق الول (‬ ‫‪-1‬إيجاد قيمة معادلة مكتوبة بالـ ‪. p‬‬ ‫‪ -2‬عالج عناصر المعادلة ‪ p‬من اليسار إلى اليمين مكررا ً الخطوتين‬ ‫‪ 3‬و ‪ 4‬حتى تصل القوس اليميني ‪. OP1 ( + ) OP2‬‬ ‫ج‪ /‬أضف نتيجة الخطوة ) ب ( إلى قمة المكدسة ‪.‬‬ ‫الخوارزمية ‪-:‬‬ ‫‪Repeat‬‬ ‫. S‬‬ ‫‪ -4‬إذا كان العنصر رمز حسابي ) ‪ ( +‬نفذ من أ إلى د ‪-:‬‬ ‫أ ‪ /‬أحذف العنصرين العلويين في المكدسة ‪ S‬و ضعهما في‬ ‫المتغير ‪ OP1‬و ‪.‬‬ ‫‪.‬‬ ‫‪7‬‬ . postfix notation‬‬ ‫‪ -2‬التحويل من إلـ ‪ infix notation‬إلى الـ ‪. Postfix Notation‬‬ ‫خوارزمية حساب قيمة معادلة مكتوبة بطريقة ‪-: Postfix Notation‬‬ ‫‪ -1‬أضف قوس يميني ) للمعادلة ‪. ‪Until element‬‬ ‫مثال ‪-:‬‬ ‫إذا كانت المكدسة ‪ S‬هي ‪-:‬‬ ‫فإن نداء الدالة ‪ addstack‬تعطى بالمكدسة ‪-:‬‬ ‫تمرين‬ ‫أكتب البرامج الفرعية ‪ addstack .+AB‬‬ ‫تكتب‬ ‫‪A+B‬‬ ‫مثل ً ‪-:‬‬ ‫حيث ‪ + A B‬عبارة من نوع ‪ Postfix notation‬ولها نفس المعنى‬ ‫للمعادلة ‪a+b‬‬ ‫يمكن استخدام المكدسة في حساب قيمة ‪ + A B‬أي حساب‬ ‫‪. OP2‬‬ ‫ب‪ /‬أجري العملية الحسابية ‪. posfix notation‬‬ ‫‪-: Postfix notation‬‬ ‫تعتبر واحدة من طريق كتابة التعابير الرياضية ‪. ‪Addtop‬‬ ‫.‬‬ ‫‪ -3‬إذا كان العنصر معامل ضعه في المكدسة ‪. addtop‬بناًء على الخوارزمية‬ ‫السابقة ‪.

C‬‬ ‫‪3‬‬ ‫)‪PUSH(S. RESULT‬‬ ‫‪RESULT = OP1 + OP2‬‬ ‫‪4‬‬ ‫)‪( OP1 = POP(S‬‬ ‫مثال ‪-:‬‬ ‫أحسب قيمة ‪ABC+D‬‬ ‫‪.‬‬ ‫مثال ‪ :‬يوضح خطوات حساب المعادلة ‪ + A B‬إذا كانت قيمة = ‪A‬‬ ‫‪5‬و‪. S‬‬ ‫‪ -7‬النهاية ‪. Q‬‬ ‫‪-1‬‬ ‫‪8‬‬ .A=5 ، B=3 ، C=1 ، D=2‬‬ ‫إذا كانت قيمة‬ ‫‪4‬‬ ‫‪PUSH(S. ( 2‬‬ ‫‪ -6‬أجعل قيمة المعادلة أ تساوي قمة المكدسة ‪.A‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪( PUSH ( S .B‬‬ ‫‪2‬‬ ‫)‪(PUSH (S.‫د‪ /‬انهي الخطوة ) ‪. B‬‬ ‫‪OP2‬‬ ‫‪6‬‬ ‫‪5‬‬ ‫‪PUSH( S. ( 4‬‬ ‫‪ -5‬أنهي التكرار في الخطوة ) ‪. B=3‬‬ ‫‪1‬‬ ‫‪OP2 = POP(S‬‬ ‫‪3‬‬ ‫) ‪(Push ( S . A‬‬ ‫‪2‬‬ ‫) ‪Push ( S . Infix‬‬ ‫أضف " ( " إلى المكدسة و " ) " إلى نهاية المعادلة ‪. D‬‬ ‫‪1‬‬ ‫‪5‬‬ ‫التحويل من ‪ Infix notation‬إلى ‪-: Postfix notation‬‬ ‫خوارزمية التحويل ‪-:‬‬ ‫ليكن لدينا المعادلة ‪ Q‬مكتوبة بطريقة ‪.

-‬‬ ‫‪3‬‬ ‫‪P=A‬‬ ‫‪6‬‬ ‫‪P = ABC‬‬ ‫‪7‬‬ ‫‪P = ABC‬‬ ‫) ‪( PUSH ( S . C‬‬ ‫‪5‬‬ ‫‪P = ABC+‬‬ ‫‪POP ( S‬‬ ‫‪9‬‬ ‫‪P = ABC+D‬‬ ‫‪2‬‬ ‫‪P=A‬‬ ‫) ‪( PUSH ( S .‬‬ ‫إذا كان العنصر المعالج من ‪ Q‬هو معامل أضفه إلى ‪ ) P‬وهي المعادلة التي‬ ‫‪-3‬‬ ‫تمثل ‪. +‬‬ ‫‪10‬‬ ‫‪P = ABC+‬‬ ‫‪11‬‬ ‫‪P = ABC+‬‬ ‫‪9‬‬ ‫‪4‬‬ ‫‪P=A‬‬ ‫‪8‬‬ ‫‪P = AB‬‬ ‫‪12‬‬ ‫‪P = ABC+‬‬ .‬‬ ‫) ب (أضف الرمز الرياضي للمكدسة ) ‪ ( S‬وأنهي الخطوة ) ‪.‬‬ ‫مثال ‪-:‬‬ ‫من ‪ INFIX‬إلى ‪. 2‬‬ ‫‪ -8‬النهاية ‪. POSTFIX‬‬ ‫حول المعادلة ‪A-(B+C)*D‬‬ ‫‪1‬‬ ‫‪P = AB‬‬ ‫‪PUSH ( S .‬‬ ‫‪-4‬‬ ‫إذا كان العنصر المعالج من ‪ Q‬رمز رياضي نفذ الخطوات ) أ ( و )ب( ‪-:‬‬ ‫‪-5‬‬ ‫) أ ( أحذف من المكدسة كل رمز رياضي له نفس المستوى ) ‪ ( +‬في التنفيذ أو‬ ‫أعلى منه في التنفيذ وأضفه إلى ‪ P‬حتى أول قوس يساري ‪.( Postfix‬‬ ‫إذا كان العنصر المعالج من ‪ Q‬قوس يساري أضفه إلى المكدسة ‪.‬‬ ‫‪ -7‬انهي التكرار في الخطوة ‪. ( 5‬‬ ‫إذا كان العنصر المعالج من ‪ Q‬هو قوس يميني نفذ أ و ب ‪-:‬‬ ‫‪-6‬‬ ‫) أ ( أحذف من المكدسة ‪ S‬كل رمز حسابي وأضفه إلى ‪ P‬حتى تصل إلى أول‬ ‫قوس يساري ‪.‬‬ ‫) ب( أحذف القوس " ( " من المكدسة )‪ ( S‬ل تضفه إلى ‪ ، P‬أنهي الخطوة ) ‪( 6‬‬ ‫‪.‫عالج عناصر ‪ Q‬من اليسار إلى اليمين مكررًا الخطوات ‪ 6 – 3‬حتى تكون‬ ‫‪-2‬‬ ‫المكدسة فارغة ‪.

Maxarray = 50‬‬ ‫‪Type‬‬ ‫‪. A = 25‬‬ ‫موضحا شكل المكدسة ‪. C = 18 .‬‬ ‫‪.maxarray ]of char‬‬ ‫‪Var‬‬ ‫‪10‬‬ . POP ( S‬‬ ‫‪15‬‬ ‫‪14‬‬ ‫*‪P=ABC+D* P = ABC+D‬‬ ‫) ‪( POP ( S‬‬ ‫‪16‬‬ ‫‪P = ABC+D‬‬ ‫تمارين ‪-:‬‬ ‫‪ -1‬قم بحساب المعادلة *‪(AB – C (POSTFIX NOTATION‬‬ ‫‪C=2‬‬ ‫‪.‬‬ ‫‪ – 3‬مستخدمًا خوارزمية التحويل إلى ‪POSTFIX NOTATION‬‬ ‫قم بتحويل المعادلت التالية ‪-:‬‬ ‫‪A+B*C‬‬ ‫أ‪/‬‬ ‫ب‪A + B) * C ) /‬‬ ‫ج‪(A * B / C ) / (A . Program evalute‬‬ ‫‪Const‬‬ ‫‪. A = 17‬‬ ‫‪ -2‬قم بحساب المعادلة ‪+ * .('Value :=Ord (ch)-ord('0‬‬ ‫وماذا تعني العبارة‬ ‫‪.‫‪PUSH ( S‬‬ ‫‪13‬‬ ‫* ‪P = ABC+D‬‬‫‪POP ( S‬‬ ‫) ‪( + .‬‬ ‫حيث ‪B = 2 ..D) /‬‬ ‫تمرين‪-:‬‬ ‫البرنامج الفرعي التالي يقوم بحساب معادلة مكتوبة بـ ‪ postfix‬قم بتنفيذ البرنامج‬ ‫على الجهاز ‪. B=3‬‬ ‫حيث ‪.ABCD‬‬ ‫‪D = 13‬‬ ‫‪. Arr = array [ 1.

function oper (ch:char . Function eval ( x : arr ) :real Const . Maxstack = maxarray Type Stack = record .('value :=ord(ch)-ord('0 . St : stack . Top : 0.(Procedure push (var s:stack. Ch : char ..position := 1 . Position : 1.op1. Opnd2 . Value : real .st.x:real {body of push} .value end else {begin{operator is found .maxstack ] of real .maxarray .maxarray . Position : 1.. X : arr ..[ch:=arr[position while ch < > ' ' do { begin{ is found if op(ch)then begin ..maxstack . Opnd1 . End Var . Function pop (var s:stack):real { body of pop } . Item : array [ 1.op2 : real) : real {body of oper} {begin {function eval ..top:= 0 .(opnd2:=pop(st 11 . Function op(ch:char):boolean {body of op} .(push(st.

( [ write ( arr [ position . ‫خلف ذلك‬ : ‫ويمكن أن نكتب الدالة بالشكل التالي‬ .opnd2 .(eval:= pop(st .writeln . ' ' =:ch .end begin .value end if position < maxarray then begin .opnd1. Function op (ch:char):boolean Begin (('If (ord(ch)>=ord ('0')) and (ord(ch)<= ord('9 Then op:=true Else op:=false 12 .(opnd1:=pop(st .end -: ‫في التمرين السابق نجد‬ ‫ هي دالة اختبار هل الرمز المدخل رقم أم ل‬Op ‫الدالة‬ -1 False ‫ في حالة الرقم و‬true ‫حيث تقوم بإرجاع نتيجة منطقية‬ .. readln .(' writeln(' original postfix expression is for position:=1 to maxarray do .position:= position + 1 .(value:=oper (ch. ( [ read ( arr [ position .(push(st.end .((writeln('value of postfix is '.[ ch:=arr [ position end else .('write('enter your postfix expression for i:= 1 to maxarray do .eval(arr .

op2 : real ) : real Begin If ch in [' + ' .' .op2: '-' . End ‫ إذا كان العنصر رمز رياضي فإنها تقوم‬oper ‫نجد الدالة‬ -2 .1 .fact:real begin .. Function factorial ( n : integer ) : real Begin If n=0 then factorial:=1 Else . (initialize(s while (n>0) and (not full(s)) do begin .function factorial(n:integer ) : real var . ' / ' ] then Case ch of .oper :=op1 / op2: '/' end else . ' . ( 'writeln('error illegal operator . Function oper (ch:char . ‫بإجراء العملية الرياضية على العنصرين التاليين‬ : ‫فيمكن كتابة الدالة على الشكل التالي‬ .(push(s. n:=n-1 . ‫المضروب‬ -: ‫ أول ً كتابة البرنامج بدون استخدام المكدسة‬-4 .oper :=op1 + op2: '+' .( Factorial := n*factorial ( n . end 13 . End -: ‫كتابة البرنامج باستخدام المكدسة‬ .n .s:stack .oper :=op1 . end -: ‫التطبيق الثاني‬ ‫ باستخدام المكدسة أكتب برنامج يقوم بحساب‬-3 .op1.oper :=op1* op2: '*' . ' * ' .

‬‬ ‫‪ -2‬من عشري إلى ثماني ‪. fact:=n*fact‬‬ ‫‪.‬‬ ‫ج‪ -‬من عشري إلى سداسي عشري ‪.‬‬ ‫الحل ‪-:‬‬ ‫تستخدم الوحدة ‪ Stack‬التي تحتوي على كل البرامج الفرعية‬ ‫الخاصة بالمكدسة ‪.factorial:=-1‬‬ ‫‪. ( ' writeln( ' stack over flow‬‬ ‫‪end‬‬ ‫‪else‬‬ ‫‪begin‬‬ ‫‪.‬‬ ‫د‪ -‬من ثنائي إلى عشري ‪.‬‬ ‫‪ -2‬اجعل خارج القسمة مكان العدد ‪. factorial := fact‬‬ ‫‪.‬‬ ‫‪14‬‬ .‬‬ ‫‪ -1‬من عشري إلى ثنائي ‪.‬‬ ‫هـ‪ -‬من ثماني إلى عشري ‪.‬‬ ‫‪ -3‬قم بتفريغ المكدسة وأطبعها على الشاشة ‪.end‬‬ ‫‪.‬‬ ‫التحويل من عشري إلى ثنائي ‪-:‬‬ ‫الخوارزمية ‪-:‬‬ ‫‪ -1‬أقسم العدد على الرقم ‪ 2‬وأدفع بالباقي من القسمة داخل المكدسة ‪. (pop(s‬‬ ‫‪. end‬‬ ‫‪.‬‬ ‫و‪ -‬من سداسي عشري إلى عشري ‪.‬‬ ‫استمر في تنفيذ الخطوة )‪ (1‬و )‪ (2‬حتى نحصل على خارج قسمة تساوي صفر ‪.‫‪if (n>0) and (full(s))then‬‬ ‫‪begin‬‬ ‫‪. fact:= 1‬‬ ‫‪while not empty(s) do‬‬ ‫‪begin‬‬ ‫‪.end‬‬ ‫التطبيق الثالث‪-:‬‬ ‫التحويل من نظام عددي إلى نظام عددي آخر باستخدام‬ ‫المكدسة ‪.

‬‬ ‫‪ -2‬قم بكتابة برنامج يحول الرقم الثماني إلى نظيره العشري ‪.‬‬ ‫أنواع الصفوف ‪-:‬‬ ‫الصف الخطي ‪..‬مع ملحظة الرقم ‪10‬‬ ‫يقابله حرف ‪ A‬والرقم ‪ 11‬يقابله حرف الـ ‪ B‬و ‪ .(Push (s.‬‬ ‫مساعده ‪-:‬‬ ‫استخدم الدالة ‪ Addtop‬و الدالة ‪. linear Queue‬‬ ‫‪-1‬‬ ‫الصف الدائري ‪. Addstack‬‬ ‫الصفوف ‪Queues‬‬ ‫الصف هو قائمة من العناصر تحفظ بطريقة خطية بحيث يمكن‬ ‫حذف العناصر من طرف واحد يسمى المقدمة أو الرأس‬ ‫‪ head.X:=n mod 2‬‬ ‫‪.‫‪.‬الخ ‪.(Read (n‬‬ ‫‪Repeat‬‬ ‫‪.front‬بينما يتم إضافة العناصر من الطرف الخر ويسمى‬ ‫بالمؤخرة أو الذيل ‪ tail. Uses stack‬‬ ‫‪Begin‬‬ ‫‪.rear‬ويسمى بالـ ‪.. ((Writeln(pop(s‬‬ ‫‪.N:= n div 2‬‬ ‫‪.Readln‬‬ ‫‪. Circular Queue‬‬ ‫‪-2‬‬ ‫مفاهيم لتمثيل الصفوف ‪-:‬‬ ‫‪15‬‬ .End‬‬ ‫في حالة التحويل من عشري إلى ثماني تقوم بالقسمة على ‪ 8‬بدل ً‬ ‫من الرقم ‪. 2‬‬ ‫تمرين‪-:‬‬ ‫أكتب برنامج يقوم بتحويل الرقم العشري إلى نظيره‬ ‫‪-1‬‬ ‫السداسي عشري باستخدام المكدسة ‪ . FIFO‬‬ ‫)‪(first in first out‬‬ ‫الداخل أول ً هو الخارج أول ً ويطلق علية أيضا ً ‪first in fist services‬‬ ‫القادم أول ً يخدم أول ً ‪.x‬‬ ‫‪. Until n=0‬‬ ‫‪While not empty (s) do‬‬ ‫‪.(' Write ('input your decimal number‬‬ ‫‪.

‬‬ ‫‪Rear = 0‬‬ ‫‪Front = 1‬‬ ‫الصف الدائري والحالة البتدائية فيها المقدمة تساوي المؤخرة تساوي صفر ‪.‬‬ ‫‪16‬‬ .‬‬ ‫‪ -5‬شرح العمليات على الصف الدائري السابق ‪-:‬‬ ‫الحالة الولى الصف في حالة البتدائية المؤخرة والمقدمة تشيران‬ ‫‪.2‬‬ ‫المؤخرة خطوة واحدة للمام ‪.‬‬ ‫‪Rear = 0‬‬ ‫‪Front = 1‬‬ ‫‪ -3‬الصف الخطي والحالة البتدائية المقدمة تساوي المؤخرة تساوي صفر ‪.1‬‬ ‫إلى الصفر ‪.‫تختلف تمثيل الصفوف وشروط العمليات الخاصة به باختلف الحالة البتدائية للصف‬ ‫فيمكن تمثيل المفاهيم التالية ‪-:‬‬ ‫‪ -1‬الصف الدائري والحالة البتدائية المقدمة تساوي المؤخرة تساوي صفر ‪.‬‬ ‫تحليل الصف الدائري السابق ‪-:‬‬ ‫‪ -1‬الحالة البتدائية هو إن المقدمة والمؤخرة تشيران إلى الصفر ‪.‬‬ ‫‪ -3‬يكون الصف خالي إذا كانت المؤخرة والمقدمة تشيران إلى نفس الموقع كما‬ ‫في الحالة الولى والحالة الخامسة ‪.‬‬ ‫‪ -4‬يكون الصف ممتلئ إذا كان عدد عناصر الصف أقل بواحد من طول الصف‬ ‫الكلي كما في الحالة الثامنة ‪.‬‬ ‫الحالة الثانية تمت إضافة العنصر ‪ A‬إلى مؤخرة الصف وحركت‬ ‫‪.‬‬ ‫‪ -2‬المؤخرة دائمًا تشير إلى موقع خالي ‪.‬‬ ‫‪Rear = front = 0‬‬ ‫‪ -2‬الصف الدائري والحالة البتدائية المقدمة تساوي الواحد والمؤخرة تساوي‬ ‫الصفر ‪.‬‬ ‫‪Rear = 0‬‬ ‫‪Front = 0‬‬ ‫‪ -4‬الصف الخطي والحالة البتدائية المقدمة تساوي الواحد والمؤخرة تساوي‬ ‫الصفر ‪.

(Insert(Q. Rear .6‬‬ ‫المؤخرة خطوة واحدة للمام ‪. front‬حيث‬ ‫‪ front‬إلى موقع العنصر الول في الصف و ‪ rear‬إلى الموقع يقع خلف العنصر‬ ‫الخير في الصف مباشرة إي أنة يكون خاليًا بصفة دائمة ‪.‬‬ ‫‪Const‬‬ ‫‪. Q:Queue‬‬ ‫الدالة ‪-:empty‬‬ ‫‪17‬‬ .‬‬ ‫أنواع العمليات على الصف الدائري ‪-:‬‬ ‫عملية الضافة ‪ Insert‬وتأخذ وسيطين الول الصف والخر العنصر المراد‬ ‫‪-1‬‬ ‫إضافته للصف‬ ‫‪.‬‬ ‫الحالة السابعة تمت إضافة العنصر ‪ B‬إلى مؤخرة الصف وحركت‬ ‫‪.5‬‬ ‫المقدمة خطوة للمام )هنا المؤخرة تساوي المقدمة التي أصبحت خالية ‪. MaxQueue-1] of integer‬‬ ‫‪.7‬‬ ‫المؤخرة خطوة واحدة للمام ‪.End‬‬ ‫‪Var‬‬ ‫‪.3‬‬ ‫المؤخرة خطوة واحدة للمام ‪.‬‬ ‫الحالة الثامنة تمت إضافة العنصر ‪ C‬إلى مؤخرة الصف وحركت‬ ‫‪. front :integer‬‬ ‫‪.Item :array [ 0.8‬‬ ‫المؤخرة خطوة واحدة للمام ‪.‬‬ ‫الحالة الرابعة تم حذف العنصر ‪ A‬من مقدمة الصف الدائري‬ ‫‪.‬‬ ‫الحالة الخامسة تم حذف العنصر ‪ B‬من مقدمة الصف وتحريك‬ ‫‪.(Delete(Q‬‬ ‫العلن عن الصف ‪-:‬‬ ‫يمكن تمثيل الصف باستخدام المصفوفات وفي هذه الحالة يمكن أن نمثل الصف بسجل‬ ‫يحتوي على حقل لتمثيل المصفوفة وحقلين للمقدمة والمؤخرة ‪ rear .MaxQueue=100‬‬ ‫‪type‬‬ ‫‪Queue=record‬‬ ‫‪.‬‬ ‫الحالة السادسة تم إضافة العنصر ‪ A‬إلى مؤخرة الصف وحركت‬ ‫‪.‫الحالة الثالثة تمت إضافة العنصر ‪ B‬إلى مؤخرة الصف وحركت‬ ‫‪..4‬‬ ‫وحركت المقدمة خطوة للمام ‪.A‬‬ ‫‪ -2‬عملية الحذف ‪ Delete‬وتأخذ وسيط واحد وهو الصف حيث يتم حذف العنصر‬ ‫الموجود في المقدمة‬ ‫‪.

‬‬ ‫ا‬ ‫‪-4‬‬ ‫‪.‬‬ ‫‪-1‬‬ ‫‪ -2‬نوع الوسيط ‪ value parameter‬لن الختبار ل يؤثر على محتوى الصف ‪.‬‬ ‫‪-4‬الشرط هو أن المقدمة والمؤخرة تشيران إلى نفس الموقع ‪. false‬‬ ‫كتابة الدالة ‪-:FULL‬‬ ‫‪.End‬‬ ‫استخدام الدالة ‪-:full‬‬ ‫‪18‬‬ . ('If empty (Q) then writeln('Queue empty‬‬ ‫الدالة ‪-: full‬‬ ‫ا‬ ‫‪-1‬‬ ‫لوسائط الـ ‪ parameter‬هي الصف فقط ‪. Function full(Q:Queue):boolean‬‬ ‫‪Begin‬‬ ‫‪With Q do‬‬ ‫‪If rear+1 mod maxQueue = front then full :=true‬‬ ‫‪Else‬‬ ‫‪.‬‬ ‫ا‬ ‫‪-3‬‬ ‫لوظيفة اختبار إذا كان الصف ممتلئ أم ل ‪.‫الوسائط ‪ parameter‬هي الصف فقط ‪.‬‬ ‫ن‬ ‫‪-2‬‬ ‫وع الوسيط هي ‪ value parameter‬لن الختبار ل يؤثر على محتوى الصف ‪.rear := Q.Empty:= false‬‬ ‫‪.،‬‬ ‫‪-3‬الوظيفة اختبار إذا كان الصف خالي أم ل ‪. Function empty( Q:Queue):boolean‬‬ ‫‪Begin‬‬ ‫‪If Q. Full := false‬‬ ‫‪. Under flow‬‬ ‫فيمكن نداءها داخل البرنامج كالتي ‪-:‬‬ ‫‪.front then empty := true‬‬ ‫‪Else‬‬ ‫‪.‬‬ ‫‪-5‬الخوارزمية‪ :‬إذا كان الصف خالي ترجع قيمة منطقية ‪ true‬و إل ترجع ‪false‬‬ ‫كتابة الدالة‪-:‬‬ ‫‪.End‬‬ ‫استخدام الدالة ‪-: empty‬‬ ‫نحتاج لختبار الصف قبل أي عملية حذف فإذا كان الصف خالي فإن عملية الحذف‬ ‫تؤدي إلى ما يسمى ‪. rear +1 mod maxQueue = front‬‬ ‫لشرط هو أن‬ ‫ا‬ ‫‪-5‬‬ ‫لخوارزمية ‪-:‬إذا تحقق الشرط ترجع قيمة منطقية ‪ true‬وإل ‪.

‬‬ ‫ن‬ ‫‪-2‬‬ ‫وع الوسائط) الصف ‪ variable parameter‬لن الضافة سوف تغير من محتوى‬ ‫الصف بينما العنصر ‪.(Procedure insert (var Q:Queue .item [Q. Q. Q.End‬‬ ‫الدالة ‪-: delete‬‬ ‫ا‬ ‫‪-1‬‬ ‫لوسائط الـ ‪ parameter‬هو الصف فقط ‪.rear]:= x‬‬ ‫‪. x : integer‬‬ ‫‪Begin‬‬ ‫‪If full (Q) then‬‬ ‫‪('Writeln ('Queue is full‬‬ ‫‪Else‬‬ ‫‪Begin‬‬ ‫‪.‬‬‫أ‪ -‬أسند العنصر إلى مؤخرة الصف ‪.‬‬ ‫ن‬ ‫‪-2‬‬ ‫وع الوسيط ‪ variable parameter :‬لن الحذف سوف يغير من محتوى الصف‬ ‫‪19‬‬ .‬‬ ‫كتابة الجراء ‪-:‬‬ ‫‪.('If full (Q) then writeln ('Queue is full‬‬ ‫الجراء ‪-:insert‬‬ ‫ا‬ ‫‪-1‬‬ ‫لوسائط الـ ‪parameter‬هما الصف والعنصر المراد إضافته ‪.‬‬ ‫فيمكن نداءها داخل البرنامج كالتي ‪-:‬‬ ‫‪.‬‬ ‫ا‬ ‫‪-4‬‬ ‫لخوارزمية ‪-:‬‬ ‫ اختبر إذا كان الصف ممتلئ أعطي رسالة خطأ وإل نفذ أ و ب ‪.rear := Q.End‬‬ ‫‪.rear +1 mod maxQueue‬‬ ‫‪.‬‬ ‫ب‪ -‬قم بتحريك المؤخرة بمقدار واحدة ‪. (value parameter‬‬ ‫ا‬ ‫‪-3‬‬ ‫لوظيفة يقوم الجراء بدفع العنصر إلى مؤخرة الصف ‪.‫تستخدم لختبار الصف قبل أي عملية إضافة فإذا كان الصف ممتلئ فإن إضافة أي‬ ‫عنصر تؤدي إلى ما يسمى ‪ ) over flow‬الفيضان ( ‪.

‫‪-3‬‬ ‫لوظيفة ‪ :‬حذف العنصر الموجود في مقدمة الصف ‪.‬‬‫أ‪ -‬أحذف العنصر الموجود في المقدمة ‪.(Procedure initialize ( var Q : queue‬‬ ‫‪Begin‬‬ ‫‪.front:= 0‬‬ ‫‪.front :=Q.Q.‬‬ ‫‪-4‬‬ ‫الشرط هو جعل المقدمة والمؤخرة تشيران إلى الصفر ‪.Q.End‬‬ ‫الجراء ‪-: Initialize‬‬ ‫‪-1‬‬ ‫الوسيط ‪ parameter‬هو الصف فقط ‪. variable parameter‬‬ ‫‪-3‬‬ ‫الوظيفة إفراغ محتويات الصف أي إرجاعها إلى الحالة‬ ‫البتدائية ‪.rear:= 0‬‬ ‫‪.‬‬ ‫ب‪ -‬قم بتحريك المقدمة بمقدار واحد ‪.‬‬ ‫‪-4‬‬ ‫لخوارزمية ‪-:‬‬ ‫ اختبر إذا كان الصف خالي أعطي رسالة خطأ وإل نفذ أ و ب ‪.‬‬ ‫‪-2‬‬ ‫نوع الوسيط ‪.front +1 mod maxQueue‬‬ ‫‪.item[Q.front‬‬ ‫‪.‬‬ ‫كتابة الدالة ‪-:‬‬ ‫‪Function delete(var Q:Queue):integer‬‬ ‫‪Begin‬‬ ‫‪('If empty (Q) then writeln('Queue is empty‬‬ ‫‪Else‬‬ ‫‪Begin‬‬ ‫‪.End‬‬ ‫‪.End‬‬ ‫‪20‬‬ ‫ا‬ ‫ا‬ .[Delete :=Q.‬‬ ‫‪.Q.

I:integer‬‬ ‫‪Begin‬‬ ‫‪If Q.‬‬ ‫عر‬ ‫الشر‬ ‫الخوا‬ ‫‪-3‬‬ ‫رزمية إذا كانت المقدمة أكبر من المؤخرة فإن طباعة العنصر تتم بحلقة تكرارية‬ ‫تنازلية )‪ (for downto‬وإل طباعة العنصر تتم بحلقة تكرارية تصاعدية )‪for-‬‬ ‫‪.‬‬ ‫نوع‬ ‫‪-4‬‬ ‫الوسيط ‪ value parameter‬لن الطباعة ل تؤثر على محتويات الصف ‪.‬‬ ‫‪-2‬‬ ‫ط ‪ :‬حلقه تكرارية بعدد الخانات الممتلئة في الصف ‪.item[i‬‬ ‫‪Else‬‬ ‫‪for I :=Q . end‬‬ ‫‪21‬‬ .‫الجراء ‪-: display‬‬ ‫‪-1‬‬ ‫ض محتويات الصف ‪. (' '. (to‬‬ ‫الوسيط ‪ :‬الـ ‪ parameter‬هو الصف فقط ‪.rear then‬‬ ‫‪For I := Q.(Procedure display (Q:Queue‬‬ ‫‪Var‬‬ ‫‪.[Write ( Q.front downto Q. ( ' '.rear do‬‬ ‫‪. [write (Q.‬‬ ‫كتابة البرنامج ‪-:‬‬ ‫‪.fron > Q.item[i‬‬ ‫‪.rear do‬‬ ‫‪.front to Q.

front = 1‬‬ ‫‪ -2‬يكون الصف خالي إذا كانت المقدمة أكبر من المؤخرة ‪.‬‬ ‫العلن عن الصف الخطي‪-:‬‬ ‫هو نفس العلن عن الصف الدائري فقط في هذه الحالة طول المصفوفة تبدأ من‬ ‫ل من الصفر‪.‬‬ ‫يمكن‬ ‫‪-2‬‬ ‫أن يتحقق شرط المتلء وتكون هنالك خانات خالية كما في الحالة السابقة ‪.‬‬ ‫أو ً‬ ‫المؤ‬ ‫‪-4‬‬ ‫خرة ل تشير إلى مكان خالي وبذلك يمكن استغلل كل كائنات الصف ‪.‫الصف الخطي‬ ‫الصف الخطي والحالة البتدائية المقدمة تساوي الواحد والمؤخرة تساوي العنصر ‪.‬‬ ‫‪Rear = maxQueue‬‬ ‫والرسمة التالية توضح شروط الصف الخطي السابق ‪.‬‬ ‫في‬ ‫‪-3‬‬ ‫ل ثم إدخال العنصر ثانية بينما في الحذف حذف العنصر‬ ‫الضافة تحرك المؤخرة أو ً‬ ‫ل ثم تحرك المقدمة‪.‬‬ ‫شروطه ‪-:‬‬ ‫‪ -1‬الحالة البتدائية ‪. rear=0 .‬‬ ‫طول الصف يحتوي على خمسة عناصر فقط ‪.‬‬ ‫ملحظات على الصف الخطي‪-:‬‬ ‫إذا‬ ‫‪-1‬‬ ‫ساوت المقدمة المؤخرة فإن الصف يحتوي على عنصر واحد فقط ‪.‬‬ ‫الواحد بد ً‬ ‫‪22‬‬ . rear < front‬‬ ‫‪ -3‬يكون الصف ممتلئ إذا كانت المؤخرة تساوي طول الصف ‪.

function delete (var Q:Queue):integer begin ('if empty (Q) then write ('Queue is empty 23 . Item:array[1.End -: delete ‫الدالة‬ .(Empty := (Q..front > Q.rear = 0 .front=1) and (Q.End -: ‫ويمكن كتابة الدالة بالعبارات التالية‬ . MaxQueue = 100 Type Queue = record . Full:=Q. front : integer . Rear . Function empty (Q:Queue):boolean Begin .Function Full (Q : Queue ):Boolean Begin If Q.End Var .End : ‫ويمكن كتابة الدالة بطريقة أخرى‬ . Empty := false .Const .rear = maxQueue then full := true Else . End -: empty ‫الدالة‬ .rear then empty := true Else .maxQueue] of integer . Full :=false .Function full (Q:Queue):boolean Begin . Function empty(Q:Queue):boolean Begin If Q. Q:Queue -: Full ‫الدالة‬ .rear = max .

‬‬ ‫‪Rear=front=0‬‬ ‫‪2‬اكتب برنامج يحاكى عمل الصف الخطى والحالة البتدائية المقدمة‬‫تساوى الواحد والمؤخرة تساوى الصفر ‪. front=1‬‬ ‫‪3‬اكتب برنامج يقوم بالبحث عن عنصر محدد في المصفوفة‪.‬‬‫مثال‬ ‫اكتب برنامج يقوم بدمج مصفوفتين‪.‫‪else‬‬ ‫‪begin‬‬ ‫‪.end‬‬ ‫أمثلة محلوله ‪:‬‬ ‫‪1.‬‬ ‫الجراء ‪initialize‬‬ ‫‪.(procedure initialize(var q:queue‬‬ ‫‪begin‬‬ ‫‪.q. End‬‬ ‫ملحوظة ‪-:‬‬ ‫للستفادة من الخانات الخالية السابقة نقوم بإرجاع الصف‬ ‫إلى الحالة البتدائية متى ما أصبح الصف فارغًا ‪.‬‬ ‫‪ -1‬كرر من مقدمة الصف الثاني إلى مؤخرة الصف الثاني‬ ‫‪-1‬‬ ‫حرك مقدمة الصف الول‪.front‬‬ ‫‪.rear then initialize (Q‬‬ ‫‪.‬‬‫البرنامج‪:‬‬ ‫‪24‬‬ . rear=0 . (If Q.rear:=0‬‬ ‫‪.‬‬ ‫‪-2‬‬ ‫اسند عنصر العداد إلي مقدمة الصف الول‪.‬اكتب برنامج يحاكى عمل الصف الدائري والحالة البتدائية المقدمة والمؤخرة‬ ‫تساويان الصفر ‪.fornt:=0‬‬ ‫‪.End‬‬ ‫‪. Q front :=Q.item[Q.front + 1‬‬ ‫‪.front >Q.q.‬‬ ‫خوازرميه دمج صفين خطين‬ ‫إذا كان طول الصف الول – موقع مؤخرة الصف الول )رقم الحجرة (اقل من‬ ‫طول الصف الثاني أعطى رسالة بعدم امكانيه الدمج وآل‪. [delete :=Q.‬‬ ‫‪2‬اجعل الصف الثاني فارغَا ‪.

’ is found Else .(Procedure search(q:queue.front>q. ‫اكتب برنامج يقوم بالبحث عن عنصر في الصف الخطى‬ -:‫عملية البحث في الصف الخطى‬ ..’ is not found .front] then .rear then writeln(target.front<=q.front+1 .Exit 25 .rear do Begin .(’if q.front] then writeln(target.end -:‫لزيادة كفاءة الجراء السابق نقوم بالتي‬ ‫عند العثور على الهدف نعطى رسالة بذلك ثم نخرج من البرنامج حتى ل يأخذ البرنامج‬ .Readln .rear:=Q1.front To Q2.end :‫مثال‬ .’ is found .[Q1.(Procedure addqueue(var Q1:queue1.item[Q1.item[q.front:=q.(Initialize(Q2 .rear+1 .('Write('can not addqueue Else For I:=Q2.rear]:=Q2.Readln .rear) do Begin (’If target=q.q.end .Q1.I:integer Begin If (Maxqueue1-(Q1.(’Writeln(target. ‫زمن اكبر في عملية البحث‬ .rear)<maxqueue2)then .target:integer Begin While(q.var Q2:queue2 Var .End .‫لنه إذا تم العثور على الهدف فليس هنالك حوجه للستمرار في عملية البحث‬ -:‫فيعدل البرنامج كالتي‬ If target=q.item[q.item[I .

‬‬ ‫ل‬ ‫‪-2‬‬ ‫اتحدث مشكله ‪overflow‬لن المساحة في الزاكره تكون مفتوحة غير محدده ‪.front:=q.End‬‬ ‫‪Var‬‬ ‫‪.R.Pointer_variable:^data type‬‬ ‫أو‬ ‫‪Type‬‬ ‫‪.‬‬ ‫العلن عن المؤشرات‪:‬‬ ‫‪Var‬‬ ‫‪.‬‬ ‫المؤشرات ‪Pointers‬‬ ‫هي متغيرات تمكن الوصول إلى حجرات الزاكره أثناء تنفيذ البرنامج فهي تشير‬ ‫دائمَا إلى عنوانين في الزاكره فهي تستخدم في بنيه البيانات المتحركة‬ ‫)‪.‫‪End‬‬ ‫‪Else‬‬ ‫‪.Node_pointer=^node‬‬ ‫‪Node=record‬‬ ‫‪.Pointer_variable=^data type‬‬ ‫أمثلة‪:‬‬ ‫‪Type‬‬ ‫‪.( Dynamic data type‬‬ ‫وبنية البيانات المتحركة عبارة عن مجموعه من العناصر تسمى عقدا ‪nodes .Name:string‬‬ ‫‪.Age:integer‬‬ ‫‪.q.‬‬ ‫وهى في الحقيقة سجلت مرتبطة مع بعضها البعض بواسطة المؤشرات‪.Q:node_pointer‬‬ ‫‪26‬‬ .front+1‬‬ ‫فالعبارة ‪ exit‬تؤدى للخروج من البرنامج‪.‬‬ ‫مميزات بنيه البيانات المتحركة المتحركة‬ ‫‪-1‬‬ ‫يمكن أن تتمدد وتنكمش أثناء تنفيذ البرنامج ‪.P.

X:^integer‬‬ ‫‪.(New(Q‬‬ ‫‪.(New(R‬‬ ‫يمكن التعبير على العبارة السابقة في الزاكره كالتي‪-:‬‬ ‫‪(New(p‬‬ ‫‪emaN‬‬ ‫‪egA‬‬ ‫‪P‬‬ ‫‪(New(Q‬‬ ‫‪emaN‬‬ ‫‪egA‬‬ ‫‪Q‬‬ ‫‪(New(R‬‬ ‫‪Name‬‬ ‫‪Age‬‬ ‫‪R‬‬ ‫إسناد المؤشرات‬ ‫هو أن يشير المؤشر إلي المكان الذي يشير إليه مؤشر آخر‬ ‫ل‪:‬‬ ‫فمث َ‬ ‫‪.Y:^string‬‬ ‫العبارة ‪New‬‬ ‫تقوم تخصيص مساحة تخزين في الزاكره أثناء تنفيذ البرنامج ‪.P:=Q‬‬ ‫‪27‬‬ .‬‬ ‫الصيغة العامة‪:‬‬ ‫‪.(New(Pointer_variable‬‬ ‫مثال‪:‬‬ ‫‪.(New(p‬‬ ‫‪.‫‪.

Q:nodepointer‬‬ ‫‪Begin‬‬ ‫‪.Q^.P:=Q‬‬ ‫‪.‫‪ P‬اصبح يؤشر إلى نفس الموقع الذي يشير إليه‬ ‫فهذا يعنى أن المؤشر‬ ‫المؤشر ‪.age:integer‬‬ ‫‪.End‬‬ ‫فان خرج البرنامج يكون كالتي ‪-:‬‬ ‫‪Ahmed 75 Ahmed Ali‬‬ ‫‪28‬‬ .nodepointer =^node‬‬ ‫‪node=record‬‬ ‫‪.(New(P‬‬ ‫‪.P.field‬‬ ‫ل للوصول لحقل السم في السجل ‪ P‬نكتب ‪P^.name‬‬ ‫‪.R:=P‬‬ ‫‪.(Writeln(P^.'P^.P^.age‬‬ ‫مثال ‪:‬‬ ‫‪type‬‬ ‫‪.name:='ahmed‬‬ ‫‪.R.R^.name:='ali‬‬ ‫‪.(New(R‬‬ ‫‪.name.Q‬‬ ‫التعامل مع حقول العقده‬ ‫الصيغة العامة للوصول لحقل معين في العقده )‪(pointer_name^.age:=25‬‬ ‫‪.name:string‬‬ ‫‪.(New(Q‬‬ ‫‪.name‬‬ ‫مث َ‬ ‫وللوصول لحقل العمر في السجل ‪P‬نكتب ‪P^.P^.name.end‬‬ ‫‪var‬‬ ‫‪.age.age:=75‬‬ ‫‪.'Q^.Q^.

‬‬ ‫تمرين ‪:‬‬ ‫السلسلة المتصلة التالية والمؤشرات ‪P1.P2.P2^.next:=P3^.next‬‬ ‫‪.(Dispose(pointername‬‬ ‫القيمة ‪Nil‬‬ ‫تمثل قيمة في الذاكرة وهو عنوان اللشىء ‪.P4^.‬‬ ‫‪.2‬‬ ‫‪.P3^.1‬‬ ‫.P3.data .‫العبارة ‪Dispose‬‬ ‫هو إجراء يقوم بإنهاء تخصيص المكان المحجوز للمؤشر في الذاكرة ‪.next:=P2^.data:=P1^.data:=P^.3‬‬ ‫‪.4‬‬ ‫‪29‬‬ ‫‪head‬‬ .next.data .next:=P1^.P4^.‬‬ ‫الصيغة العامة‬ ‫‪.P2^.P4‬‬ ‫‪P4‬‬ ‫‪rat‬‬ ‫‪P2‬‬ ‫‪P3‬‬ ‫‪ewe‬‬ ‫‪dog‬‬ ‫‪P1‬‬ ‫‪cat‬‬ ‫اعد رسم السلسلة بعض إجراء إي عمليه ووضح الخطاء إذا‬ ‫وجد خطاء في العمليات ‪.data‬‬ ‫‪.next:=P1‬‬ ‫‪.next‬‬ ‫‪.‪P4^.P4:=P1^.next.P3^.

‬‬ ‫تستخدم اللوائح المنغلقة على سبيل المثــال فــي المترجمــات ونظــم التشــغيل ونظــم‬ ‫إدارة قواعد البيانات‪.‬‬ ‫تستخدم السجلت في بناء اللــوائح المنغلقــة وابســط ســجل يتكــون مــن حقليــن حقــل‬ ‫للبيانات وحقل آخر مؤشر إلى السجل التالي ‪.Next:lptr‬‬ ‫‪.‬‬ ‫‪Type‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪-1‬‬ ‫إنشاء مؤشر من نوع ‪Lptr.Lptr=^listnode‬‬ ‫‪Listnode=record‬‬ ‫‪.End‬‬ ‫إنشاء اللئحة المنغلقة‬ ‫الخوارزمية لنشاء اللئحة المنغلقة ‪.‬‬ ‫العلن عن عقده مكونه من حقلين ‪.P:lptr‬‬ ‫‪30‬‬ .Data:integer‬‬ ‫‪.‬‬ ‫ومؤشر العقده الولى تسمى الرأس ‪ head‬والعقده أل خيره تشير إلى ‪nil‬‬ ‫وبذلك نحصل على طرف لئحة خاليه ‪.Function creatlist:lptr‬‬ ‫‪Var‬‬ ‫‪.‫القوائم المتصلة ‪) linked list‬اللئحة المنغلقة(‬ ‫هي عبارة عن سلسله من العقد بحث أن كل عقده مرتبطة بالعقده التي تليها‪.‬‬ ‫‪-2‬‬ ‫اجعل المؤشر يشير إلى ‪Nil.

Next:=nil‬‬ ‫‪.Value:integer‬‬ ‫‪Begin‬‬ ‫‪.‬‬ ‫انش‬ ‫‪-1‬‬ ‫ىء عقــده جديــده مــن النــوع ‪ listnode‬تحتــوى علــى العــدد المــراد إضــافته إلــى‬ ‫اللئحة ‪.‬‬ ‫فيتم إنشاء مؤشر العقده الولى الـ ‪head .End‬‬ ‫ولنشاء اللئحة المنغلقة نقوم باستدعاء الدالة ‪ creatlist‬في البرنامج‬ ‫الرئيسي ‪.Newlptr:lptr‬‬ ‫‪.‫‪Begin‬‬ ‫‪.(New(newlptr‬‬ ‫‪With newlptr^ do‬‬ ‫‪Begin‬‬ ‫‪.Creatlist:=p‬‬ ‫‪.‬‬ ‫‪31‬‬ .('Writeln('enter integer value to add to the list‬‬ ‫‪.End‬‬ ‫‪.‬‬ ‫‪.End‬‬ ‫إضافة عقده جديده‪:‬‬ ‫خوارزمية الضافة ‪.‬‬ ‫فنكتب ‪.(New(p‬‬ ‫‪.(Read(value‬‬ ‫‪.‬‬ ‫ويمكن رسم شكل المؤشر في الذاكرة كالتي بعض العبارة‬ ‫السابقة ‪.‬‬ ‫‪nil‬‬ ‫‪head‬‬ ‫ولضافة آي عقده للئحة فإننا نقوم بإنشاء عقده جديده عن طريق الدالة ‪getnode‬‬ ‫وهذه العقده الجديدة تكون النوع ‪ listnode‬ونشير إليها بمؤشر من النوع ‪newlptr‬‬ ‫ونقرا قيمه الحقل ‪ data‬ونجعل المؤشر ‪ next‬يشير إلى النهاية ‪nil.Getnode:=newlptr‬‬ ‫‪.Data:=value‬‬ ‫‪.Function getnode:lptr‬‬ ‫‪Var‬‬ ‫‪.head:=creatlist.

data<head^.data>head^.(Procedure add(var head.next:=temp End Else 32 .Head^.Newptr^.next .Head:=newptr .next^.data)then Begin .newptr:lptr Var . ‫قبل العقده الولى‬ ‫إذا‬ -3 ‫( مــع العقــده‬2) ‫كان العدد في العقده الجديدة اكبر من العدد في العقــده الولــى اجــر‬ .next:=newptr .Temp:=head .Temp:=head^.data) then writeln('this value is ('already in the list Else if (newptr^.next:=temp End Else if (newptr^.data=head^.data<head^.Temp:lptr Begin If head=nil then head:=newptr Else if (newptr^.Newptr^.data)then Begin . ‫وصلت نهاية اللئحة أضف العقده الجديدة في آخر اللئحة‬ :‫باستخدام النداء الذاتي يمكن كتابة داله الضافة كالتي‬ .data)and(newptr^.‫إذا‬ -2 ‫كان العدد في العقده الجديدة اصغر من العدد في العقده الولى أضف العقده الجديدة‬ . ‫التالية مالم تصل إلى نهاية اللئحة‬ ‫إذا‬ -4 .

data=x then‬‬ ‫‪Begin‬‬ ‫‪.data=x then‬‬ ‫‪Begin‬‬ ‫‪.(Procedure search(head:lptr.Pred:=head‬‬ ‫‪33‬‬ .Pred:=nil‬‬ ‫‪End‬‬ ‫‪Else if head^.next^.'is not found‬‬ ‫‪.next‬‬ ‫‪.Target:=head‬‬ ‫‪Pred:=nil‬‬ ‫‪End‬‬ ‫‪Else if head^.('Writeln(x.pred:lptr‬‬ ‫‪Begin‬‬ ‫‪If head=nil then‬‬ ‫‪Begin‬‬ ‫‪.‫‪.End‬‬ ‫البحث عن الهدف في اللئحة المنغلقة‪:‬‬ ‫خوارزمية البحث ‪:‬‬ ‫إذا‬ ‫‪-1‬‬ ‫كانت اللئحة خاليه من العقد أعطى قيمة ‪ nil‬للمؤشرين ‪target.(Add(head^.Target:=nil‬‬ ‫‪.Target:=head^.pred‬‬ ‫‪-2‬قارن بين الهدف والعقده الولى إذا كان الهدف يساوى العــدد فــي العقــده الولــى‬ ‫دع المؤشر ‪ target‬يشير إليها واجعل ‪ pred‬يشير إلى ‪nil‬‬ ‫إذا‬ ‫‪-3‬‬ ‫كان الهدف ل يساوى قيمة العدد في العقده الولى انتقل لمقارنته مع العقده التاليــة ‪.newptr‬‬ ‫‪.x:integer.‬‬ ‫إذا كان الهدف يساوى قيمة العدد في العقده التالية دع المؤشــر ‪ target‬يشــير إليهــا‬ ‫ودع المؤشر ‪ pred‬يشير إلى العقده التي قبلها ‪.(3‬‬ ‫إ‬ ‫‪-5‬‬ ‫ذا وصلت إلى نهاية اللئحة ولم تجد الهدف أعطى قيمة ‪ nil‬للمؤشرين‬ ‫‪.var target.next.target.‬‬ ‫‪-4‬إذا كان الهدف ل يساوى قيمة الحقل)العدد( في العقده التالية كرر الخطوة )‪.pred‬‬ ‫البرنامج‬ ‫‪.

‬‬ ‫ب‪-‬استخدم الدالة ‪ dispose‬للغاء العقده الولى ‪.pred‬‬ ‫إذا‬ ‫‪-2‬‬ ‫كان المؤشر ‪ target‬يشير إلى ‪ nil‬اطبع رسالة بعدم وجود العقده المراد حذفها‬ ‫‪.'is not found‬‬ ‫‪.x.(Else search(head^.‫‪End‬‬ ‫‪Else if (x>head^.2‬‬ ‫خدم الدالة ‪ dispose‬للغاء العقده المشار إليها بـ ‪.target‬‬ ‫برنامج حذف عقده من لئحة منغلق ‪.Pred:=nil‬‬ ‫‪End‬‬ ‫‪.data)then‬‬ ‫‪Begin‬‬ ‫‪.x:integer‬‬ ‫‪34‬‬ .(Procedure delete(var head:lptr.next‬‬ ‫اســـت‬ ‫‪.('Writeln(x.‬‬ ‫إذا‬ ‫‪-3‬‬ ‫كان المؤشر ‪ target‬ل يشير إلى ‪.1‬‬ ‫ل ‪.‬‬ ‫أ‪-‬دع المؤشر ‪ head‬يشير إلى العقده الثانية‪.‬‬ ‫إذا‬ ‫‪-4‬‬ ‫كان المؤشران ‪ target.target.target.next^.End‬‬ ‫حذف عقده من اللئحة المنغلقة ‪.dispose‬‬ ‫خوارزمية حذف عقده من اللئحة المنغلقة‪:‬‬ ‫اســـت‬ ‫‪-1‬‬ ‫خدم برنامج البحث في تحديد قيم المؤشرين ‪.Target:=nil‬‬ ‫‪.pred‬‬ ‫‪.‬‬ ‫الغرض لوجود مؤشرين هو جعل المؤشر قبل العقده المراد حذفها يشــير إلــى نفــس‬ ‫المكان الذي يشير إليها مؤشر العقده المراد حذفها حتى يتسنى حــذف العقــده المــراد‬ ‫حذفها بالدالة ‪.next.pred^.nil‬بينما المؤشر ‪ pred‬يشير إلى ‪ nil‬اجر ما‬ ‫يلي )وهذا يعنى أن العقده المراد حذفها هي العقده الولى (‪.pred‬ل يشيران إلى ‪ nil‬اجر ما يلي‪.next=target^.‬‬ ‫اجع ـ‬ ‫‪.‬‬ ‫لحذف عقده في اللئحة نقوم بعملية البحث عن تلك العقده بالجراء ‪search‬‬ ‫التي ترجع مؤشرين واحده تشير إلى العقدة المراد حذفها والثانية تشير إلى مــا قبــل‬ ‫العقده المراد حذفها ‪.data)and(x<head^.‬‬ ‫‪.

‫اللئحة المنغلقة‬ :‫خوارزمية طباعة محتويات اللئحة المنغلقة‬ -:‫ اجر مايلى‬nil ‫ ل تساوى‬target ‫طالما أن المؤشر‬ .1 .Head:=head^.Pred^.x.target.pred ('If target=nil then writeln('this node is not found Else if (target=head)and(pred=nil)then Begin .next:=nil .(Search(head.next=nil then Begin .nextr .(Dispose(target End Else Begin .data ‫اطبع قيمة الـ‬.head^.Pred^.(Procedure printlist(head:lptr Begin While head<>nil do Begin 35 .2 ‫برنامج لطباعة محتويات اللئحة المنغلقة‬ .Target.next .(Dispose(target End Else if target^.head=head^.Var .next:=target^.next ‫اجعل‬.pred:lptr Begin .End .End :‫طباعة محتويات اللئحة المنغلقة‬ ‫عند الحوجة لسترجاع البيانات المحزنة نقوم بطباعة محتويات‬ .

End‬‬ ‫‪.‬‬ ‫خوارزميات الترتيب‬ ‫أ‪.data‬‬ ‫‪.‬الترتيب الخارجي ‪-:‬‬ ‫وفيه نوع واحد وهو الترتيب بالدمج ‪merge sort‬‬ ‫‪36‬‬ .(Writeln(head^.Head:=head^.‫‪.next‬‬ ‫‪.End‬‬ ‫الترتيب الـ ‪Sort‬‬ ‫إذا كان لدينا مجموعة من العناصر في مصفوفة معينة فان هنالك طرق عديدة لترتيب هذه‬ ‫العناصر تصاعديا أو تنازليا‪.‬الترتيب الداخلي‪-:‬‬ ‫الترتيب بالفقاع ‪bubble sort‬‬ ‫‪-1‬‬ ‫الترتيب بالختيار ‪selection sort‬‬ ‫‪-2‬‬ ‫الترتيب بالدخال ‪insertion sort‬‬ ‫‪-3‬‬ ‫‪quick sort‬‬ ‫الترتيب السريع‬ ‫‪-4‬‬ ‫‪heap sort‬‬ ‫الترتيب المقيد‬ ‫‪-5‬‬ ‫‪shell sort‬‬ ‫الترتيب بالتجزئة‬ ‫‪-6‬‬ ‫ب‪.

‬‬ ‫ب‪.5‬إنهاء التكرار في الخطوة ‪.‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫]‪]A[12]A‬‬ ‫‪5‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫]‪2]A‬‬ ‫]‪1]A‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫]‪2]A‬‬ ‫]‪1]A‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫]‪2]A‬‬ ‫]‪1]A‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫]‪2]A‬‬ ‫]‪1]A‬‬ ‫‪17‬‬ ‫‪17‬‬ ‫‪17‬‬ ‫‪37‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪12‬‬ ‫‪12‬‬ ‫‪17‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪8‬‬ ‫‪8‬‬ ‫‪[A[1‬‬ ‫‪[12‬‬ ‫‪A[1‬‬ ‫‪4‬‬ ‫‪[A[1‬‬ ‫‪5‬‬ ‫‪[A[1‬‬ ‫‪12‬‬ ‫‪8‬‬ ‫‪8‬‬ ‫‪4‬‬ ‫‪7‬‬ ‫‪7‬‬ ‫‪7‬‬ ‫‪7‬‬ .3‬كـــرر الخطـــوة) ‪ N-1 (2‬مـــرة حـــتى نصـــل لمقارنـــة العنصـــر الول مـــع الثـــاني‬ ‫‪ [A[1]<A[2‬وعندها تكون المصفوفة قد ترتبت‪. [A[N‬‬ ‫‪.‬‬ ‫خوارزمية البحث بالفقاع‪-:‬‬ ‫‪. [A[N‬‬ ‫‪.3‬كرر الخطوتين أوب بحيث ‪J<=N-K‬‬ ‫إذا كان ‪ [A[J]>A[J+1‬بدل العنصرين مع بعض‪.‫الهدف من تعدد الخوارزميات هي زيادة كفاءة البرامج‪.1‬قارن العنصر الول مــع العنصــر الثــاني بحيــث نضــعه فــي الــترتيب ‪ [A[1]<A[2‬ثــم‬ ‫نقارن العنصر الثاني مع الثالث ونضعهم في الــترتيب ‪ [A[2]<A[3‬وتســتمر هــذه العمليــة‬ ‫حتى آخر عنصرين ‪ [A[N-1]<A[N‬وعند النتهاء من هذه الخطوة يكــون اكــبر عنصــر‬ ‫قد وضع في آخر ترتيب ‪.1‬كرر الخطوتين ‪2‬و ‪ 3‬بحيث ‪K= 1 TO N-1‬‬ ‫‪.‬‬ ‫نفرض أن لدينا مصفوفة ‪ A‬وعدد عناصرها ‪ N‬في هذا النوع من الترتيب نتبع آلتي ‪-:‬‬ ‫‪.‬اجعل ‪J=J+1‬‬ ‫‪.1‬‬ ‫والشكل التالي يوضح لنا هذه الخطوات‪.2‬اجعل ‪J=1‬‬ ‫‪.‬‬ ‫الترتيب بالفقاع ‪bubble sort‬‬ ‫في هذا النوع تطفو اصغر عناصر المصفوفة في أعلى المصفوفة‪.2‬كرر الخطوة )‪ (1‬بحيث تنهى المقارنة عند العنصر قبل الخير وعنــدها يكــون هــو اكــبر‬ ‫عنصر في المصفوفة بعد العنصر ‪.4‬إنهاء التكرار في الخطوة ‪.3‬‬ ‫‪.

A[j+1]:=temp The sorting .J:=1 While j<=(n-k) do Begin If a[j]>a[j+1] then Begin .End For I:= 1 to n do .n] of integer .k.‫النصف من عمليات التبديل فبالتالي فان الترتيب بالفقاع غير فعال في عمليات الترتيب‬ 38 .[Temp:=a[j .([Read(a[I For k:=1 to n-1 do Begin ..J: =j+1 .I.A:array [1.4 5 7 [A[1 8 12 17 .([Write(a[I .End The output .[A[j]:=a[j+1 .j.Program bubble Const .N=10 Var .End ‫ من عمليات المقارنة وكذلك نحتاج إلى‬n*(n-1)/2 ‫في هذه الطريقة نحتاج إلى عدد‬ .End .temp:integer Begin For I:=1 to n do The intering .

‬‬ ‫الفكرة الساسية هو البحث عن اصغر عنصر في المصفوفة واستبدالها مع العنصر الول‬ ‫‪ [a[i‬ثم نبحث عن اصغر عنصر بين العناصر ‪ [a[2‬إلى ‪ [a[n‬ونقوم بتبديلها مع العنصر‬ ‫الثاني ‪ [a[2‬ثم نأخذ العناصر من ‪ [a[3‬إلى ‪ [a[n‬ونبحث عن أصغرها ونبدله مع ‪[a[3‬‬ ‫وهكذا حتى ننتهي من كل عناصر المصفوفة فنحصل على مصفوفة مرتبة‪.‬‬ ‫‪[A[5 [A[6‬‬ ‫‪[A[3 [A[4‬‬ ‫‪[A[1 [A[2‬‬ ‫‪5‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫‪39‬‬ ‫]‪]A[12]A‬‬ ‫‪4‬‬ ‫‪17‬‬ ‫‪8‬‬ ‫‪[A[1‬‬ ‫‪12‬‬ ‫‪7‬‬ .‬‬ ‫والشكل التالي يوضح لنا هذه الخطوات‪.‫‪ selection sort‬الترتيب بالختيار‬ ‫لنفرض أن لدينا مجموعة من العداد عددها ‪ n‬ونريد أن نرتبها تصاعديا باستعمال‬ ‫الترتيب بالختيار‪.

(Procedure selectsort(var table:array[1.n:integer Var .10]of integer.1 . .I.5 .n:integer):integer Var .Maxpostion:integer ...If table[I]>table[maxpos] then maxpos:=I .10]of integer.4 ‫ عدد عناصر المصفوفة فان المصفوفة تكون قد رتبت وآل‬N ‫ حيث‬I=N ‫إذا كان‬.Findmaxpos:=maxpos .4 4 4 4 4 12 8 [A[1 17 7 5 ]A[12]A] 5 8 17 7 7 17 8 7 8 17 7 8 12 3]A] 4]A] 5]A] 6]A] 2]A] 3]A] 4]A] 5]A] 6]A] 12 1]A] 5 2]A] 12 1]A] 5 5]A] 6]A] 12 1]A] 5 3]A] 4]A] 2]A] 3]A] 4]A] 5]A] 6]A] 17 -:‫خوارزمية الترتيب بالختيار‬ I=1 ‫ضع‬.2 ‫اذهب إلى‬ .(Procedure exchange(var x.y:integer Var .maxpos:integer Begin .Temp:integer Begin 40 .3 I=I+1 ‫اجعل‬.Maxpos:=1 For I:=2 to n do .End .[A[I ‫قم بتبديل العنصر الصغر مع‬.Function findmaxpos(var table:array[1. [A[N ‫[ إلى‬A[I ‫ابحث عن اصغر عنصر من عناصر المصفوفة من‬2.

[S:=a[j .n .n1]of integer ..n-1 .Temp:=x .n:integer Var .I.A[k]:=s .End -:‫البرنامج بطريقة أخرى‬ Const .table[n .(Maxpostion:=finmaxpos(table.X=array[1.(Procedure selectsort(var a:x.j.End Begin If n>1 then Begin .End {End.([Exchange(table[maxpostion].End 41 .[A[j]:=a[k .Y:=temp .k:integer Begin For j:=1 to n-1 do Begin ..N1=100 Type .End .{for .K:=I .(Selectsort(table.[S:=a[I .K:=j .X:=y .[S:=a[j For I :=j+1 to n do Begin If a[I]<s then Begin .s.

‬‬ ‫الشكل التي يوضح هذه الطريقة ‪:‬‬ ‫]‪5]A] 6]A‬‬ ‫]‪3]A] 4]A‬‬ ‫‪42‬‬ ‫]‪]A[12]A‬‬ .‫‪{End.{end of procedure‬‬ ‫الترتيب بالدخال ‪Insertion sort‬‬ ‫ل بالبحث عن أصغر‬ ‫هذه الطريقة تختصر جزء من عمل طريقة الترتيب بالختيار فنقوم أو ً‬ ‫عنصر في المصفوفة ونحتفظ به في متغير آخر ثم نقوم بإزاحة للعناصر ‪ [A[1‬وحتى‬ ‫العنصر الذي يقع قبل مكان العنصر الصغر الذي وجدناه ‪ ،‬فيتقدم كل عنصر خطوة للمام‬ ‫ونضع العنصر الصغر في ‪ ، [A[1‬ثم نكرر العملية السابقة آخذين العناصر من ‪[A[2‬‬ ‫وحتى آخر عنصر في المصفوفة ‪.

. ‫العنصر الصغر بتقديم كل منه خطوة للمام‬ .Nextpos.var newpos:integer Begin While(nextpos>2)and(table[nextpos-1]>nextval)do Begin . 2 ‫ فإن المصفوفة قد رتبت وإل أذهب إلى الخطوة‬I=N ‫إذا كان‬ -7 ‫برنامج الترتيب بالدخال‬ .nextpos.n:integer Var .10]of . X ‫العنصر الصغر يساوي‬ -3 ‫[ وحتى العنصر الذي يقع قبل مكان‬A[i ‫أعمل إزاحة لجميع العناصر من‬ -4 . A[i]=X ‫ضع‬ -5 . nextval:integer Procedure shiftbigger(var table:array[1.Nextpos:=nextpos-1 43 . [A[n ‫[ إلى‬A[i ‫أبحث عن أصغر عنصر من عناصر المصفوفة من‬ -2 .. I=1 ‫ضع‬ -1 .7 4 4 4 12 8 17 4 5 ]A[12]A] 7 5 5 12 7 7 8 12 8 17 8 12 3]A] 4]A] 5]A] 6]A] 5 1]A] 2]A] 3]A] 4]A] 5]A] 6]A] 1]A] 2]A] 3]A] 4]A] 5]A] 6]A] 17 17 -: ‫خوارزمية الترتيب بالدخال‬ .nextval:integer.integer.newpos.(. I=I+1 ‫ضع‬ -6 .(Procedure insertsort(var table:array[1.[Table[nextpos]:=table[nextpos-1 .10]of integer.

{end of procedure shift {Begin{begin of insertsort For nextpos:=2 to n do Begin {Nextval:=table[nextpos].Newpos:=nextpos {End.(Shiftbigger[table.newpos .End If table[1]>nextval then Begin . ‫ ويقارن به‬first ‫قسمين ثم يختار أحد المواقع يسمي‬ . ‫ إلى اثنين‬partition ‫ يتم تقسيم آلـ‬last ‫ اصغر من‬first ‫إذا كان آلـ‬ 44  .nextpos. .Table[newpos]:=nextval .Newpos:=1 End Else ..nextval.[Table[2]:=table[1 .End quick sort ‫الترتيب السريع‬ ‫ هو عبارة عن ترتيب يقوم بتقسيم العداد المراد ترتيبها إلى‬ ‫فيضع الرقام اقل‬.End . ‫ والرقام الكبر منه يمينه‬first ‫ إلى يسار آلـ‬first ‫من الـ‬ ‫ موقع أول عنصر‬first  ‫ موقع آخر عنصر‬Last  ‫ موقع اقل عنصر‬Loc  -:‫الخوارزمية‬ last ‫ و‬first ‫ و‬x ‫ له متغيرات عبارة عن‬Quick sort ‫إجراء باسم‬.{save next element .

loc-1 .‫تتميز هذه الطريقة بالداء الفضل مقرنة مع الترتيب بالختيار أو الترتيب بالدخال‬ (O(n log2 n ‫حيث يمكن حساب زمن تنفيذ البرنامج للترتيب السريع بالقانون‬ ‫بينما يتم حساب زمن تنفيذ البرنامج للترتيب الترتيب بالختيار أو الترتيب بالدخال‬ ‫بالقانون‬ (O(N2 _:‫ فان الزمن بالترتيب الختياري تحسب كالتي‬32 ‫تساوى‬N ‫مثل إذا كان قيمة الـ‬ 2 N =322=1024 ‫بينما الزمن بالترتيب السريع تحسب كالتي‬ N log2 n=32 log2 32=160 -:‫إجراء الترتيب السريع‬ .END -:partition ‫الجراء‬ . loc . first .I: =first . first . last .(procedure partition(var x:art. last:integer Begin If (first <last) then Begin . loc + 1.[Pivot: =x [first While I < loc do BEGIN repeat . first.Loc: =last + 1 . first.I: =I + 1 Until x [i] >= Pivot repeat . last:integer.(Quick_sort (x.(Procedure quick_sort (var x: art .(Quick_sort (x.Ioc: =loc-1 45 .Pivot. i: integer Begin .(Partion (x. var loc:integer Var . last.

. type ‫ هي عبارة عن مصفوفة تم تعريفها في منطقة الـ‬Art -:‫مثال‬ ‫اكتب برنامج يقرا قائمة من السماء ويقوم بترتيب هذه السماء حسب الترتيب الهجائي لها‬ .Until x [loc] <= Pivot If I < loc then .Name:list .(Reset(file1 .dat .max]of string Var . x[first .'c:\datain. x [I .j:integer .END .Temp:string .File1.'c:\dataout.‫البرنامج في الصفحة التالية‬ .file2:text Begin .‫ثم كتابتها في ملف آخر‬ .Program exchangesort Const .('Assign(file2.END .I.dat .Choice:boolean .(Rewrite(file2 46 .('Assign(file1.List=array[1.( [Swap (x [loc].Max=100 Type .( [Swap (x [loc] .

([Readln(file1.([Writeln(file2.End .name[i .(Until eof(file1 Repeat .Until choice For j:=1 to i do .Choice:=true For j:=1 to i-1 do If name[j]>name[j-1] then Begin .Choice:=false ..name[j .Name[j+1]:=temp .(Close(file1 .(Close(file2 .End 47 .I:=0 Repeat .[Temp:=name[j .I:=i+1 .[Name[j]:=name[j+1 .

Loc‬‬ ‫مثال توضيحي ‪:‬‬ ‫‪3‬‬ ‫أبحث عن الرقم ‪3‬‬ ‫‪1‬‬ ‫‪8‬‬ ‫الرقم ‪ 3‬موجود في الموقع الثاني‬ ‫‪3‬‬ ‫‪48‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪3‬‬ ‫‪A‬‬ ‫= ‪N + 1 = 4 ⇒N‬‬ .‫البحث الخطي ‪Search‬‬ ‫البحث الخطى يبحث في مصفوفة غير مرتبة‪.‬‬ ‫ةةةةةةةةةة ‪:‬‬ ‫‪ -1‬أضف العنصر المراد البحث عنه )‪ (item‬إلى نهاية المصفوفة‬ ‫‪A[N+1]=item‬‬ ‫‪ -2‬أجعل ‪. Loc = 1‬‬ ‫‪ -3‬كرر أ و ب بحيث ≠ ]‪item A[Loc‬‬ ‫‪Loc = Loc + 1 -1‬‬ ‫‪ -2‬أنهي التكرار‬ ‫‪ -4‬إذا كان ‪ Loc = N + 1‬أظهر رسالة بعدم وجود العنصر و إل اكتب‬ ‫موقع العنصر وهو الـ ‪.‬‬ ‫أبحث في المصفوفة إذا وجدنا العنصر نحدد موقعه وإل نعطي‬ ‫رسالة بعدم وجوده‪.

A : array [1..‫‪1‬‬ ‫‪8‬‬ ‫‪3‬‬ ‫‪13‬‬ ‫‪3‬‬ ‫‪Loc=1‬‬ ‫‪A[Loc] ≠ item ⇒ A[1] ≠ 3 ⇒ 13 ≠ 3‬‬ ‫‪Loc 2‬‬ ‫‪A[Loc] ≠ item ⇒ A[2] = 3 ⇒ 3 = 3‬‬ ‫إذن الـ ‪ 3‬موجود في الموقع الثاني‪. program test‬‬ ‫‪const‬‬ ‫‪.30‬‬ ‫‪.10] of integer‬‬ ‫‪49‬‬ .‬‬ ‫‪4‬‬ ‫أبحث عن الرقم ‪30‬‬ ‫‪3‬‬ ‫‪0‬‬ ‫‪3‬‬ ‫‪1‬‬ ‫‪8‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪3‬‬ ‫‪A[Loc] ≠ item‬‬ ‫‪( A[1] ≠ 30 ) ⇒ ( 13 ≠ 30) ⇒True‬‬ ‫‪A[2] ≠ item‬‬ ‫‪( 3 ≠ 30) ⇒ True‬‬ ‫‪A[3] ≠ item‬‬ ‫‪(18 ≠ 30) ⇒ True‬‬ ‫‪A[4] ≠ item‬‬ ‫‪(30 ≠ 30) ⇒ False‬‬ ‫‪A‬‬ ‫‪Loc‬‬ ‫‪1‬‬ ‫‪Loc‬‬ ‫‪2‬‬ ‫‪Loc‬‬ ‫‪3‬‬ ‫‪Loc‬‬ ‫‪4‬‬ ‫* إذا كان ‪ Loc = N+1‬اظهر رسالة بعدم وجود العنصر و إل اكتب‬ ‫موقع العنصر وهو الـ ‪ Loc‬وهنا تحقق الشرط لذلك تطبع رسالة بعدم وجود العنصر‬ ‫‪.m=10‬‬ ‫‪var‬‬ ‫‪.

End (‫البحث في مصفوفة مرتبة )البحث الثنائي‬ ‫نلخص هذه الطريقة في اننا نقوم فــي كــل مرحلــة مــن مراحــل‬ ‫البحث بمقارنة الهدف المراد البحث عنه مع العنصر الوســط اذا كانــا‬ 50 .Loc := Loc + 1 . item : integer Begin . A[N+1]:= item .Writeln (‘enter A[‘. (’[’.. N .Loc . N:= m-1 For I:= 1 to N do Begin . End . I .I . Readln . Loc . (’Writeln (‘enter your item . End If loc=n+1 then (’Writeln(‘item is not found else (Write (‘item Loc = ‘.(Readln(item . ([Readln(A[I .Loc:=1 While A[Loc] <> item do Begin .

‬‬ ‫مثال توضيحي ‪:‬‬ ‫‪8‬‬ ‫‪7‬‬ ‫‪6‬‬ ‫‪5‬‬ ‫‪4‬‬ ‫‪9‬‬ ‫‪9‬‬ ‫‪9‬‬ ‫‪0‬‬ ‫‪4‬‬ ‫‪0‬‬ ‫‪3‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫الخير‬ ‫الول‬ ‫‪51‬‬ ‫‪3‬‬ ‫‪9‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪A‬‬ . (1‬‬ ‫‪ -5‬إذا كان العنصر الوسط اصغر من الهدف فأبحث في المصفوفة‬ ‫الجزئية ذات المؤشرات الدليلية من )العنصر الوسط ‪ (1 +‬إلى‬ ‫العنصر الخير ‪.‬‬ ‫‪ -4‬إذا كان العنصر الوسط اكبر من الهدف ابحث في المصفوفة‬ ‫الجزئية ذات المؤشرات الدليلية من العنصر الول إلى )العنصر‬ ‫الوسط – ‪.‬‬ ‫‪ -3‬إذا كان العنصر الوسط مساويا ً للهدف ارجع قيمة المؤشر‬ ‫الدليلي للعنصر الوسط ‪.‬‬ ‫الخوارزمية ‪:‬‬ ‫‪ -1‬احسب قيمة المؤشر الدليلي للعنصر الوسط ‪.‫متساويين يكون قد تحدد موقع العنصر المراد البحث عنه ‪ .‬اما اذا كان‬ ‫العنصر الوســط اكــبر مــن الهــدف فيجــب علينــا البحــث فــي النصــف‬ ‫السفل للمصفوفة اما اذا كان العنصر الوســط اصــغر مــن الصــفوفة‬ ‫فيجب البحث في النصف العلى فــي المصــفوفة نكــرر هــذه العمليــة‬ ‫بالنسبة للنصف السفل والنصف العلــى ونتعامــل معــه كمــا لــو كــان‬ ‫مصفوفة قائمة بذاتها حتى نجد الهدف او ينتهي البحث في حالة عــدم‬ ‫عثورنا على الهدف ‪.‬‬ ‫‪ -2‬إذا كانت أطراف المصفوفة غير صالحة ) العنصر الول اكبر من‬ ‫العنصر الخير ( ارجع النتيجة أو رسالة لعدم صلح المصفوفة‬ ‫للبحث ‪.

Begin First := 1. var I. 52 . program test2 type data = array[1.10] of integer . Var Last. A : data . target : integer . target : integer) : integer . B. Function binsearch(var A:data .2/‫ الموقع الخير‬+ ‫الموقع الوسط = الموقع الول‬ :‫مثال‬ .. Midd : integer .33 ‫ابحث عن العنصر‬ :‫الحل‬ (1+ 8)2/= 4 ‫الموقع الوسط‬ target = 33 false IF(A[4] = target) ⇒ [21≠ A[4 = 33 A 5 6 7 8 3 3 4 0 9 0 9 ‫ فى المصفوفة‬33 ‫أبحث عن الرقم‬ 9 ‫الخير‬ ‫الول‬ )5 + 8 2/(= (false A 6 ‫الموقع الوسط‬ ⇒ IF( A[6] = 33 A[6]= 40 ≠ 33 5 6 3 3 4 ‫ فى المصفوفة‬33 ‫أبحث عن الرقم‬ 0 ‫الخير‬ ‫الول‬ )5 + 6 2/(= 5 ‫الموقع الوسط‬ (True ⇒ IF( A[5] = 33 A[5]= 33 5 ‫ موجود في الموقع‬33 ‫العنصر‬ . First.

Begin For I := 1 to 10 do Begin Writeln (‘enter A[‘. Repeat Midd := (First + Last) div 2 .Top:0.maxstack . Writeln (‘enter target : ‘) .. Readln .End Var .I. Until (First = Last) or (A[Midd] = target). End . If A[Midd] > target then Last := Midd – 1 Else First := Midd + 1 .S:stack 53 . End. Stack Using Array type Const .B) .’]’) . Readln (A[I]) . End . Write (‘target = ‘. If A[Midd] = target then Binsearch := Midd Else Binsearch := 0.target) .. Readln (target) . B:= Binsearch (A.Last := 10.maxstack]of integer .Maxstack=100 Type Stack=record .Item:array[1.

end .top:=s.top=0 then empty:=true else .top=maxstack then full:=true else .I:integer .s.full:=false .end .(procedure push(var s:stack.s.function empty(s:stack):Boolean begin if s.(Procedure initialize(var s:stack Begin .item[s.item[s.function pop(var s:stack):integer begin ('if empty(s) then write('stack is empty else begin .top:=s.top-1 54 .s.s.end .function full(s:stack):Boolean begin if s..end .top+1 .x:integer begin ('if full(s) then write('stack is full else begin .top:=0 .top .[pop:= s.end .top]:=x .empty:=false .

(initialize(s .Next:stack .(push(s.top downto 1 do .end .end Stack Using Pointer ‫المكدسة باستخدام المؤشرات‬ .7 .end .(push(s.(procedure display(s:stack var ..2 .end .(push(s.Item: integer .S:stack .End Var .(display(s .Uses crt Type .readln .item[s.5 .Stack=^data Data=record .(' '.(push(s.[Write(s.top .3 .x:integer 55 .[stacktop:=s.function stacktop(s:stack):integer begin ('if empty(s) then write('stack is empty else .I:integer Begin For I:= s.End begin .item[I .

p^.next:=st .St:=nil .next (dispose(p .end 56 .pop:= st^.('write('stack is empty end else begin .p:=st .p^item:=x .end .function pop(var st:stack):integer var .p:stack begin if empty(st) then begin .p:stack begin .pop:=0 .x:integer .(Procedure initialize(var st:stack Begin .end .end .item .st:=p ..function empty(st:stack):Boolean begin if st=nil then empty:=true else .(new(p .st:=st^.(procedure push(var st:stack.end .empty:=false .end .

(procedure display(st:stack Begin While st<>nil do Begin .End Var 57 .(push(s.2 .next .St:=st^.(push(s.10]of integer .end .end Linear Queue Using Array : ‫الصف الخطى‬ front=1 ‫ و‬rear=0 ‫الحالة البتدائية‬ .(display(s .Item:array[1.front:integer .Uses crt Const .(Write(st^.stacktop:=st^.Maxqueue=10 Type Queue=record ..Rear.3 .5 .(push(s.item .(push(s.function stacktop(st:stack):integer begin ('if empty(st) then write('stack is empty else .item .7 .(initialize(s ..End begin .readln .

;Q:queue
;I:integer
;(Procedure initialize(var Q:queue
Begin
;q.rear:=0
;q.front:=1
;end
;function full(q:queue):Boolean
begin
;full:=q.rear=maxqueue
;end
;function empty(q:queue):Boolean
begin
;(empty:=(q.front=1)and(q.rear=0
;end
;(procedure push(var q:queue;x:integer
begin
('if full(q) then write('queue is full
else
begin
;q.rear:=q.rear+1
;q.item[q.rear]:=x
;end
;end
;function delete(var q:queue):integer
begin
('if empty(q) then write('queue is empty
else
begin
;[delete:= q.item[q.front
;q.front:=q.front+1
;end
58

‫‪;end‬‬
‫‪;(procedure display(q:queue‬‬
‫‪var‬‬
‫‪;I:integer‬‬
‫‪Begin‬‬
‫‪For I:= q.rear to q.front do‬‬
‫‪;(' ',[Write(q.item[I‬‬
‫‪;End‬‬
‫‪Begin‬‬
‫‪;(Initialize(q‬‬
‫‪For I:=1 to 4 do‬‬
‫‪;(Insert(q,i‬‬
‫‪;(Display(q‬‬
‫‪;Readln‬‬
‫‪.End‬‬

‫الشجرة ‪tree‬‬
‫هنالك نوع من بنيات البيانات ترتبط فيمـا بينهـا عـن طريـق فـروع ‪ ،branches‬أي‬
‫أنها ل تعتمد على التركيب الخطى في تكوينها ‪ ،‬فليس بالضــرورة أن يرتبــط العنصــر فيهــا‬
‫بعنصر واحد أمامه وعنصر واحد خلفه ‪.‬‬
‫تعريف الشجرة ‪-:‬‬

‫الشجرة هي مجموع محدده ‪ ،‬تتكون من عقده واحده أو اكثر بحيث ‪:‬‬
‫توجد بها عقده مصممه بشكل خاص تسمى الجذر ‪. root‬‬
‫‪.1‬‬
‫العقدة الباقية مقسمه إلــى ‪ n>=0‬مــن المجموعــة ‪tl..tn‬المنفصــلة بحيــث كــل‬
‫‪.2‬‬
‫واحده من هــذه المجموعــات تكــون شــجره ‪ th..tn‬تســمى شــجيرات ‪ subtrees‬مــن‬
‫الجذر‪.‬‬

‫‪59‬‬

‫إن الشجرة ا لسابقه بها ‪ 13‬عقده ‪ Node‬يحتــوى عنصــر البيانــات فــي شــكل عقــده‬
‫على حرف‪ .‬جذر هذه الشجرة هي العقدة التي يحتوى عنصر البيانات فيها علــى حــرف ‪A‬‬
‫لحظ إننا رسمنا الشجرة وجذرها إلي أعلى ‪ ،‬وهذا هو النهج المتبع في رســم الشــجار ‪ .‬إن‬
‫عدد الشجيرات التي تتفرع من عقـده مـا يسـمى درجـة العقـدة ‪ degree of node‬فدرجـة‬
‫العقدة التي تحتوى على ‪ a‬هي ‪3‬بينما درج العقدة التي تحتوى علــى الحــرف ‪ c‬هــي ‪ ، 1‬أمــا‬
‫درجة العقدة ‪ k‬فهي صفر أن العقدة التي تكون درجتها مساويه تسمى ورقــة ‪ leaf‬أو العقــدة‬
‫النهائية ‪ terminal node‬بناء على مــا ســبق فــان }‪ {k,l,g,m,I,j‬هــي مجمــوعه العقــد‬
‫الورقيــة ‪ ،‬وبعكــس ذلــك فــان العقــد الــتي درجتهــا لتســاوى الصــفر تســمى عقــدَا داخليــة‬
‫‪ nonterminal node‬ما عدا الجذر ‪.‬‬
‫إن جذر الشجيرات التي تتفرع من عقده ما ولتكن ‪ x‬تسمى أبنــاء ‪ children‬لـــــــ ـ‬
‫‪ x‬و ‪ x‬تسمى أبناء ‪ parent‬لهؤلء البناء وبالنظر إلى الشجرة الســابقة نلحــظ إن أبنــاء ‪d‬‬
‫هم ‪ j,I,h‬وأب ‪ d‬هو ‪. a‬‬
‫إن أبناء الب الواحد يسمون أشقاء ‪ siblings‬وبذلك فــان ‪ j,i,h‬هــم أشــقاء لن لهــم نفــس‬
‫الب ‪. d‬‬
‫درجة الشجرة ‪-: degree of tree‬‬
‫هي أعلى درجه للعقده في الشجرة وبالتالي فان درجة الشجرة السابقة هي ‪. 3‬‬
‫مستوى العقدة ‪-: level of tree‬‬
‫إذا قلنا إن عقدة ما في المستوى ‪ L‬فان أبناءها سوف يكونون في المســتوى ‪، L+1‬‬
‫فإذا افترضنا أن الجذر يقع في المستوى ‪ 1‬فان البن ‪ d‬يقع في المستوى ‪. 2‬‬
‫ارتفاع الشجرة ‪-:height of tree‬‬
‫هو أعلى مستوى يمكن أن تأخذها عقده في الشجرة ‪ ،‬يكون ارتفاع الشجرة السابقة هو ‪. 3‬‬
‫الغابة ‪-: forest‬‬
‫هي مجموعه بها عدد ‪ n>=0‬مــن الشــجار المنفصــلة عــن بعضــها ‪ .‬لحــظ أننــا إذا‬
‫أزلنا جذر الشجرة فإننا سوف نحصل على غابه على سـبيل المثـال فـي الشـجرة السـابقة إذا‬
‫أزلنا ‪ a‬سوف نحصل على غابه مكونه من ثلثة أشجار ‪.‬‬
‫الشجار الثنائية ‪-: binary tree‬‬
‫‪60‬‬

‬‬ ‫لحظ أن هذا التعريف هو تعريف مجرد ولتحديد الشجرة الثنائية كنوع مــن أنــواع البيانــات‬ ‫المجردة ‪ ،‬يجب علينا أن نوضح ما هي العمليات التي يمكن أن تجــرى علــى الشــجرة علــى‬ ‫الشجرة الثنائية ‪ .‬‬ ‫مفتاح العقدة في الجذر مــن كـل المفاتيــح ) أن وجـد( فـي الشــجرة اليمنــى ‪ .‬‬ ‫شجرة البحث الثنائية‬ ‫‪binary search tree‬‬ ‫هي شجرة ثنائية ‪ ،‬والتي آما أن تكون خاليه أو كــل عقــده منهــا تحتــوى علــى مفتــاح‬ ‫يحقق الشروط التالية ‪:‬‬ ‫كل المفاتيح ) أن وجدت ( في الشجيرة اليسرى ‪،‬اصغر من مفتاح العقدة في الجذر ‪.‬‬ ‫تعريف‪-:‬‬ ‫الشجرة الثنائية هي مجموعه محدودة من العقد ‪ ،‬وهذه المجموعــة أمــا أن تكــون خــاليه ‪ ،‬أو‬ ‫أنها تحتوى على جــذر وشــجيرتين علــى الكــثر منفصــلتين تســميان الشــجرة اليســرى ‪left‬‬ ‫‪ sudtree‬والشجرة اليمنى ‪ right sudtree‬هاتــان الشــجيرتان متصــلتان بالجــذر ‪ ،‬وكــل‬ ‫منهما تمثل شجرة ‪.‬المثــال التــالي يوضــح شــكل شــجرة‬ ‫البحث الثنائية‪:‬‬ ‫‪61‬‬ .‬وسوف نستعرض فــي الفقــرة‬ ‫التأليه نوع من أنواع ال شجار الثنائية في عمليات البحث والترتيب ‪.‬‬ ‫أن الشجار الثنائية تستخدم لعدة أغراض من ضمنها البحث ‪ .‬الشــجرة اليمنــى‬ ‫والشجرة اليسرى تنطبق عليهما نفر الشروط الســابقة ‪ .‫تعتبر الشجار الثنائية من النواع المهمة في بنيات الشجار ‪ .‬لحظ أيضا أن هذا التعريف لم يبين لنا طريقة العقد داخل الشجرة ‪.‬وهى تتصف بــان أي‬ ‫عقده فيها يمكن أن يكون لديها على الكثر فرعان ‪ ،‬أي انه ل توجد بها عقده درجتهــا اكــبر‬ ‫من ‪ 2‬في الشجار الثنائية فإننا نميز بين الشجرة اليمنى والشجرة اليسرى للعقده الواحدة ‪.

‪function creatptr(r:integer):p‬‬ ‫‪var‬‬ ‫.Root:p‬‬ ‫إنشاء عقده شجرة‪:‬‬ ‫الدالــة التاليــة توضــح لنــا كيفيــه إنشــاء عقــده تمهيــدَا لضــافتها إلــى شــجره البحــث‬ ‫الثنائية‪،‬حيث يتم إنشاء مؤشر باستخدام الدالة ‪ ، new‬والذي يشير إلــى ســجل يحتــوى علــى‬ ‫ثلثة حقول ‪ ،‬اثنين مهما عبارة عــن مؤشــرات ‪ ،‬الثــالث مــن النــوع ‪ integer‬ليخــزن بــداله‬ ‫المفتاح ‪.Left.‫نلحظ أن اكبر المفاتيح التي تقع في الشجرة اليمنى المتصلة بالجذر ‪ 5‬هي اكبر من ‪ ،5‬وان‬ ‫كل المفاتيح التي تقع في الشجرة اليسرى المتصلة بالجذر ‪ ، 5‬هي اصــغر مــن ‪ ،5‬وذلــك أو‬ ‫آخذنا كل شجرة من الشجيرتين )‪T (2‬و ‪ (T (7‬فإننا سوف نلحظ نفس الملحظة لتســهيل‬ ‫التعامل مع الشــجيرة فإننــا ســوف نســتخدم بنيــة بيانــات متحركــة لتمثيلهــا ‪ ،‬ســوف نســتخدم‬ ‫المتغير مؤشر ليدلنا على مكان الشجرة أن السم المعتاد لذلك المؤشــر هــوا لــ ـ ‪ Root‬لنــه‬ ‫سوف يشير إلى جذر الشجرة‬ ‫إذا كان الشجرة خاليه فان ‪.P=^nodetype‬‬ ‫‪Nodetype=recod‬‬ ‫‪.)‪new(ptr‬‬ ‫‪with ptr^ do‬‬ ‫‪begin‬‬ ‫.End‬‬ ‫‪Var‬‬ ‫‪.‪ptr:p‬‬ ‫‪begin‬‬ ‫. right:p‬‬ ‫‪.‪info:=r‬‬ ‫.‪left:=nil‬‬ ‫‪62‬‬ .root=nil‬‬ ‫كل عقــده فــي شـجرة البحــث الثنائيــة لهـا شــجيرة يمنــى وشـجيرة يسـرى ‪ ،‬وهــذا مــا يمكـن‬ ‫الحصول عليه باستعمال المؤشرات في هذا الجزء من البرنامج ‪.‬‬ ‫‪Type‬‬ ‫‪.‬‬ ‫.Info : integer‬‬ ‫‪.

ptr‬‬ ‫.info < pt^.)‪add(pt^.left.pt1:p‬‬ ‫‪begin‬‬ ‫‪if pt=nil then‬‬ ‫‪pt:=pt1‬‬ ‫‪else‬‬ ‫‪if ptr^.‪end‬‬ ‫.)‪procedure add(var pt.‪end‬‬ ‫إضافة عقده إلى شجرة البحث الثنائية ‪-:‬‬ ‫لنفرض إننا نريد آن نضيف عقده إلى شجرة البحث الثنائيــة الــتي فــي المثــال الســابق ‪ ،‬هــذه‬ ‫العقدة تحتوى على المفتاح ‪ ،3‬فنبدأ أول بمقارنــة ‪ 3‬مــع مفتــاح الجــذر ‪ 5‬نجــد أن ‪ 5>3‬الن‬ ‫ننتقل آلي الشجرة اليسرى للجذر نلحظ أن جذرها يحتوى على المفتاح ‪ 2‬والذي هو اصغر‬ ‫من ‪ ،3‬لذلك نتجه الن آلي الشــجرة اليمنـى ‪ ،‬نجـد أن المفتـاح قيمتـه ‪ ،4‬وهــو اكــبر مــن ‪،3‬‬ ‫ولن المؤشر اليسر لهذه العقدة يشير إلى ‪ ، nil‬لتصبح الشجرة كالتي ‪:‬‬ ‫‪ :‬إضافة عقده إلى شجرة البحث الثنائية‬‫البرنامج التالي يستخدم للنداء التكراري لضافة العقدة المشار إليها بالمؤشر ‪ ptl‬إلى‬ ‫الشجرة المشار إلى جذرها بالمؤشر ‪.info then‬‬ ‫)‪add(pt^.‪right:=nil‬‬ ‫. pt‬‬ ‫.‪creatptr:=ptr‬‬ ‫.‫.ptr‬‬ ‫‪else‬‬ ‫.right.‪end‬‬ ‫‪63‬‬ .

‪function search(pt:p.‬‬ ‫.z‬‬ ‫‪else‬‬ ‫.’is not fuond‬‬ ‫. z:integer) :p‬‬ ‫‪begin‬‬ ‫‪if pt=nil then‬‬ ‫‪begin‬‬ ‫.)' ‪writeln(Z.)‪search:=search(pt^.‫‪ :‬البحث عن مفتاح في شجرة البحث الثنائية‬‫البرنامج التالي يوضح طريقة استخدام النداء التكراري في البحث عن مفتــاح ‪ Z‬فــي شــجرة‬ ‫بحث ثنائية مشار إلى العقدة آلتي تحتوى على المفتاح في حالة وجوده ‪ ،‬ويؤشر إلى ‪ nil‬في‬ ‫حالة عدم وجود المفتاح ‪.‬‬ ‫في الشكل أدناه لنفرض أننا نريد حذف العقدة التي تحتوى على المفتــاح ‪،2‬‬ ‫فكل الذي علينا عمله هو أن نرفع الشجرة اليسرى مكان العقدة ‪ ،2‬ونجعــل العقــدة‬ ‫اليســار للعقــده المــراد حــذفها ‪ 2‬تتصــل بالعقــدة الــتي تقــع أقصــى اليميـن الســفلي‬ ‫للشجيرة ‪ 4‬ويصبح الشكل عندنا كالتي ‪--:‬‬ ‫‪64‬‬ .info then search:=search(pt^.z‬‬ ‫.‪search:=nil‬‬ ‫‪end‬‬ ‫‪else‬‬ ‫‪if pt^.‪end‬‬ ‫حذف عقدة من شجرة البحث الثنائية ‪-:‬‬ ‫إذا كانت العقدة المراد حذفها من الشجرة عبارة عــن ورقــه فــان المــر فــي‬ ‫غاية السهولة كما هو موضح في الرسم ‪ ،‬حيـث حـذف العقـدة الـتي تحتـوى علـى‬ ‫المفتاح )‪ (3‬أما إذا كانت هذه العقدة لديها شجيرتان يمنى ويسرى فان المر يبــدو‬ ‫معقدَا بعض الشيء ‪.info = z then search:=pt‬‬ ‫‪else‬‬ ‫)‪if z<pt^.right.left.

k) . if (found) and (k<>root^.found.: ‫البرنامج التالي يوضح طريقة الحذف‬ procedure delete (root:p.info =k then begin 65 .: ‫كما هو موضح في الشكل التالي‬ .k) else delete(root^. begin if root^.left.right.found.info) then begin if root^.k:integer).info > k then delete(root^. var temp:p.info=k then found:=true else if root^. var found:boolean.left^.‫ من الشكل أعله فالــذي يجــب عملــه هــو أن‬7 ‫الن لنفرض أننا نريد حذف العقدة‬ 8 ‫نرفع العقدة‬ (8) ‫ عبارة عن شجيرة يســرى للمفتــاح‬6 ‫)العقدة اليمنى ( إلي أعلى وتكون العقدة‬ .

function creatptr(r:integer):p.left:=temp^.root:p. end.right <> nil then add(root. with ptr^ do begin info:=r. root^. end. left.left.temp:=root^. left:=nil. dispose(temp). newptr . end. end else begin temp:=root^.right:=temp^. node=record info:integer. var ptr:p. var ptr. 66 . end . begin new(ptr). root^.left. TYPE p=^node. found:=false.temp^. end. if temp^. right:=nil.right.right:p.left.right).

left.z).ptr:p).info=k then found:=true else if root^. search:=nil. end else if pt^. begin if pt=nil then pt:=ptr else if ptr^. function search(pt:p.found.found. begin if pt=nil then begin writeln(Z.info < pt^.k) else delet(root^.info = z then search:=pt else if z<pt^. if (found) and (k<>root^.k:integer).z) else search:=search(pt^.right. z:integer) :p. var found:boolean.k) .ptr) else add(pt^. end.info > k then delet(root^.left^.’is not fuond '). procedure delet (root:p.info) then begin if root^. var temp:p. end.creatptr:=ptr.left.right. begin if root^.info =k then begin 67 .ptr).left.right. procedure add(var pt. end.info then add(pt^.info then search:=search(pt^.

found:=false.right:=temp^.temp:=root^. root^.right).‫_ادخل عشرة عقد بأسماء مختلفة‬ .temp^.5 ‫_احذف العقدة رقم‬ . for I:=1 to 10 do begin newptr:creatptr. end .left:=temp^. end.left.‫اطبع المحتويات قبل وبعد الحذف‬ 68 . if temp^. readln. end.right. ‫تمارين متنوعة‬ ‫ تحتوى عقدها على ثلثة حقول الول للسم والثاني‬linked list ‫اكتب برنامج لنشاء‬. dispose(temp). root:=nil. begin root:= new(ptr). root^. end else begin temp:=root^.left. add(root. end.right <> nil then add(root.left. {delete} . newptr). end.* ‫للعمر والثالث مؤشر للعقدة التالية‬ .

‬‬ ‫‪_5‬ارسم الشجرة اليسرى للـ ‪.‬‬ ‫‪69‬‬ .‬‬ ‫‪_3‬المستوى لـ ‪.‬‬ ‫‪_7‬من هم الشقاء‪.‫*من الشكل السابق حدد التي‪-:‬‬ ‫‪_1‬ما هو الجذر ‪ROOT‬‬ ‫_‪2‬أبناء ‪ G‬إن وجدوا‪.G‬‬ ‫_‪6‬وزن الشجرة‪. C‬‬ ‫_‪4‬قائمة بكل الوراق‪.

Sign up to vote on this title
UsefulNot useful