الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مطلوب شرح list

مغلق
بدأه عذبة الاحساس في 7 أكتوبر 2006 · 8 رد · 2,685 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام عليكم.... كيف حالكم .. ومبارك عليكم الشهر

لو سمحتون بغيت شرح مفصل عن list

بحثت في الموقع لكن ما حصلت

ومحتاجه ليه ضروري

جزاكم الله خير الا عنده طلبي لا يبخل عليي

عذبة الاحساس

#2

انتى قصدك لينكد لست ولا ايه بالظبط

#include <stdlib.h>
5:  #include <stdio.h>
6:  #include <string.h>
7:
8:  /* The list data structure. */
9:  struct data {
10:	 char name[20];
11:	 struct data *next;
12:	 };
13:
14: /* Define typedefs for the structure */
15: /* and a pointer to it. */
16: typedef struct data PERSON;
17: typedef PERSON *LINK;
18:
19: main()
20: {
21: /* Head, new, and current element pointers. */
22: LINK head = NULL;
23: LINK new = NULL;
24: LINK current = NULL;
25:
26: /* Add the first list element. We do not */
27: /* assume the list is empty, although in */
28: /* this demo program it always will be. */
29:
30: new = (LINK)malloc(sizeof(PERSON));
31: new->next = head;
32: head = new;
33: strcpy(new->name, "Abigail");
34:
35: /* Add an element to the end of the list. */
36: /* We assume the list contains at least one element. */
37:
38: current = head;
39: while (current->next != NULL)
40: {
41:	 current = current->next;
42: }
43:
44: new = (LINK)malloc(sizeof(PERSON));
45: current->next = new;
46: new->next = NULL;
47: strcpy(new->name, "Catherine");
48:
49: /* Add a new element at the second position in the list. */
50: new = (LINK)malloc(sizeof(PERSON));
51: new->next = head->next;
52: head->next = new;
53: strcpy(new->name, "Beatrice");
54:
55: /* Print all data items in order. */
56: current = head;
57: while (current != NULL)
58: {
59:	 printf("\n%s", current->name);
60:	 current = current->next;
61: }
62:
63: printf("\n");
64: return(0);
65: }

ده مثتال على الينكد لست وانا عندى شرح ليها بس انجلش لو هى طلبك قوليلى وانا ابعتلك الشرح او اترجمهولك او اشرحهولك انا حتى

#3

هلا اخوي

اي هذا الا اقصده

بس ابي شرح اللست من البداية

لانه الكود الا خليته صعب شوي عليي

فاذا ماكو ازعاج عليك ابي الشرح كامل مع شرح الكود الا خليته بعد

وان شاء الله في ميزان حسانتك

عذبة الاحساس

#4

الشرح اللى عندى انجليزى لو حينفع معاكى انا ممكن ابعتلك الكتاب

اما لو كنتى عايزة شرح عربى انا ممكن اترجمهولك بس تدينى فرصة يوم على الاقل

#5

اخوي darekand

ادري تعبتك وياي بس ما عليش ان شاء الله في ميزان حسناتك

اي بغيت الشرح بالعربي لان عندي الكتاب بالانجليزي ومو فاهمه له عدل

بغيته بالعربي يكون احسن

عذبة الاحساس

#6

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

السلام عليكم

دى بعض اللينكات اللى تتحدث بإختصار عن ال liked list وفائدتها وأنوعها وكيفية إستخدامها

/index.ph...amp;hl=hw03.txt

/index.ph...c=62881&hl=

/index.ph...p;hl=linkedlist

أتمنى عدم تكرار الموضوع مرة أخرى :)

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#7

با المرفقات شرح لاحد الاخوه بارك الله فيه وجعله في ميزان حسناته درس با العربي عن اللينكذ ليست ممكن يفيدك

________________Data_Structure.rar

#8

Abdulsalam

الملف ما يفتح عندي

