Professional Documents
Culture Documents
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
بعض مميزات الـ linked listمايلي :
11
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
{ تعريف الرابط
;char 4 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
50
19
6
f ثانياُ:عملية ربط الـ nodeأول القائمة:
اذا ارت النتقال الى
50 لدينا هذه الـ nodeونريد ربط nodeجديدة ووضعها إل ولى في القائمة
1
2
3
)Insert_B)node*f
4
{
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 50
19 70
7
اذا ارت النتقال الى
ثالثاُ :عملية ربط 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طبع ًا وهذا السطر يقوم بالتالي:
يقوم بربط ذراع الـ nodeالمراد ربطها بالـ nodeالتي يشير إليها ذراع الـ p
;p->link=c
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
p
4
5
6 20 30 35 40
7
8
9
10
11 c
12
13
14 36
15
16
17
18
19
9
f
اذا ارت النتقال الى رابعاً :عملية ربط nodeفي أخر القائمة:
20 30 35 40 لدينا هذه القائمة:
1
2
3 إحضار القائمة c
ونريد أن نربط الــ nodeالتالية في أخر
4 القائمة:
70
5
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
20 30 35 40
6
7
c
8
70
9
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
3)Traverse)node*f
4{intcount; =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
اذا ارت النتقال الى