مما لاحظته هو صعوبت فهم اللنك لست تماماً...
لذا حاولت في هذه العجاله ان اشرحها بشكل مختصر...
لمعرفت اللنك لست في السي يجب معرفة بل اتقان الـ Pointers المؤشرات و
السجلات Structuer .
اللنك لست هو عباره عن عدة خلايا ملتصقه ببعضها البعض بواسطة المؤشرات.(اعتقد انه يمكن عملها في c++ بالكلاسس ارجو ان
تعلموني ان كنت مخطئ).
وهناك عدة انواع منها:السنقل و الدبل و السيركل.
السنقل:الخلية عباره عن قسمين قسم بيانات و الآخر مؤشر للذي بعده,
و تنتهي السلسلة بـ NULL .اي اخر قسم من اخر خليه يساوي NULL .
الدبل: الخليه عباره عن 3 اقسام:الاول مؤشر للخليه السابقه و الثاني يحتوي البيانات ,
و الثالث مؤشر على الخليه التاليه.وتبدأ السلسلة و تنتهي بـ NULL .
السيركل(الدائريه):وهي نوعين سنقل سيركل و دبل سيركل و تختلف عن
السنقل و الدبل بأن اخر خليه تشير الى اول خليه.
و ابين ان انشاء خليه يكون بالامر malloc ويبين البرنامج طريقة استخدامها.
و لحذف خليه يكون بالامر free وهو مبين في الرنامج ايضاً.
/////////////// DUOBLE LINK LIST OPERATIONS ///////////////////////
#include"stdio.h"
//-------------------------- >>> a structuer <<<
typedef struct
{
int id;
float gpa;
}data; // نوع البيانات المطلوبه في اللنك لست
//-------------------------->>> a defanition of a duoble link list <<<
typedef struct node
{
data e;
struct node *next;
struct node *prev;
}recnode, *ptr; // تعريف اللنك لست
//-------------------------->>> insert first in a duoble link list <<<
void ins_first(ptr *h,data newe) // الادخال في الاول
{
ptr p;
p=malloc(sizeof(recnode));
p->e=newe;
p->prev=NULL;
if(*h==NULL)
{
p->next=NULL;
(*h)=p;
}
else
{
p->next=*h;
(*h)->prev=p;
(*h)=p;
}
}
//-------------------------->>> insert last in a duoble link list <<<
void ins_last(ptr *h,data newe) // الادخال في الاخر
{
ptr p,q;
p=malloc(sizeof(recnode));
p->e=newe;
p->next=NULL;
if((*h)==NULL)
{
(*h)=p;
(*h)->prev=NULL;
}
else
{
q=*h;
while(q->next!=NULL)
q=q->next;
q->next=p;
p->prev=q;
}
}
//-------------------------->>> new link <<<
void new_D(ptr *h) // هنشاء لنك لست جديده (اي انشاء رأس للنك).ا
{
*h=NULL;
}
//-------------------------->>> sertch for an element <<<
void sertch(ptr h,int t,ptr *cur) // البحث داخل اللنك لست
{
// ال اتش هو الرئس ,,, و التي هو الهدف المراد البحث عنه ,,, و ال كير هو موقع الهدف
*cur=NULL;
while(h!=NULL && *cur==NULL)
{
if(h->e.id==t)
*cur=h;
else
h=h->next;
}
}
//-------------------------->>> delete first <<<
void del_first(ptr *h,data *z) // مسح الاول
{
ptr p;
if(*h==NULL)
printf("nSory no list...");
else
{
if((*h)->next==NULL)
{
*z=(*h)->e;
free(*h);
}
else
{
p=*h;
*z=p->e;
(*h)=(*h)->next;
(*h)->prev=NULL;
free(p);
}
}
}
//-------------------------->>> delete last <<<
void del_last(ptr *h,data *z) // مسح الاخر
{
ptr p;
if((*h)==NULL)
printf("nSory no list...");
else
{
if((*h)->next==NULL)
{
*z=(*h)->e;
free(*h);
}
else
{
p=*h;
while(p->next!=NULL)
p=p->next;
*z=p->e;
p->prev->next=NULL;
free(p);
}
}
}
//-------------------------->>> delete target <<<
void del_target(ptr *h, int t, data *z) // مسح خليه معينه
{
ptr cur;
sertch(*h,t,&cur);
if(cur==NULL)
printf("nSory target not found...");
else
{
if(cur==(*h))//اذا تحقق الشرط يعني العنصر المطلوب هو الاول
del_first(h,z);
else
{
if(cur->next==NULL)// اذا تحقق الشرط يعني العنصر المطلوب هو الاخير
del_last(h,z);
else
{
*z=cur->e;
cur->prev->next=cur->next;
cur->next->prev=cur->prev;
free(cur);
}
}
}
}
//-------------------------->>> read recored <<<
void read_rec(data *r) // قرائت البيانات
{
printf("nEnter the ID:");
scanf("%d",&r->id);
printf("nEnter the GPA:");
scanf("%f",&r->gpa);
}
//-------------------------->>> display the link <<<
void dis(ptr h) // طباعة اللنك لست
{
printf("n-------------------------------");
printf("nID GPA ");
printf("n-------------------------------");
while(h!=NULL)
{
printf("n%dttt%.2f",h->e.id,h->e.gpa);
h=h->next;
}
}
//////////////////////////////////////////////////////////////////////////
//>>>>>>>>>>>>>>>>>>>>>>>>>> MAIN PROGRAMM <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//////////////////////////////////////////////////////////////////////////
main() // البرنامج الرئيسي
{
int c,t;
data r;
ptr h,cur;
new_D(&h);
do
{
printf("nnnn +-------------------------------------------------+");
printf("n |(1) insret first. |");
printf("n | |");
printf("n |(2) insert last. |");
printf("n | |");
printf("n |(3) delete first. |");
printf("n | |");
printf("n |(4) delete last. |");
printf("n | |");
printf("n |(5) delete a gevin id. |");
printf("n | |");
printf("n |(6) sertch for ID. |");
printf("n | |");
printf("n |(7) deisplay the list. |");
printf("n | |");
printf("n |(8) Exit. |");
printf("n +-------------------------------------------------+");
scanf("%d",&c);
switch( c )
{
case 1:read_rec(&r);
ins_first(&h,r);system("cls");
break;
case 2:read_rec(&r);
ins_last(&h,r);system("cls");
break;
case 3:del_first(&h,&r);
break;
case 4:del_last(&h,&r);
break;
case 5: printf("nEnter the ID:");
scanf("%d",&t);
del_target(&h,t,&r);
break;
case 6: printf("nEnter the ID:");
scanf("%d",&t);
sertch(h,t,&cur);
if(cur==NULL)
printf("nno such ID...");
else
printf("nID:%dtttGPA:%f",cur->e.id,cur->e.gpa);
break;
case 7:dis(h);
break;
default: printf("nNO SUTCH CHOIS....TRY AGEN...");
}
}while(c!=8);
system("cls");
printf("nnnnnnnnnn THANK YOU FOR USEING MY PROGRAMM...");
}
لاحظ انه في تعريف اللنك لست عرفنا الـptr كمؤشر ولو لم نفعل ذلك
لكتبنا الـ ptr في بقية البرنامج كـــ ptr** وهذا يسبب بعض
الارتباك في كتابة البرنامج.فتاره يكتب ptr* عندما نكتب نحن ptr
وتاره يكتب ptr** عندما نكتب نحن ptr* >>
والبرنامج المكتوب اعلاه ليس هو إستخدام اللنك لست بل اساسيات
اللنك لست فمثلاً عندما نكتب الطلاب كل طالب في خليه
عندئذ تحتاج للإدخال و الحذف و البحث عن طالب معين ... الخ.
وهذا البرنامج شغال 100% على الفجول سي بلس بلس كمبايلر.
وهو عن العمليات على الدبل لنك لست التي ارا انها الاصعب و الافضل
ففهمها يؤكد فهم السنقل تماماً.
وارجو منكم ان تدلوني كيف اضع لكم ملف على البور بوين يحتوي على
توضيح للنك لست بالرسم الذي اراه مهماً جداً جداً.
والله ولي التوفيق,,, و السلام.