#9
القوائم المترابطه او المتسلسله :Linked Lists
-----------------------------------------------------------
القوائم المترابطه هي طريقه مفيده لتخزين البيانات (داتا) ..ويمكن تطبيقها 
بسهوله في ال c
لماذا نعطي القائمه المترابطه في قسم المؤشرات ؟؟
لانه وكما سترى قريبا ..ز المؤشرات هي مركز القائمه المترابطه
هناك انواع متعدده في القوائم المترابطه .. منها القوائم المترابطه 
المفرده ... 
والقوائم المترابطه المزدوجه ... وشجرات ثنائيه ...
كل نوع يلائم نوع محدد من تخزين البيانات (داتا).. والشيء الوحيد المشترك 
بين 
هذه القوائم هو .. ان كل الحلقات (لينكس ) بين قطع البيانات محددة ومعرفه 
بالمعلومات  التي تحتويها هذه الحلقاات بواسطه مؤشرات ... وهذا يختلف 
بوضوح عن 
نظام الاعداد الذي يكون فيه الحلقات بين قطع البيانات ناتجه عن ترتيب 
وتخزين 
هذه الاعداد المرتبه ...
هذا القسم يشرح اكثر انواع القوائم المترابطه اهميه : ( القوائم المترابطه 
المفرده ) التي اسميها ببساطه ( القائمه المترابطه )

اساسيات القوائم المترابطه :Basics of Linked Lists
-----------------------------------------------------------------
كل واحده من البيانات في القائمة المترابطه موجوده في مركب )structure)لقد 
تعلمت عن المركبات في اليوم 11
المركب يحتوي على عناصر البيانات الضروريه لحمل البيانات المخزنه... وهذا 
يعتمد 
على حاجه برنامج معين ... اضف الى ذلك .. هناك عنصر اخر للبيانات ... هو 
المؤشر
هذا المؤشر يوفر الروابط في القائمه المترابطه
struct person {
char name[20];
struct person *next;
};

هذا الرمز يعرف ويوضح الاسم المركب للشخصstructure named person... 
للبيانات 
(داتا ) ...
الشخص يحتوي على 20 عنصر من المركبات المرتبه ... انت عموما لا تستعمل 
قائمه 
الروابط لهذه البيانات البسيطه .. ولكن ستخدمنا كمثال ...
مركب الشخص يحتوي ايضا على مؤشر لنوع الشخص .. وبكلمات اخرى ..ز مؤشر 
لتركيب 
اخر من نفس النوع ...
هذا يعني ان كل تركيب لنوع شخص .. لا يحتوي فقط على جمله كبيره من 
المعلومات 
والبيانات... ولكن ايضا يستطيع ان يؤشر الى تركيبه شخص اخر ....
النموذج 15.7 يعرض كيف تستطيع التركيبات ان تتصل ببعض في القائمة
النموذج 15.7 : روابط او حلقات القائمه المترابطه  Figure 15.7.
لاحظ ان في النموذج 15.7
كل تركيبه شخص تؤشر لتركيبه الشخص التالي
اخر تركيبه شخص لاتؤشر الى اي شيء ... اخر عنصر في القائمه المترابطه 
ع‘رفت 
بواسطة مؤشر العنصر واعطيت القيمه صفر ..
_______________________________
ملاحظه :  التركيبه التي تصاع الحلقات او الروابط في القائمه المترابطه 
يمكن 
الاشاره اليها ب ( حلقات او عناصر القائمه المترابطه )
---------------------------------------------------------
لقد رايت كيف اخر رابطه في القائمه المترابطه تعرف او تطابق ... ماذا عن 
الحلقه 
الاولى ؟؟؟
هذا معرف بمؤشر خاص وليس مركب .. يسمى المؤشر الرئيسي او الاساسي head 
pointer
المؤشر الرئيسي دائما يؤشر الى العنصر الاول في القائمه المترابطه
العنصر الاول يحتوي على مؤشر يؤشر للعنصر الثاني ... وهكذا الى ان تصل الى 
عنصر 
مؤشره صفر ...
اذا كانت القائمه فارغة (لا تحتوي على عناصر ) المؤشر الرئيسي في وضعية 
الصفر
النموذج 15.8 يوضح المؤشر الرئيسي قبل بدء القائمه وبعد ان تتم اضافة 
العنصر 
الاول من القائمه
Figure 15.8. A linked list's head pointer
------------------------------------------------------
ملاحظه :
المؤشر الرئيسي هو مؤشر للعنصر الاول في القائمه ... المؤشر الرئيسي 
احيانا 
يرمز له بانه ( مؤشر العنصر الاول .. او المؤشر الاعلى )top pointer.
----------------------------------------------------------------------
** العمل بالقوائم المترابطه : Working with Linked Lists
-----------------------------------------
عندما تتعامل في قوائم مترابطه .. تستطيع اضافه .. او مسح .. او تعديل 
العناصر 
والروابط ...
تعديل العناصر لا يفرض صعوبه حقيقيه .. ولكن .. اضافة او مسح عناصر .. 
صعبه بعض 
الشيء
كما بدنا سابقا .. العناصر في القائمه متصله بمؤشرات .. اكثر العمل الذي 
يحتاجه 
اضافة او مسح عناصر يتكون من مضاعفه هذه المؤشرات
العناصر يمكن اضافتها لبدايه وسط او نهاية القائمه ... هذا سيحدد كيفيه 
تغيير 
المؤشرات
لاحقا في هذا القسم .. سوف تجد عرض لقائمه مترابطه بسيطه .. كما ستجد 
برامج 
اكثر تعقيدا ايضااااا
قبل الدخول في تفاصيل الرموز ... فكره جيده ان تفحص وتختبر بعض التحركات 
التي 
تحتاج ان تطبقها بالقائمه المترابطه ... لهذه الاقسام او الاجزاء .. سوف 
نتابع 
استعمال تركيب الشخص الذي تم عرضه سابقاا

