Professional Documents
Culture Documents
نع يفاوو لماك حرش مكل مدقا مويلا ـلا linked list
نع يفاوو لماك حرش مكل مدقا مويلا ـلا linked list
1
سأقوم في هذا الكتاب بشرح كالً من:
2
3
4 • مقدمة عن الــ . linked list
5 • الصيغة العامة للـ. linked list
6 • شرح العمليات التالية:
7
8
-1كيفية ترتيب العناصر في الذاكرة باستخدام الـ. linked list
9 -2اضافة عنصر في اول القائمة.
10 -3اضافة عنصر وسط القائمة.
11
-4اضافة عنصر اخر القائمة.
12
13 -5عملية زيارة القائمة وطبع محتوياتها.
14 -6البحث عن عنصر داخل القائمة.
15 -7حساب عدد عناصر القائمة.
16
17
-8حذف عنصر من القائمة.
18 بعد ذالك سأقوم بشرح الـــ. Double linked list
19
2
اذا ارت االنتقال الى
1
2
3
4
5
Linked list
6
7 Linked list: is a data structure wherein each element
8 contains both a data value and a pointer to next element in
9 .the list
10
11
بــعضمميزاـتاـــل linked listمايلي:
12 تــقومـ بــترتيباــلعناصر فـــياــلذاـكرة حـتىولو كـانتعشواـئية
13 هنا الـ نــحتاج لــمعـرفة عدد اــلبياناتاــلمدخلة كـما فـــياــلمصفوفاتاــلتينــحدد
14
عدد اــلبياناتاــلتيســوفنــدخلهـا(نــحدد حـجمـ اــلمصفوفة) لــذاــلك يــطلقعلىاــلــ
15
16 linked listاــلمصفوفاتاــلديناميكية.
17
18
19
3
اذا ارت االنتقال الى
1
2
3
4
5
6
7
قد يقول البعض كيف يتم ترتيب العناصر في الذاكرة حتى ولو كانت عشوائية؟
8
9 الجواب هو أن كل عنصر يقوم بحفظ موقع العنصر الذي يليه(الذي بعدة).
10 وبتوضيح أكثر فلنرى مايلي:
11
12
13
14
15
16
17
18
19
4
اذا ارت االنتقال الى
لدينا قائمة الطالب التالية-:
الطالب االول الطالب الثاني الطالب الثالث
11
0070
12
13
14
بيــــــــــــــــــــــــــانات Next
15
16
17
18
19
يتم كتابه عنوان الذاكرة( )Base addressالتي الذاكرة
يوجد فيها الطالب التالي وهكذا.
5
اذا ارت االنتقال الى
أالن سوف ندخل في الجد:
1
2 هذه الصيغة العامة للــ -:linked list
struct3nodeptr
{ تعريف الرابط
4
;char info
;struct5node*next This is the pointer to the next node
};
6
7
8 سوف نبدأ أالن بأهم العمليات في الـــ :linked list
9
أوال :عملية إنشاء nodeوإضافة بداخل الــــ nodeالرقم :50
10
سيتم ذالك من خالل الخوارزمية التالية:
11
12
)Initial(node*f
{
13
;) (f=getnode إنشاء new nodeمن ثم وضع المؤشر fعليها
14
;f->link=null يقوم بوضع ذراع الـــ fبــ nullإشارة بأنة أخر عنصر في القائمة
15
16
;f->info=50 يقوم بإدخال 50داخل الـ nodeالتي يشير إليها المؤشر f
};
17 f
في هذا المثال قمنا بإنشاء الـ nodeالتالية:
18
5
19 0
6
f ثانيا ُ:عملية ربط الـ nodeأول القائمة:
اذا ارت االنتقال الى
5 لدينا هذه الـ nodeونريد ربط nodeجديدة ووضعها إال ولى في القائمة
0
1
2
3
4
)Insert_B(node*f
{
5
;node*c
6
;)7(c=getnode
إنشاء new nodeمن ثم وضع المؤشر cعليها
8
;c->info=40
9 يقوم بربط الـ nodeالتي أنشئنها بالـ nodeاألولى في القائمة first
;c->link=f
10
;f=c
11 يقوم بنقل المؤشر fإلى الـ nodeالتي ربطناها بالقائمة التي
أصبحت أول nodeفي القائمة
12
}
13
14
15
16 ستكون القائمة كما يلي:
17 f
18 c 5
0
19 7
7 0
اذا ارت االنتقال الى
ثالثا ُ :عملية ربط nodeوسط القائمة (ليس بأولها وليس بآخرها):
هنا لدينا مثالً بيانات احد الطالب وكان رقمه 36ونريد إن نضعه في القائمة حسب الرقم التسلسلي ألرقام الطالب سيكون
1 الحل كما يلي:
2
)Insert_l(node*f
{ 3
4
;node*c,*p وضع البيانات داخل الـnode
5
;) (c=getnode
6
;c->info=30
إنشاء new nodeمن ثم وضع المؤشرc
7
;p=f يقوم بوضع المؤشر pفي الـ nodeالتي يشير إليها الـ fحتى يتم التنقل
8 باستخدام المؤشر pفي القائمة مما يحول دون ضياعها
9
while(c->info )> f->info && c->info > p->info
10
;p=p->link يقوم بنقل المؤشر pمن الـ nodeالتي يشير إليها إلى الـ nodeالتي تليها
11
;c->link=p->link
12 يقوم بتنفيذها بعد توقف wileطبعاً وهذا السطر يقوم بالتالي:
;p->link=c يقوم بربط ذراع الـ nodeالمراد ربطها بالـ nodeالتي يشير إليها ذراع الـ p
13
} 14
يقوم بنقل ذراع المؤشر pمن الـ nodeالتي كان يشير إليها إلى الـ nodeالتي
15 تم ربطها(الـ)c
16
17
18 هذا السطر يقوم بالتالي :طالما ( )c->info >f->infoمعلومات الـ nodeالتي يشير إليها المؤشر cاكبر من
معلومات الـ nodeالتي يشير إليها المؤشر (&&( fو
19 ( )c->info>p->linked->infoمعلومات الـ nodeالتي يشير إليها المؤشر ( cمعلومات الـ nodeالمراد ربطها
8 بالقائمة) اكبر من معلومات الـ nodeالتي يشير إليها ذراع المؤشر p
اذا ارت االنتقال الى بعد هذا كله راح تكون القائمة بهذا الشكل:
1
2
3 f
4 p
5
6 20 30 35 40
7
8
9
10
11 c
12
13
14 36
15
16
17
18
19
9
رابعا ً :عملية ربط nodeفي أخر القائمة:
f
اذا ارت االنتقال الى
6)Insert_l(node*f
7{
;node*c وضع البيانات داخل الـnode
8
9;) (c=getnode
إنشاء new nodeمن ثم وضع المؤشر cعليها
10
;c->info=70
11
;l=f
طالما ذراع الــ lموجودة
12
)while(l->link !=NULL
13 يقوم بنقل المؤشر fمن الــ nodeالتي يشير عليها إلى الــ nodeالتي تليها إلى إن
يصل إلى أخر القائمة ( حتى يشير إلى أخر nodeفي القائمة)عند عدم تحقق الشرط
14
;l=l->link
15
;l->link=c يقوم بربط ذراع الــ lالتي وصلت إلى أخر القائمة بــ nodeالتي أنشئنها
16
;c->link=NULL
17 يقوم بربط ذراع الــ nodeبــ nullألنها أخر nodeفي القائمة بمعنى أخر
إن ذراع الـ cال ترتبط بــ nodeأخرى
}
18
19 يقوم بوضع المؤشر lحيث يشير المؤشر fوذالك حتى يتم التنقل باستخدام المؤشر lإلى
أخر القائمة وذالك تفادين لعدم ضياع القائمة حيث أذا تم نقل العنصر fمن مكانة في أول
10
عنصر في القائمة فإننا سوف نفقد القائمة بأكملها وذالك خطأ فادح جداً.
اذا ارت االنتقال الى بعد هذا كله راح تكون القائمة بهذا الشكل:
1
2
3
4 f
l
5
2 3 3 4
6 0 0 5 0
7
c
8
7
9 0
10
11
12
13
14
15
16
17
18
19
11
اذا ارت االنتقال الى
خامسا ً:عملية زيارة القائمة
أالن سوف نقوم بعملية المرور على كل عناصر القائمة وطبع ما يوجد بداخلها من معلومات:
1
2
3
4 )Traverse(node*f
{
5 ;node*c=f
6 طالما ذراع المؤشر cال تساوي null
)while(c->link !=NULL
7 {
8 ;cout<<c->info يقوم بطبع المعلومات الموجودة في الـnode
التي تشير إليها الـc
9 ;c=c->link
}
10 } يقوم بنقل ذراع المؤشر cإلى الـ nodeالتي تليه
11
12
13
14
15
16
17 وضعنا القوسين ليتم تنفيذ ما بينهما باكملة اذا تحقق شرط while
18
19
12
اذا ارت االنتقال الى
سادسا ً:معرفة عدد عناصر القائمة
هنا سوف نقوم بعد عدد عناصر القائمة(عدد الـ) node
1
2
)3Traverse(node*f
4{;int count =0 عرفنا العداد الذي سوف يتضاعف طالما
الشرط تبع whileمحقق وهيئنه وذالك
5 بإعطائه القيمة صفر حتى أذا ما تحقق شرط
)While(c-> !=NULL whileيقوم بطبع صفر node
{6
7;++count طالما ذراع الــ cموجودة
8;c=c->link
}9 يقوم بمضاعفة العداد من الصفر إلى أن تنتهي
القائمة (عدم تحقق شرط )while
}10
11 يقوم بنقل ذراع المؤشر cإلى الـ nodeالتي تليه
12
13
14
15
16 وضعنا القوسين ليتم تنفيذ ما بينهما بكاملة أذا تحقق شرط while
17
18
19
13
سابعا ً :البحث عن عنصر داخل القائمة:
اذا ارت االنتقال الى
1
2
Search(node*f ), int key
{
3
;node*c=f ندخل المعلومات التي نريد البحث عنها مع مالحظة بأنها من نوع int
4
;cin>>key
5
6
while(c->link )!= NULL
{7
)if(key == c->info اذا كانت البيانات المدخلة متطابقة مع بيانات الـ
{8 nodeالتي يقف عليها الـ c
9 c
;return
}
10
else
{11
;c=c->link نقل المؤشر cإلى الـ nodeالتي تليه
12
}
13 }
إخراج القيمة NULLأذا لم نجد العنصر
;return null
}14
15
16
17
18
19
14
اذا ارت االنتقال الى
ثامناً:حذف عنصر من القائمة
12
} هذا لربط القائمة اذا كان الـ ( dالذي نريد حذفه)بالوسط
)free(d
13
}
حذف d
14
else
Display not font
15
}
16
يقوم بطبعها عندما ال يجد العنصر المراد حذفه
17
18
19
15
Double linked list
اذا ارت االنتقال الى