تمهيدات : Preliminaries
---------------------------------
قبل ان تستطيع البدء بقائمه مترابطه ... يجب عليك تعريف تركيبه البيانات 
التي 
سيتم استعمالها في القائمه .. كما يجب عليك اضهار واختيار المؤشر الرئيسي 
.. 
بما ان القائمه تبدا فارغه ... المؤشر الرئيسي يجب وضعه مبدئيا على الصفر
وسوف تحتاج ايضا الى مؤشر اضافي لوع قائمه المركبات التي سيتم استعمالها 
في 
اضافة مستندات او ارشيفاات
قد تحتاج الى اكثر من مؤشر كما سترى بعد قليل ....
هذا ما يجب عليك عمله :
تركيبه الشخص : struct person {
1- اسم الرمز (20) char name[20];
تركيبه الشخص __ تابع struct person *next;

تركيبه الشخص الجديدstruct person *new;

تركيبه الشخص الرئيسي struct person *head;

الرئيسي = صفرhead = NULL;


اضافة عناصر بدائيه للقائمه :Adding an Element to the Beginning of a 
List
------------------------------------
اذا كان المؤشر الرئيسي صفر .. القائمه تكون فارغه .. العناصر الجديده سوف 
تكون 
الوحيده فيها
اما اذا كان المؤشر الرئيسي ليس صفرا .. فالقائمه فيها عنصر او اكثر
في كلا الحالتين . الخطوات في اضافة عناصر جديده لبداية القائمه تكون 
نفسها ...
1- اعمل مثال للتركيبه .. وتخصص مساحه الذاكره باستعمال malloc().
2- اضبط المؤشر التالي للعنصر الجديد للقيمه الحاليه للمؤشر الرئيسي .. 
هذا 
سيكون صفر اذا كانت القائمه فارغه او  عنوان العنصر الاول
3- اجعل المؤشر الرئيسي يؤشر على العنصر الجديد

ها هو الرمز او الكود لتنفيذ المهمه :

new = (person*)malloc(sizeof(struct person));
new->next = head;
head = new


--------------------------------
تحذير :
من المهم تحويل المؤشرات للترتيب الصحيح .. اذا اعدت تحديد المؤشر الرئيسي 
اولااا .. مستخسر القائمه
____________________
النموذج 15.9 يعرض الخطوات لاضافه عنصر جديد على قائمه فارغه ... والنموذج 
15.10 يعرض اضافه عنصر جديد لقائمه موجوده اساسا
Figure 15.9. Adding a new element to an empty linked list.

Figure 15.10. Adding a new first element to an existing list.

لاحظ ان mallocقد تم استعماله لتوزيع الذاكره او تخصيص ذاكره للعنصر 
الجديد
كلما اضيف عنصر جديد .. الذاكره التي يحتاجها سيتم تخصيصهااا
خاصيه callocيمكن ايضا استعمالها
يجب ان ننتبه للاختلاف بين هاتين الوظيفتين
الاختلاف الرئيسي هو ان calloc سوف يبدا العنصر الجديد  .. اما malloc  
فلااا


تحذير :  ال malloc في الكود السابق .. الجزء لم يؤكد ان الذاكره قد خصصت 
.. 
يجب عليك دايما ان تتاكد من قيمه وظيفه الذاكره المرتجعه

------------------------------
ملاحظه :
عندما تستطيع ... ابدا بالمؤشرات على الصفر عندما تعرضهم ... ابدا لا تترك 
المؤشر غير محددا
-----------------------------------
اضافه عنصر لنهاية القائمه : Adding an Element to the End of the List
لاضافة عنصر لنهايه القائمه المترابطه  انت تحتاج لان تبدا من المؤشر 
الرئيسي 
ومن خلال القائمه حتى تجد العنصر الاخير
بعد ان تجد العنصر الاخير اتبع هذه الخطوات :
1- اعمل مثال لتركيبتك .. خصص مساحه من الذاكره باستعمال malloc
2- اضبط المؤشر التالي في العنصر الاخير ليؤشر الى العنصر الجديد الذي 
عنوانه 
هوه malloc
3- اضبط المؤشر التالي في العنصر الجديد الى صفر  ليؤشر بانه اخر عنصر في 
القائمه
ها هو الكود :
person *current;
...
current = head;
while (current->next != NULL)
	current = current->next;
new = (person*)malloc(sizeof(struct person));
current->next = new;
new->next = NULL;

النموذج 15.11 يعرض الخطوات لاضافه عنصر جديد لنهاية القائمه المترابطع
Figure 15.11. Adding a new element to the end of a linked list.


اضافة عنصر لوسط القائمه :Adding an Element to the Middle of the List
عندما تعمل بقائمه مترابطه .. اغلب الاوقات ستضيف عناصر في وسط القائمه
تماما مكان اضافة العنصر الجديد اعتمادا على كيفيه حفظك للقائمه
مثال : اذا تم تخزينها على واحد او اكثر من عناصر البيانات ... هذه 
العمليه شوف 
تحتاج منك ان تحدد اولا المكان في القائمه  التي سيتم فيه اضافة العنصر 
الجديد 
ثم تضيفه

هذه هي الخطوات :
1- في القائمه حدد العنصر الذي سوف ياتي بعد العنصر الجديد :نسميه العنصر 
المحدد )
2-اعمل مثال للتركيبه الخاصه بك ... وخصص الذاكره باستعمال malloc
3- اضبط مؤشر العنصر المحدد ليؤشر على العنصر الجديد الذي عنوانه رجع اليك 
ب 
malloc
4- اضبط المؤشر التالي للعنصر الجديد ليؤشر الى العنصر الذي كان العنصر 
المحدد 
مشيرا اليه عادة

ها هو شكل الرموز والكودات :
person *marker;
/* Code here to set marker to point to the desired list location. */
...
new = (LINK)malloc(sizeof(PERSON));
new->next = marker->next;
marker->next = new;

Figure 15.12 illustrates this process.

Figure 15.12. Adding a new element to the middle of a linked list
النموذج 15.12 اضافه عنصر جديد في منتصف القائمه


مسح او ازله عنصر من القائمه :Deleting an Element from the List
مسح عنصر من القائمه المترابطه  امر بيسط ..ز ويتم بالتلاعب بالمؤشرات .. 
الطريقه تعتمد على مكان وجود العنصر ففي القائمه
1- لمسح العنصر الاول : اضبط المؤشر ليؤشر على العنصر الثاني من القائمه
2- لمسح اخر عنصر : اضبط المؤشر التالي للعنصر قبل الاخير الى صفر
3-لمسح اي عنصر في القائمه : اضبط امؤشر التالي للعنصر الذي هو قبل العنصر 
المراد مسحه ليؤشر الى العنصر الذي بعد العنصر المراد مسحه
هاهي الكودات
head = head->next;

This code deletes the last element in the list:


person *current1, *current2;
current1 = head;
current2= current1->next;
while (current2->next != NULL)
{
	current1 = current2;
	current2= current1->next;
}
current1->next = null;
if (head == current1)
	head = null;


اخيرا الرموز التاليه تمسح العناصر من داخل القائمه :

person *current1, *current2;
/* Code goes here to have current1 point to the */
/* element just before the one to be deleted. */
current2 = current1->next;
current1->next = current2->next;


بعد ايا من هذه العمليات .. العناصر الممسوحه تبقى موجوده في الذاكره .. 
ولكنها 
مسحت من القائمه لانه لا يوجد مؤشرات تؤشر اليها
في البرنامج الحقيقي ... يجب عليك ان لا تستعيد الذاكره المشغوله بالعناصر 
الممسوحه
هذا يمكن الحصول عليه بالعمليات الحره
سوف تتعلم هذه العمليه بالتفصيل في اليوم 20  ... العمل مع الذاكره



***عرض للقائمه المترابطه :A Simple Linked List Demonstration

النموذج 15.12 يعرض اساسيات استعمال القائمه المترابطه ... هذا البرنامج 
هو 
لغرض العرض فقط .. لانه لا يقبل معلومات مدخله من المستعمل ولا يعمل اي 
شيء 
مفيد سوا عرض الرموز او الكودات التي تحتاجها في اغلب مهام القائمات 
المترابطه
البرنامج يعمل ما يلي :
1- يعرف التركيبه والمؤشرات المطلوبه للقائمه
2- يضيف   عنصر لاول للقائمه
3- يضيف عنصر لاخر القائمه
4- يضيف عنصر لوسط القائمه
5- يعرض محتويات القائمه على الشاشه

عرض النموذج 15.12   اساسيات القائمه المترابطه
Listing 15.12. The basics of a linked list.
1:  /* Demonstrates the fundamentals of using */
2:  /* a linked list. */
3:
4:  #include <stdlib.h>
5:  #include <stdio.h>
6:  #include <string.h>
7:
8:  /* The list data structure. */
9:  struct data {
10:	 char name[20];
11:	 struct data *next;
12:	 };
13:
14: /* Define typedefs for the structure */
15: /* and a pointer to it. */
16: typedef struct data PERSON;
17: typedef PERSON *LINK;
18:
19: main()
20: {
21: /* Head, new, and current element pointers. */
22: LINK head = NULL;
23: LINK new = NULL;
24: LINK current = NULL;
25:
26: /* Add the first list element. We do not */
27: /* assume the list is empty, although in */
28: /* this demo program it always will be. */
29:
30: new = (LINK)malloc(sizeof(PERSON));
31: new->next = head;
32: head = new;
33: strcpy(new->name, "Abigail");
34:
35: /* Add an element to the end of the list. */
36: /* We assume the list contains at least one element. */
37:
38: current = head;
39: while (current->next != NULL)
40: {
41:	 current = current->next;
42: }
43:
44: new = (LINK)malloc(sizeof(PERSON));
45: current->next = new;
46: new->next = NULL;
47: strcpy(new->name, "Catherine");
48:
49: /* Add a new element at the second position in the list. */
50: new = (LINK)malloc(sizeof(PERSON));
51: new->next = head->next;
52: head->next = new;
53: strcpy(new->name, "Beatrice");
54:
55: /* Print all data items in order. */
56: current = head;
57: while (current != NULL)
58: {
59:	 printf("\n%s", current->name);
60:	 current = current->next;
61: }
62:
63: printf("\n");
64: return(0);
65: }
Abigail
Beatrice
Catherine

تحليل :
من الامكان ان تعرف بعض الرموز
السطور من 9 -12 يوضح تركيبه البيانات في القائمه
السطر 16 و17 يعرف نوعية تركيبه البيانات داتا ومؤشر تركيبه البيانات
عالغالب هذا ليس ضروريا ولكنه يبسط الترميز (coding ) بالسماح لك بكتابه 
شخص 
مكان تركيبه البيانات .. او رابط (لينك ) مكان تركيبه البيانات
السطور 22-24 تعرضوتوضح المؤشر الرئيسي وكم مؤشر اخرين التي سيتم 
استعمالهم في 
التعامل وترتيب القائمه
كل هذه المؤشرات تم ضبطها على صفر
السطور 30 -33 اضافة روابط جديده لبدايه  القائمه
30 يخصص بناء بيانات جديده .. لاحظ نجاح عمل ال  malloc.. وانت لن تقوم به 
في 
البرامج الحقيقيه
السطور 31 ضبط مؤشر التالي في التركيبه الجديده ليؤشر الى ما يحتويه 
المؤشر 
الرئيسي
لماذا نقوم باسناد صفر للمؤشر الرئيسي ؟؟؟ هذا يحصل فقط اذا كنت تعرف ان 
القائمه فارغه
كما كان مكتوب .. الرموز سوف تعمل حتى لو كانت القائمه فيها بعض العناصر
العنصر الاول الجديد سيؤشر الى العنصر الذي كان هو الاول سابقاا
وهو تمام الذي تريده
السطر 32 يجعل المؤشر الرئيسي يؤشر الى الارشيف الجديد والسطر 33 يخزن بعض 
المعلومات في الارشيف
اضافة عنصر الى نهاية القائمه  معقد بعض الشيء . على الرغم من انه في هذه 
الحاله انت تعلم ان القائمه فيها عنصر واحد فقط ولا تستطيع ان تفترض هذا 
في 
البرنامج الحقيقي
لهذا من الضروري النظر والبحث في القائمه .. بدءا بالعنصر الاول الى ان 
تجد 
العنصر الاخير
كما هو موضح الى جانب المؤشر كونه صفرااا

عندها تعرف انك قد وجدت نهاية القائمه
هذه المهمه تستطيع اكمالها في السطور 38 -42 عندما تجد العنصر الاخير 
سيكون 
الامر سهلااا لتخصص تركيبه بيانات جديده
اجعل العنصر  الاخير سابقاا يؤشر اليها واضيط المؤشر للعنصر الجديد الى 
صفر
الان هو العنصر الاخير في القائمه
هذا موجود في السطور 44 -47
المهمه التاليه هي اضافة عنصر الى وسط القائمه .. في هذه الحاله عند 
المرتبه 
الثانيه

بعد ان تخصص تركيبه بيانات جديده .. سطر 50 .. مؤشر العنصر الجديد يؤشر 
الى 
العنصر الذي كان هو العنصر الثاني ولكن الان اصبح العنصر الثالث في 
القائمه ... 
سطر 51 ..
والمؤشر التالي للعنصر الاول  اجعله يؤشر للعنصر الجديد... سطر 52 ..
اخيرا البرنامج يطبع كل هذه الملفات والارشيفات في القائمه المترابطه
هذا امر سهل للبدء بالعنصر الذي يؤشر اليه المؤشر الرئيسي .. ثم التقدم في 
القائمه الى ان تجد اخر عنصر ومؤشره يؤشر الى صفر
السطور 56 -61 تعمل هذه المهمه


تطبيق القائمه المترابطهImplementing a Linked List

الان رايت الطرق لاضافه روابط وحلقات الى القائمه .. حان الوقت لتراهم 
يطبقون 
العمل
النموذج 15.13 هو برنامج طويل يستعمل القائمه المترابطه ليحمل قائمه مكونه 
من 
خمس مركبات
المركبات تم تخزينها في الذاكره بواسطة القائمه المترابطه ... هذه 
المركبات 
يمكن ان تكون ببساطه .. اسماء .. عنواين .. او اي بيانات اخرى

لابقاء المثال سهل للغايه .. فقط احفظ مركب واحد في كل حلقه او رابط
الذي يجعل برنامج القائمه المترابطه معقدا .. هو انها تقسم الحلقات كلما 
اضيفت 
واحده جديده
بالطبع هذا ما يجعل البرنامج قيك جدا .. كل حلقه تضاف الى الو .. وسط .. 
او اخر 
القائمه اعتمادا على قيمتهاااا

الحلقه دائما تحفظ .. اذا اردت فقط ان تكتب برنامج .. ليضيف حلقات الى 
نهاية 
القائمه فقط
المفهوم سيكون اكثر سهوله ولكن البرنامج ايضا سيكون اقل فائدة

Listing 15.13. Implementing a linked list of characters.
1:  /*========================================================*
2:   * Program:  list1513.c								   *
3:   * Book:	 Teach Yourself C in 21 Days				  *
4:   * Purpose:  Implementing a linked list				   *
5:   *========================================================*/
6:  #include <stdio.h>
7:  #include <stdlib.h>
8:
9:  #ifndef NULL
10: #define NULL 0
11: #endif
12:
13: /* List data structure */
14: struct list
15: {
16:   int	ch;	 /* using an int to hold a char */
17:   struct list *next_rec;
18: };
19:
20: /* Typedefs for the structure and pointer. */
21: typedef struct list LIST;
22: typedef LIST *LISTPTR;
23:
24: /* Function prototypes. */
25: LISTPTR add_to_list( int, LISTPTR );
26: void show_list(LISTPTR);
27: void free_memory_list(LISTPTR);
28:
29: int main( void )
30: {
31:	LISTPTR first = NULL;  /* head pointer */
32:	int i = 0;
33:	int ch;
34:	char trash[256];	   /* to clear stdin buffer. */
35:
36:	while ( i++ < 5 )	  /* build a list based on 5 items given */
37:	{
38:	   ch = 0;
39:	   printf("\nEnter character %d, ", i);
40:
41:	   do
42:	   {
43:		   printf("\nMust be a to z: ");
44:		   ch = getc(stdin);  /* get next char in buffer  */
45:		   gets(trash);	   /* remove trash from buffer */
46:	   } while( (ch < `a' || ch > `z') && (ch < `A' || ch > `Z'));
47:
48:	   first = add_to_list( ch, first );
49:	}
50:
51:	show_list( first );		   /* Dumps the entire list */
52:	free_memory_list( first );	/* Release all memory */
53:	return(0);
54: }
55:
56: /*========================================================*
57:  * Function: add_to_list()
58:  * Purpose : Inserts new link in the list
59:  * Entry   : int ch = character to store
60:  *		   LISTPTR first = address of original head pointer
61:  * Returns : Address of head pointer (first)
62:  *========================================================*/
63:
64: LISTPTR add_to_list( int ch, LISTPTR first )
65: {
66:	LISTPTR new_rec = NULL;	   /* Holds address of new rec */
67:	LISTPTR tmp_rec = NULL;	   /* Hold tmp pointer		 */
68:	LISTPTR prev_rec = NULL;
69:
70:	/* Allocate memory. */
71:	new_rec = (LISTPTR)malloc(sizeof(LIST));
72:	if (!new_rec)	  /* Unable to allocate memory */
73:	{
74:	   printf("\nUnable to allocate memory!\n");
75:	   exit(1);
76:	}
77:
78:	/* set new link's data */
79:	new_rec->ch = ch;
80:	new_rec->next_rec = NULL;
81:
82:	if (first == NULL)   /* adding first link to list */
83:	{
84:		first = new_rec;
85:		new_rec->next_rec = NULL;  /* redundant but safe */
86:	}
87:	else	/* not first record */
88:	{
89:	   /* see if it goes before the first link */
90:	   if ( new_rec->ch < first->ch)
91:	   {
92:		  new_rec->next_rec = first;
93:		  first = new_rec;
94:	   }
95:	   else   /* it is being added to the middle or end */
96:	   {
97:		  tmp_rec = first->next_rec;
98:		  prev_rec = first;
99:
100:		  /* Check to see where link is added. */
101:
102:		  if ( tmp_rec == NULL )
103:		  {
104:			  /* we are adding second record to end */
105:			  prev_rec->next_rec = new_rec;
106:		  }
107:		  else
108:		  {
109:			 /* check to see if adding in middle */
110:			 while (( tmp_rec->next_rec != NULL))
111:			 {
112:				if( new_rec->ch < tmp_rec->ch )
113:				{
114:				   new_rec->next_rec = tmp_rec;
115:				   if (new_rec->next_rec != prev_rec->next_rec)
116:				   {
117:					  printf("ERROR");
118:					  getc(stdin);
119:					  exit(0);
120:				   }
121:				   prev_rec->next_rec = new_rec;
122:				   break;   /* link is added; exit while */
123:				}
124:				else
125:				{
126:				  tmp_rec = tmp_rec->next_rec;
127:				  prev_rec = prev_rec->next_rec;
128:				}
129:			 }
130:
131:			 /* check to see if adding to the end */
132:			 if (tmp_rec->next_rec == NULL)
133:			 {
134:				if (new_rec->ch < tmp_rec->ch ) /* 1 b4 end */
135:				{
136:				   new_rec->next_rec = tmp_rec;
137:				   prev_rec->next_rec = new_rec;
138:				}
139:				else  /* at the end */
140:				{
141:				   tmp_rec->next_rec = new_rec;
142:				   new_rec->next_rec = NULL;  /* redundant */
143:				}
144:			 }
145:		  }
146:	   }
147:	}
148:	return(first);
149: }
150:
151: /*========================================================*
152:  * Function: show_list
153:  * Purpose : Displays the information current in the list
154:  *========================================================*/
155:
156: void show_list( LISTPTR first )
157: {
158:	LISTPTR cur_ptr;
159:	int counter = 1;
160:
161:	printf("\n\nRec addr  Position  Data  Next Rec addr\n");
162:	printf("========  ========  ====  =============\n");
163:
164:	cur_ptr = first;
165:	while (cur_ptr != NULL )
166:	{
167:	   printf("  %X   ", cur_ptr );
168:	   printf("	 %2i	   %c", counter++, cur_ptr->ch);
169:	   printf("	  %X   \n",cur_ptr->next_rec);
170:	   cur_ptr = cur_ptr->next_rec;
171:	}
172: }
173:
174: /*========================================================*
175:  * Function: free_memory_list
176:  * Purpose : Frees up all the memory collected for list
177:  *========================================================*/
178:
179: void free_memory_list(LISTPTR first)
180: {
181:	LISTPTR cur_ptr, next_rec;
182:	cur_ptr = first;				 /* Start at beginning */
183:
184:	while (cur_ptr != NULL)		  /* Go while not end of list */
185:	{
186:	   next_rec = cur_ptr->next_rec; /* Get address of next record 
*/
187:	   free(cur_ptr);				/* Free current record */
188:	   cur_ptr = next_rec;		   /* Adjust current record*/
189:	}
190: }
Enter character 1,
Must be a to z: q
Enter character 2,
Must be a to z: b
Enter character 3,
Must be a to z: z
Enter character 4,
Must be a to z: c
Enter character 5,
Must be a to z: a
Rec addr  Position  Data  Next Rec addr
========  ========  ====  =============
C3A		 1	   a	  C22
C22		 2	   b	  C32
C32		 3	   c	  C1A
C1A		 4	   q	  C2A
C2A		 5	   z	  0

هذا الموضوع مغلق.

مواضيع مشابهة