Sana'a University Level two Faculty of Computer & IT Data struct with c++ Stack and queue جامعة صنعاء كلية الحاسوب وتكنولوجيا المعلومات ما هو المكدس Stack هو احد ه اكل الب انات االكثر سهولة ستخدم بكثرة ف عالم الحواس ب : مترجمات االت حاسبة المعالجات و...الخ. ومفهومها بس ط جدا ادرس المثال االت : تخ ل ان لد نا مجموعة من االطباق "الصحون" مرصوصة فوق بعضها اي صحن وفوقه واحد اخر الى ان نصل الى اخر صحن. االن لك نض ف صحن اخر الى المجموعة جب ان نضعه على رأسهم عن اعلى ش ء top واذا اردنا ان نسحب اي عنصر جب ان نسحب الذي فوقه اوال. اي ال تستط ع سحب الصحن الرابع مثال دون ان نسحب الصحون الت تقع فوقه واال ستنكسر الصحون. مثال اذا اردنا سحب الصحن الثان جب ان نسحب كل الصحون الت تقع فوقها حتى نصل الى الصحن الثان و نسحبه وتكون المجموعة الجد دة مكونة من الصحن االول فقط وذلك الننا سحبنا كل الصحون الت تقع فوقها. و تضح المثال بهذا التعر ف: المكدس هو عبارة عن فكرة "طر قة" تطبق على المصفوفة "ل س ف كل الحاالت ولكن سنستخدم المصفوفة هنا" بح ث ان ادخال العناصر تم من اعلى "كما ف حالة الصحون" وكذلك سحب العناصر تم من اعلى. وذلك على خالف المصفوفة العاد ة مثال اذا ادخلنا ف اي مصفوفة العناصر 2 ثم.01 8 6 4 واردنا عرضها على الشاشة فان النت جة ه : 10 اي 8 6 4 2 على نفس ترت ب االدخال. 1
ولكن اذا ادخلنا االعداد السابقة ف مكدس وعرضنا عناصر المكدس على الشاشة فالنت جة ه : 2 اي 4 6 8 10 على عكس ترت ب االدخال. اي ان العنصر الداخل الى المكدس اوال هو الذي س خرج ف االخ ر والعنصر الداخل الى اعلى المكدس هو الذي س خرج اوال. Last in First Out لذلك تجد دائما مع المكدس هذه العباره وتختصر ب LIFO خالصة : *المكدس هو عبارة عن ه كل ب انات. * تم تطب ق المكدس من خالل المصفوفات او من خالل القوائم المرتبطة "سنتحدث عنها الحقا" * تبع المكدس مفهوم LIFO اي العنصر الذي دخل ف االخ ر هو الذي خرج اوال. *الدخال عنصرف المكدس جب ان نضعه فوق اعلى عنصر. ك ف سنعرف ان العنصر هو اعلى ام ال سنحتاج الى مإشر للمصفوفة "عدد صح ح " وذلك لك نعرف من هو اعلى عنصر ول كن اسمه. top ف الحق قة top ل س مإشر pointer وانما هو عدد int ولكن نستخدمه كدل ل الى العنصر االعلى ف المصفوفة عن اذا كان عندي مصفوفة من 01 عناصر والمستخدم ادخل ق مة اول عنصر ن فان المتغ ر topس حمل الق مة 0 داللة على ان العنصر الثان هو اعلى عنصر. *عمل ة ادخال العنصر الى المكدس تسمى push والت تعن دفع العنصر الى اعلى المكدس. *عمل ة سحب العنصر من المكدس تسمى pop صورة توض ح ة: اعتقد ان المفهوم اتضح قل ال والكود هو خ ر الكالم ما " قل و دل" 2
اىع ي بد عي المكدس :two operations حتى االن لد نا عملت ن وهم عمل ة ادخال العناصر الى المكدس وسم ناها push عمل ة اخراج العناصر من المكدس وسم ناها pop العمل ة push تقوم بادخال العنصر الى المكدس هذا العنصر س قوم المستخدم بتمر ره الى الدالةpush () اي اذا اردنا ادخال العنصر 7 مثال الى المكدس كل ما عل نا هو استدعاء الدالة وتمر ر العنصر 7 ال ها كاالت : كود: push(7); العمل ة االخرى وه pop تقوم بسحب العناصر من المكدس ولتنف ذ هذه العمل ة جب ان تستدع الدالة () popووضع متغ ر لك حمل ق مة العنصر الذي تم سحبه من المكدس بهذا الشكل: كود: int var=pop(); خىاسص خ االدخبه واالخشاج ف stack 3
Stackاوال : أمثلة على الداخل اوال الخارج اخ را )الداخل اخر الخارج اوال ) ثش ب ح قى ثع ي خع ي خ االدخبه واالخشاج : #include<iostream.h> #include<conio.h> اىجش ب ح عي عبى م زغ ش اىسد عشف بء ه بء//; size=10 int 1- ثب اىزىة وه ئ بء 10 زد هب صفىفخ عشف بء//; a[10],top=-1 int االخشاج داىخ عشف بء//;() pop int داخيهبء ىقع وعشف بء داىخ عشف بء ه بء//;( push(int[],int void main() اىجش ب ح ف اسزخذا هب ىغشض زغ ش عشف بء//; i,k int ثبىششط ىي شوس معذاد و سزخذ دواسح ع و ز ه بء//(++ for(i=0;i<size;i cout<<"enter the item push pleas\n"; اىج بد ادخبه ه بء ز //; cin>>k اىجىش داىخ اى اى ذخيخ اىع بصش رض ز ه بء//;( push(a,k ثبىششط ىي شوس معذاد و سزخذ دواسح ع و ز ه بء//(++ for(i=0;i<size;i اىجىة داىخ اسزذعبء ز ه بء//;" n \ cout<<"\nthe elemant pop\n"<<pop()<<" اىشبشخ ا قبف ثع و رقى //;() getch اىجىش داىخ هبرح//( k void push(int a[],int ي ب خ اىسزبك فب 1 -اىسد سبو اىزىة ارامب ششط هبرا//( if(top==size-1 cout<<" FULL STACK"; ف ز ر زي ى اىسزبك ارا// ثىازذ اىزىة ص بدح ز ه بء//; a[++top]=k اىجىش داىخ//() pop int اىصفش اصغش اىزىة مب ارا ز ه بء//( if(top<0 خبى خ اىذاىخ فئ //;" STACK cout<<"empte ز بى // ثىازذ رىة اه قصب //;[-- a[top return //********************************************************************** ثش ب ح قى ثئضبفخ سزبك فبسغخ ث ض ف اى هب 3 ع بصش.. ثعذ رأىل قى اىجش ب ح ثسزف اىشأس وعشض ثق خ اىع بصش عي اىشبشخ: #include <iostream> using namespace std; struct Node int Data; Node *Next; 4
; Node* InitStack(Node *S) S = NULL; return S; bool IsEmpty(Node *S) if (S == NULL) return true; return false; Node* Push(int x, Node *S) Node *P = new(node); P -> Data = x; P -> Next = S; S = P; return S; int Top(Node *S) if (!IsEmpty(S)) return S->Data; cout<<"stack empty..."; // un derflow Node* Pop(Node *S) if (!IsEmpty(S)) Node *P = S; S = S ->Next; delete P; return S; cout<<"stack empty..."; void main() Node *S; S = InitStack(S); 5
S = Push(10, S); S = Push(5,S); S = Push(2,S); S = Pop(S); while (!IsEmpty(S)) cout<<top(s)<<"\t"; S=Pop(S); cout<<endl; //************************************************* برنامج قوم بعمل ة االدخال واالخراج وعمل ة العرض: #include<iostream.h> #include<conio.h> //----------------------------- int top=0; const int size=5; int stack[size]; //--------------------------- int empty() if(top==0) return 1; return 0; //----------------------------- int full() if(top==size) return 1; return 0; //--------------------------------- void push(int x) if(!full()) stack[top++]=x; cout<<"the stack is full\n"; //----------------------------------- int pop() if(!empty()) return stack[top--]; cout<<"the stack is empty\n"; //------------------------------------- void show() 6
if(!empty()) for(int i=0;i<top;i++) cout<<stack[i]<<" "; //------------------------------------ main() int op; do cout<<"1-add\n"; cout<<"2-pop\n"; cout<<"3-show\n"; cin>>op; switch(op) case 1: int x; cout<<"input val\n"; cin>>x; push(x); case 3 : show(); case 2: int y =pop(); cout<<"\nthe delete of stack\n"<<y; while(op!=0);//end while-------- getch(); //The End----- //************************************************ برنامج قوم بعمل ة االدخال واالخراج استخدمنا ف هاذا المثال :struct #include<iostream.h> //******************************* const int size=5; //******************************* struct stack int top; int item[size]; ps; //***************************** void initial(struct stack *ps) ps->top=-1; cout<<ps->top; //****************************** void push(struct stack *ps,int m) if(ps->top<(size-1)) (ps->top)++; ps->item[ps->top]=m; cout<<"full\n"; //******************************** void pop(struct stack *ps) 7
if(ps->top>(-1)) cout<<ps->item[ps->top]<<endl; (ps->top)--; cout<<"empty\n"; //******************************** int main() int n, op; initial(&ps); do cout<<"chose 1 to push and 2 to pop\n"; cin>>op; switch(op) case 1:; cin>>n; push(&ps,n); case 2: return 0; pop(&ps); default: cout<<"error"; while(op!=3); هبرا اىجش ب ح ثبسزخذا اى :Dynamic Stack #include<iostream.h> اى ثبسزخذا اىجش ب ح هبرا //Dynamic Stack //******************** struct node int data; node*next; ; node*top; //***************** void push(int c) if(top==null) node*p=new node; p->data=c; p->next=null; top=p; node*p=new node; p->data=c; p->next=top; top=p; //********************** int pop() 8
خىاسص خ االدخبه خىاسص خ االخشاج node*p=top; int x=p->data; top=top->next; delete p; return x; //************************ main() int i,x; cin>>x; while(x>-1) push(x); cout<<"enter the element\n"; cin>>x; while(top!=null) cout<<"delete the element\n"<<pop()<<endl; //*************************************************************** خىاسص خ اىQueue 9
ثان ا : : Queue ب هى : Queue هو عبارة عن ه كل ب انات ستخدم لتخز ن الب انات من اجل معالجتها بح ث ان العنصر الذي دخل اوال للطابور تم معلجته اوال والعنصر الذي دخل ف االخر هو الذي تم المعالجة له ف االخر. مثال على الطابور او الك و : فترة الصبح لما كون ف ها زحمة المسافر ن خل نا نإخذ مثال طابور التؤش رة ف المطار مثال ف ولما دخلها تفجؤ ف الزحمة ولنفرض انو واحد من موظف ن المطار ؤت متؤخر على المطار لحت دخل على مكانه بس لألسف ما قدر دخل الموجودة هناك فحاول انو تجاوز المسافر ن عارف ن ل ش النو ف قانون ف الطابور انو اي عنصر ب ج راح صف ف اخر الطابور وعمل ة االضافة على الطابور بنسم ها "ا نك و" وبعد فترة تحرك الطابور لالمام النو طلع واحد لما ات وحاسب فه العمل ة وه عمل ة الحذف نسم ها "د ك و "ومتل هاذا من المسافر ن دور الموظف. هاذا الشكل العام للك و: او مثل طابور استخدام الصراف االل : ف المثال السابق فإنه المبدا الذي اتبعنا انه العنصر الذي دخل ف االول خرج ف االول وتسمى "ف رست ا ن ف رست اوت" ( first in first out) وبمعنى اخر ان عمل ة االضافة تتم على العنصر االخ ر والذي سوف نسم ة ف تم على العنصر االول والذي سوف نسم ة "فرونت ". "ر ر "والحذف 11
مالحظة :*** -:front هو فرونت وهو العنصر االول الذي تتم عل ة عمل ة الحذف. -:rear هو ر ر وهو العنصر االخ ر الذي تم اضافته وتتم عمل ة االضافه عل ه. العمل ات الت تحدث على ك و : عمل ة االضافة الت تحدث على الك و وتسمى ا نك و** وعمل ة الحذف الت تحدث على المصفوفة وتسمى د ك و** وتتكون الك و من مصفوفه + دل ل ن وهما " ر ر + فرونت ". //abdo.solh #include<iostream.h> #include<conio.h> int size=10; struct queue int rear; int front; int ele[10]; q;//******************************** void initli( queue*q) q->front=0; //front =Null; q->rear=-1; //rear=1; //***************************** int insert ( queue*q,int e ) if((q->rear)>size) cout<<"the queue is full \n"; q->rear=q->rear+1; q->ele[q->rear]=e; //**************************** int delet( queue *q) if(q->rear < q->front) cout<<"is empty \n"; return 0; return q->ele[q->front++]; //********************************** void display( queue *q) for(int i=q->front;i<=q->rear;i++) cout<<q->ele[i]<<endl; cout<<"****************"; //********************************** int main() 11
initli(&q); int z; int value; //*********************** while(1) cout<<"\n"; cout<<"enter 1 to add to queue \n"; cout<<"enter 2 to delete to queue \n"; cout<<"enter 3 to display \n"; cout<<"enter 4 to exit \n"; cin>>z; cout<<"**********"; cout<<"\n"; //******************************** switch(z) case 1 : cout<<"enter the number \n"; cin>>value; insert(&q,value); case 2: cout<<"you delete value "<< delet(&q)<<endl; case 3: display(&q); case 4: exit(0); //*********************************** //************************************************************** برنامج قوم بعمل ة االسناد من داخل البرنامج من المصفوفة والعرض وهاذة الصورة تقوم بتوض ح عمل ال ك و: #include <iostream.h> #include <conio.h> #define MAX 5 class queue private: int t[max]; int rear; int front; public: queue() front=-1; rear=-1; void del() int tmp; if(front==-1) 12
cout<<"queue is Empty"; for(int j=0;j<=rear;j++) if((j+1)<=rear) tmp=t[j+1]; t[j]=tmp; rear--; if(rear==-1) front=-1; front=0; void add(int item) if(front==-1 && rear==-1) front++; rear++; rear++; if(rear==max) cout<<"queue is Full\n"; rear--; return; t[rear]=item; void display() if(front!=-1) for(int i=0;i<=rear;i++) cout<<t[i]<<" "; cout<<"empty"; 13
; int main() queue a; int data[5]=32,23,45,99,24; cout<<"queue before adding Elements: "; a.display(); cout<<endl<<endl; for(int i=0;i<5;i++) a.add(data[i]); cout<<"addition Number : "<<(i+1)<<" : "; a.display(); cout<<endl; cout<<endl; cout<<"queue after adding Elements: "; a.display(); cout<<endl<<endl; for(int i=0;i<5;i++) a.del(); cout<<"deletion Number : "<<(i+1)<<" : "; a.display(); cout<<endl; getch(); return 0; //********************************************************************** ثش ب ح قى ثع ي خ االضبفخ اى اىن ى وىسزف اىن ى وعشض اىع بصش: #include <iostream.h> //#include<stdlib.h> #define size 10 struct queue int x[size]; int front; int rear; q; //******************************* void initilztion(struct queue *q) q->front=0; q->rear=-1; //******************************** void insert(struct queue *q,int e) 14
if((q->rear)>size) cout<<"the queue is full \n"; q->rear=q->rear+1; q->x[q->rear]=e; //********************************* int delet(struct queue *q) if(q->rear < q->front) cout<<"is empty \n"; return 0; return q->x[q->front++]; //********************************** void display(struct queue *q) for(int i=q->front;i<=q->rear;i++) cout<<q->x[i]<<endl; cout<<"****************"; //*********************************** int main() initilztion(&q); int z; int value; while(1) cout<<"\n"; cout<<"enter 1 to add to queue \n"; cout<<"enter 2 to delete to queue \n"; cout<<"enter 3 to display \n"; cout<<"enter 4 to exit \n"; cin>>z; cout<<"**********"; cout<<"\n"; switch(z) case 1 : cout<<"enter the number \n"; cin>>value; insert(&q,value); 15
case 2: cout<<"you delete value "<< delet(&q)<<endl; case 3: display(&q); case 4: exit(0); flag cirular queue add elements to flag circular queue and show them: #include<iostream.h> //#include<cstring.h> #define max 5 struct queue int data[max]; int front ; int rear; int count; qu; void initial() qu.front=qu.rear=max-1; qu.count=0; void push () if (qu.count>=max) cout<<"\t Circular Queue is FULL \n \n "; int info; cin>>info; qu.rear=(qu.rear+1)%max; qu.data[qu.rear]=info; qu.count++; int pop () if (qu.count==0) cout<<" Circular Queue Is Empty \n "; qu.front=(qu.front+1)%max; int d=qu.data[qu.front]; qu.count--; cout<< d ; 16
int main () initial (); cout<<" \t\t Please Enter The Flag CQueue \n"; for ( int l=0;l<max;l++) cout<<" \t"; push (); cout<<" \t \t Queue after adding Elements : \n"; for (int m=0;m<max;m++) cout<<"\t"; pop (); cout<<endl; //********************************************************************* برنامج قوم باالضافة والحذف والعرض و نسخ جم ع محتو ات المكدس الى مكدس اخر: #include <iostream.h> #include <conio.h> int full(int count, int size) return(count==size); int empty(int count) return count==0; void add(int que[],int &tail,int &count,int size,int val) if(tail==size-1) tail=-1; //cout<<"inter value\n"; //cin>>x; que[++tail]=val; count++; int del(int que[],int &head,int &count,int size) if(head==size) head=0; count--; return que[head++]; void copy(int que1[],int que[],int size,int tail,int &tail1,int &count,int &count1,int &head) int i,t=tail,c=count; for(i=0;i<c;i++) add(que1,tail1,count1,size,del(que,head,count,size)); 17
void show(int que[],int &head,int &count,int size) int i,x=count; for(i=0;i<x;i++) cout<<del(que,head,count,size)<<" "; ; void main() int c; int count=0,tail=-1,head=0; const int size=8; int que[size]; int count1=0,tail1=-1,head1=0; // const int size=8; int que1[size]; do clrscr(); cout<<"1- add\n"; cout<<"2-del\n"; cout<<"3-copy\n"; cout<<"4-show\n"; cin>>c; switch(c) case 1 : if(full(count,size)) cout<<"full\n"; int x; cout<<"entr value\n"; cin>>x; add(que,tail,count,size,x); case 2 : if(empty(count)) cout<<"empty\n"; cout<<del(que,head,count,size)<<"\t"; case 3 : copy(que,que1,size,tail,tail1,count,count1,head); case 4 : show(que1,head1,count1,size); getch(); while(c!=0); getch(); //************************************************************************* 18
خىاسص خ اضبفخ ف اى هب خ خىاسص خ اضبفخ ف اىجذا خ خىاسص خ اضبفخ ىد خىاسص خ اىزه ئخ //********************************************** ثالثا :Linked lists [ 1 ]مقدمة عنList Linked ( 1.1 )ما ه Linked list ( 1.2 )أهم ةlist Linked Single Linked List [2] ( 2.1 )الص غة العامة لل Single Linked List ( 2.2 )بعض العمل ات ف : list Single linked خىاسص خ Linked lists 1 إضافة عناصر 2 عرض القائمة 3 إضافة عنصر ف أول القائمة 4 إضافة عنصر ف مكان محدد 5 بحث عن عنصر ف القائمة 6 ترت ب عناصر القائمة 7 تعداد عدد عناصر القائمة 8 حذف عنصر من القائمة 9 خوارزم ات الList Single Linked 19
خىاسص خ اىسزف خىاسص خ اىجسث 21
خىاسص خ اىسزف ف اىىسظ Double Linked List [3] ( 3.1 )الص غة العامة للList Double Linked ( 3.2 )تحو ل عمل ات Single linked list إلى Double Linked List ف الحق قة آسف للطرح موضوع على ه ئة جزئ ن ول س على عدة أجزاء ولذلك ألن فقرات الموضوع مترابطة جدا ف ما ب ناهما و صعب فهمها ف أوقات متباعدة نس با. إن شاء هللا إذا فهمت هذا الموضوع سوف سهل عل ك الطر ق للفهم بعض الخوارزم ات األخرى ف تراك ب الب انات مثل Stack و Queue وغ رها الت سوف أكتب عنها ف القر ب العاجل. [ 1 ]مقدمة عن Linked List ( 1.1 )ما ه Linked list ه باختصار شد د عبارة عن قائمة من الب انات مرتبطة مع بعضها البعض وغ ر محدودة الحجم. أي انك ال تحتاج للمعرفة ما عدد الب انات المراد إدخالها إلى القائمة. ( 1.2 )أهم ةlist Linked البد أنك استخدمت المصفوفات ف العد د من برامجك وتجاربك وكلما تعرف مصفوفة تحتاج للوضع حدود المصفوفة. ولكن ماذا لو احتجت أو احتاج مستخدم البرنامج أن ض ف عدد من الب انات ز د عن حجم المصفوفة!!. 21
اظنك تعرف ماذا سوف حدث. ممكن أن تحل المشكلة باستخدام المصفوفات باستعمال المإشرات معها بنسخ المصفوفة الممتلئة إلى مصفوفة جد دة ذات حجم أكبر و لكن مشكلة هذه الطر قة ه أنك دائما تحقق من عدد العناصر هل تجاوزات حدود المصفوفة لك تز د المساحة لو احتجت لذلك. ولكن باستخدامك linked list سوف ز ل عنك هم هذه المشكلة وتدخل الب انات كما حلو لك )لكن ال تنسى حجم الذاكرة (ألنك ال تحتاج هل للمعرفة عدد الب انات المدخلة للقائمة فقط تقول للب انات )ح اكم هللا القائمة قائمتكم( وهذا عن بتعب ر آخر عن linked list كما طلق عل ها البعض على أنها مصفوفة د نام ك ة. سوف تم شرح االت ف ما بعد وبالتفص ل : ) 1( إضافة عناصر إلى القائمة-: عند إضافة عنصر نتبع آالت : أوال : نضع ب انات الترك ب ثنا ا : إذا كان هناك عنصر آخر نشئ ترك ب جد د ف الذاكرة بواسطة كلمة new ونسند عنوان ذلك الترك ب إلى المإشر next ف العنصر الحال. ثالثا : إما إذا كان العنصر الحال آخر عنصر ف القائمة نسند للمإشر next ق مةNULL 2 -عرض عناصر القائمة-: اآلن سوف نقوم للعرض عناصر القائمة وه أن نقوم المرور على كل عنصر و طباعته ب اناته. تتم العمل ة كالتال : أوال : نتحقق من العنصر هل هو آخر عنصر ف القائمة أما ال. ثان ا : إذا كان العنصر ل س العنصر األخ ر نعرض الب انات ونتحرك إلى العنصر الذي بعده. ثالثا : إذا كان العنصر هو العنصر األخ ر نتوقف. 3- تعداد عدد عناصر القائمة: مثل أي عمل ة تعداد آخرى أي نعرف عداد ومن ثم ز د بمقدار واحد. تتم العمل ة التعداد كالتال : أوال : نتحقق من العنصر هل هو آخر عنصر ف القائمة أما ال. ثان ا : إذا كان العنصر ل س العنصر األخ ر نز د العداد بمقدار واحد. ثالثا : إذا كان العنصر هو العنصر األخ ر نتوقف. 4- بحث عن عنصر ف القائمة: ف هذه العمل ة نقوم ف البحث عن عنصر من عناصر القائمة و تمم العمل ة كالتال : أوال : نتحقق من العنصر هل هو آخر عنصر ف القائمة أما ال. ثان ا : إذا كان العنصر ل س العنصر األخ ر نتحقق من ب انات العنصر و ب انات البحث ثالثا : إذا كان ب انات العنصر مطابقة للب انات البحث نتوقف رابع : إذا كان ب انات العنصر غ ر مطابقة للب انات البحث نتحرك للعنصر التال. خامسا : إذا كان العنصر هو العنصر األخ ر نتوقف. 5- ضافة في أول القائمة-: اآلن نر د إضافة عنصر جد د ف أول القائمة أي أن كون العنصر األول. وهذه العمل ة كالتال : أوال : نقوم بإنشاء ترك ب )عنصر( جد د و إضافة ب اناته. 22
ثان ا : ثم نربط الترك ب مع أول عنصر ف القائمة ثالثا : نسند للمإشر القائمة عنوان الترك ب الجد د. Linked list Linked list: is a data structure wherein each element contains both a data value and a pointer to next element in the list. بعض مم زات ال linked list ما ل : تقوم بترت ب العناصر ف الذاكرة حتى ولو كانت عشوائ ة هنا ال نحتاج لمعرفة عدد الب انات المدخلة كما ف المصفوفات الت نحدد عدد الب انات الت سوف ندخلها)نحدد حجم المصفوفة( لذالك طلق على ال linked list المصفوفات الد نام ك ة. قد قول البعض ك ف تم ترت ب العناصر ف الذاكرة حتى ولو كانت عشوائ ة الجواب هو أن كل عنصر قوم بحفظ موقع العنصر الذي ل ه)الذي بعدة(. وبتوض ح أكثر فلنرى ما ل : 23
struct nodeptr char info; struct node*next; ; This is the pointer to the next node أالن سوف ندخل ف الجد: هذه الص غة العامة ل linked list-: رعش ف سوف نبدأ أالن بؤهم العمل ات ف ال :linked list أوال : عمل ة إنشاء node وإضافة بداخل ال node الرقم 50: س تم ذالك من خالل الخوارزم ة التال ة: Initial(node*f) f=getnode( ); f->link=null; f->info=50; ; إ شبء new node ث وضع اى ؤشش f عي هب قى ثىضع رساع اىf ث null إشبسح ثأ خ أخش قى ثئدخبه 50 داخو اى node ع صش ف اىقبئ خ f اىز ش ش إى هب اى ؤشش f 50 ف هزا اى ثبه ق ب ثئ شبء اىnode اىزبى خ: 24
5 0 f ثان ا :عمل ة ربط ال لد نا هذه ال node ونر د ربط nodeأول القائمة: nodeجد دة ووضعها إال ولى ف القائمة Insert_B(node*f) node*c; c=getnode( ); c->info=40; c->link=f; f=c; إ شبء new node ث وضع اى ؤششc عي هب قى ثشثظ اىnode اىز أ شئ هب ثبى node األوى ف اىقبئ خ first قى ث قو اى ؤشش f إى اى node اىز سثط بهب ثبىقبئ خ اىز أصجسذ أوه node ف اىقبئ خ ستكون القائمة كما ل : f 7 0 c 5 0 25
ثالثا : عمل ة ربط node وسط القائمة )ل س بؤولها ول س بآخرها(: هنا لد نا مثال ب انات احد الطالب وكان رقمه 36 ونر د إن نضعه ف القائمة حسب الرقم التسلسل ألرقام الطالب س كون الحل كما ل : Insert_l(node*f) وضع اىج ب بد داخو اىnode node*c,*p; إ شبء new node ث وضع اى ؤشش c c=getnode( ); c->info=30; قى ثىضع اى ؤشش p ف اىnode اىز ش ش إى هب اى f p=f; زز ز اىز قو ثبسزخذا اى ؤشش p ف اىقبئ خ ب سىه دو ض بعهب while(c->info > f->info && c->info > p->info) p=p->link; قى ث قو اى ؤشش p اى node اىز ش ش إى هب إى اى node اىز ري هب c->link=p->link; قى ثز ف زهب ثعذ رىقف wile طجعب وهزا اىسطش قى ثبىزبى : قى ثشثظ رساع اىnode اى شاد سثطهب ثبى node اىز ش ش إى هب p->link=c; رساع اى p قى ث قو رساع اى ؤشش p اىnode اىز مب ش ش إى هب إى اى nodeاىز ر سثطهب)اى( c هزا اىسطش قى ثبىزبى : طبى ب >f->info( )c->info عيى بد اىnode اىز ش ش إى هب اى ؤشش c امجش عيى بد اىnode اىز ش ش إى هب اى ؤشش)&&) f و c ش ش إى هب اى ؤشش اىز عيى بد اىnode )(c->info>p->linked->info ) عيى بد اى node اى شاد سثطهب ثبىقبئ خ( امجش عيى بد اى node اىز ش ش إى هب رساع اى ؤشش p 26
بعد هذا كله راح تكون القائمة بهذا الشكل: f p 20 30 35 40 c 36 27
2 0 f 3 0 3 5 4 0 رابعا : عمل ة ربط node ف أخر القائمة: لد نا هذه القائمة: c ونر د أن نربط ال node التال ة ف أخر القائمة: إزضبس 7 0 إ شبء Insert_l(node*f) وضع اىج ب بد داخو اىnode node*c; c=getnode( ); طبى ب رساع اىl ىخىدح c->info=70; l=f; while(l->link!=null) l=l->link; l->link=c; c->link=null; new node ث وضع قى ث قو اى ؤشش f اىnode اىز ش ش عي هب إى اىnode اىز ري هب إى إ صو إى أخش اىقبئ خ ( زز ش ش إى أخش node ف اىقبئ خ(ع ذ عذ رسقق اىششط قى ثشثظ رساع اى l اىز وصيذ إى أخش اىقبئ خ ث node اىز أ شئ هب قى ثشثظ رساع اىnode ثnull أل هب أخش node ف اىقبئ خ ث ع أخش إ رساع اىc ال رشرجظ ث node أخشي قى ثىضع اى ؤشش l ز ث ش ش اى ؤشش f وراىل زز ز اىز قو ثبسزخذا اى ؤشش l إى أخش اىقبئ خ وراىل رفبد ىعذ ض بع اىقبئ خ ز ث أرا ر قو اىع صش f نب خ ف أوه ع صش ف اىقبئ خ فئ ب سىف فقذ اىقبئ خ ثأم يهب وراىل خطأ فبدذ خذا. 28
29
******************************************************************************************** دالة تقوم بإضافة عنصر ف بد ة القائمة المتصلة: Node* AddItemFront(int x, Node *L) Node *P; P = new(node); P -> Data = x; P -> Next = L; L = P; return L; 31
دالة تقوم بإضافة عنصر ف نها ة القائمة المتصلة: Node* AddItemRear(int x, Node *L) Node *P, *Q; if (L = = NULL) Q = new(node); Q -> Data = x; Q -> Next = NULL; L = Q; P = L; while (P->Next!= NULL) P = P -> Next; Q = new(node); Q -> Data = x; Q -> Next = NULL; P -> Next = Q; return L; 31
دالة تقوم بالبحث عن أي عنصر داخل القائمة المتصلة : bool SearchItem(int x, Node *L) Node *P = L; if (P == NULL) return false; if (P -> Data == x) return true; return SearchItem(x, P -> Next); دالة تقوم بالحذف أي عنصر داخل القائمة المتصلة: Node* DeleteItem(int x, Node *L) Node *P = L, *Q; if (P -> Data == x) L = L ->Next; delete P; while ((P->Next)->Data!= x) P = P -> Next; Q = P -> Next; P -> Next = Q -> Next; delete Q; return L; 32
دالة تقوم بقلب عناصر القائمة المتصلة: Node* InvertList(Node *L) Node *P = L; Node *Q = NULL; Node *R; while (P!= NULL) R = new(node); R -> Data = P->Data ; R -> Next = Q; Q = R; P = P->Next; return Q; دالة تقوم بفرز القائمة المتصلة باستخدام طر قة الفرز الفقاع : Node* SortList(Node *L) Node *P; int np; int temp; do np = 0; P = L; while (P->Next!= NULL) if (P->Data > (P->Next)->Data) temp = P->Data; P->Data = (P->Next)->Data; (P->Next)->Data = temp; np++; P = P->Next; while (np > 0); return L; 33
دالة تقوم بتحو ل القائمة العاد ة الى قائمة دائر ة: Node* Circular(Node *L) Node *P; if (L!= NULL) P = L; while (P->Next!= NULL) P = P->Next; P -> Next = L; return L; دالة تقوم بطباعة جم ع عناصر القائمة الدائر ة: void PrintCircular(Node *Q) Node *P; if (Q!= NULL) cout<<q->data<<"\t"; P = Q->Next; while (P!= Q) cout<<p->data<<"\t"; P = P->Next; 34
القوائم المتصلة ذات االتجاه ن( lists :(Doubly-linked الشكل العام lists) :(Doubly-linked عند تعريف القائمة البد من اعالن عن مؤشر الى اول اقائمة ومؤشر نحو اخر القائمة مثل: struct Node Node *Prev; int D ata; Node *N ext; struct Dbl_list Node *F irst; Node *L ast; //**************************** برنامج قوم با ضافة عنصر ف بدا ة القائمة واضافة عنصر ف نها ة القائمة وعرض عناصر القائمة من االول الى االخ ر وعرض عناصر القائمة من االخ ر الى االول وحذف أي عنصر من القائمة: #include <iostream> using namespace std; struct Node 35
Node *Prev; int Data; Node *Next; ; struct Dbl_List Node *First; Node *Last; ; Dbl_List AddFront(int x, Dbl_List L) Node *P ; if (L.First == NULL) P = new(node); P->Prev = NULL; P->Data = x; P->Next = NULL; L.First = P; L.Last = P; P = new(node); P->Prev = NULL; P->Data = x; P->Next = L.First; L.First->Prev = P; L.First = P; return L; 36
Dbl_List AddRear(int x, Dbl_List L) Node *P ; if (L.First == NULL) P = new(node); P->Prev = NULL; P->Data = x; P->Next = NULL; L.First = P; L.Last = P; P = new(node); P->Prev = L.Last; P->Data = x; P->Next = NULL; L.Last->Next = P; L.Last = P; return L; void ShowListFarward(Dbl_List L) Node * P = L.First; while (P!= NULL) cout<<p->data<<"\t"; P = P->Next; 37
cout<<endl; void ShowListBackward(Dbl_List L) Node * P = L.Last; while (P!= NULL) cout<<p->data<<"\t"; P = P->Prev; cout<<endl; Dbl_List DeleteItem(int x, Dbl_List L) Node *P ; if (L.First->Data == x) P = L.First; L.First = L.First ->Next ; L.First ->Prev = NULL; delete P; if (L.Last->Data == x) P = L.Last; L.Last = L.Last ->Prev ; L.Last ->Next = NULL; delete P; 38
P = L.First; while((p!= NULL)&&(P->Data!= x)) P = P -> Next; if (P == NULL) cout<<"not Found.."<<endl; (P->Prev)->Next = P->Next; (P->Next)->Prev = P->Prev; delete P; return L; main() Dbl_List L; L.First = NULL; L.Last = NULL; L = AddFront(26,L); L = AddFront(16,L); L = AddRear(36,L); L = DeleteItem(26,L); ShowListFarward(L); 39
هاذا برنامج الستاك والك و والنكد لست ولكن با اكواد مختصرة لم نكتب جم ع االكواد ولكن كتبناء القل ل منهاء: #include<iostream.h> //******************************* const int size=5; //******************************* struct stack int top; int item[size]; int rear; int front; stack *First; stack *Last; stack *Prev; int Data; stack *Next; ps; //***************************** /*struct Dbl_List Node *First; Node *Last; ; //***************************** struct Node Node *Prev; int Data; Node *Next; ;*/ //***************************** void initial(struct stack *ps) ps->top=-1; ps->front=0; //front =Null; ps->rear=-1; //****************************** void push(struct stack *ps,int m) if(ps->top<(size-1)) (ps->top)++; ps->item[ps->top]=m; cout<<"full\n"; 41
//******************************** int insert ( stack*ps,int e ) if((ps->rear)>size) cout<<"the queue is full \n"; ps->rear=ps->rear+1; ps->item[ps->rear]=e; //**************************** void pop(struct stack *ps) if(ps->top>(-1)) cout<<ps->item[ps->top]<<endl; (ps->top)--; cout<<"empty\n"; //******************************** int delet( stack *ps) if(ps->rear < ps->front) cout<<"is empty \n"; return 0; return ps->item[ps->front++]; //********************************** void display( stack *ps) for(int i=ps->front;i<=ps->rear;i++) cout<<ps->item[i]<<endl; cout<<"\n****************\n"; //********************************** void sho( stack *ps) for(int i= 0;i<ps->top ;i++) cout<<ps->item[i]; cout<<"empty\n"; //********************************* stack AddFront(int x, stack L) stack *P ; if (L.First == NULL) P = new(stack); 41
P->Prev = NULL; P->Data = x; P->Next = NULL; L.First = P; L.Last = P; P = new(stack); P->Prev = NULL; P->Data = x; P->Next = L.First; L.First->Prev = P; L.First = P; return L; //********************************** stack AddRear(int x, stack L) stack *P ; if (L.First == NULL) P = new(stack); P->Prev = NULL; P->Data = x; P->Next = NULL; L.First = P; L.Last = P; P = new(stack); P->Prev = L.Last; P->Data = x; P->Next = NULL; L.Last->Next = P; L.Last = P; return L; //********************************** void ShowListFarward(stack L) 42
stack * P = L.First; while (P!= NULL) cout<<p->data<<"\t"; P = P->Next; cout<<endl; //*********************************** void ShowListBackward(stack L) stack * P = L.Last; while (P!= NULL) cout<<p->data<<"\t"; P = P->Prev; cout<<endl; //************************************ stack DeleteItem(int x, stack L) stack *P ; if (L.First->Data == x) P = L.First; L.First = L.First ->Next ; L.First ->Prev = NULL; delete P; if (L.Last->Data == x) P = L.Last; L.Last = L.Last ->Prev ; L.Last ->Next = NULL; delete P; P = L.First; while((p!= NULL)&&(P->Data!= x)) P = P -> Next; 43
if (P == NULL) cout<<"not Found.."<<endl; (P->Prev)->Next = P->Next; (P->Next)->Prev = P->Prev; delete P; return L; /*********************************** int SearchItem(int x, stack *L) cin>>x; stack *P = L; if (P == NULL) return false; if (P -> Data == x) return true; return SearchItem(x, P -> Next); */ //************************************ اىجىة ىع و شبثهخ اى ذخيخ اىع بصش ثقيت رقى داىخ// stack* InvertList(stack *L) stack *P = L; stack *Q = NULL; stack *R; while (P!= NULL) R = new(stack); R -> Data = P->Data ; R -> Next = Q; Q = R; P = P->Next; return Q; //************************************ int main() 44
stack L; L.First = NULL; L.Last = NULL; int n, op, x;; initial(&ps); do cout<<"\stack \n\n1 to push and \n2 to pop\n6show stacke\n\nqueue\n\n3 insert queue\n4 delete queue \n5 display queue\n \nsingl linked list\n\n7 add to front\n8 add to front\n9 ShowListFarward\n10 DeleteItem of linked list\n"; cin>>op; switch(op) case 1:; cin>>n; push(&ps,n); case 2: pop(&ps); case 3: cout<<"enter the number \n"; cin>>n; insert(&ps,n); case 4: cout<<"you delete value "<< delet(&ps)<<endl; case 5: display(&ps); case 6: sho(&ps); case 7: cout<<"pleas add 5 to front\n"; for(int i=0;i<=size;i++) x=i; cin>>x; //L.First = NULL; //L.Last = NULL; AddFront(x,L); case 8: 45
cout<<"pleas add 5 to Rear\n"; for(int i=0;i<=size;i++) x=i; cin>>x; AddRear( x,l); case 9: ShowListFarward(L); case 10: cout<<"enter the number delete of singel linked list\n"; cin>>x; DeleteItem(*&x,L); /*case 11: //cin>>x; I//nvertList(stack); */ default: cout<<"error"; while(op!=0); return 0; //*********************************** برنامج قوم باإلضافة ف البدا ة والنها ة وقبل أي رقم و قوم بعرض العمل ات المدخلة واالضافة بعد أي رقم والحذف من البدا ة والنها ة ومن الوسط والحذف من أي مكان وعرض العناصر المتصلة بعد عمل ة الحذف : #include<iostream.h> #include<conio.h> #include<alloc.h> struct dnode int data; struct dnode*llink,*rlink; ; struct dnode*f; dnode *intl() f=null; return f; 46
dnode*creatnode() return((dnode*)malloc(sizeof(dnode))); //********************************* void addbeg(dnode*&f,dnode*n) if(f==null) n->rlink=f; n->llink=null; f=n; n->rlink=f; n->llink=null; f->llink=n; f=n; void addend(dnode*f,dnode*n) dnode*p=null; p=f; while(p->rlink!=null) p=p->rlink; n->llink=p; n->rlink=null; p->rlink=n; void addaft(dnode*f,dnode*n,int e) dnode*p=null; p=f; while(p!=null&& p->data!=e) p=p->rlink; if(p==null) cout<<" \n data you want to add after it not found \n"; n->llink=p; n->rlink=p->rlink; 47
p->rlink->llink=n; p->rlink=n; void visilist(dnode*f) dnode*p=null; p=f; if(p==null) cout<<" \n there is no node in the list \n"; while(p!=null) cout<<p->data; p=p->rlink; void revlist(dnode*f) dnode*p=null; p=f; if(p==null) cout<<" \n there is no nodes in the list \n"; while(p->rlink!=null) p=p->rlink; while(p!=null) cout<<p->data; p=p->llink; //************************************ void addbef(dnode*f,dnode*n,int e) dnode*p=null; p=f; while( p!=null&&p->data!=e) p=p->rlink; if(p==null) cout<<"\n data you want add befor it not found \n"; 48
n->llink=p->llink; n->rlink=p; p->llink->rlink=n; p->llink=n; void dbeg(dnode*&f) dnode*d=null; d=f; f=f->rlink; f->llink=null; free(d); void dend(dnode*f) dnode*p=null; p=f; while(p->rlink!=null) p=p->rlink; p->llink->rlink=null; free(p); void dmid(dnode*f,int e) dnode*d=null; d=f; while(d->data!=e&& d->rlink!=null) d=d->rlink; if( d->rlink==null) cout<<" \n data that you want to delete it not found in midlist \n"; d->llink->rlink=d->rlink; d->rlink->llink=d->llink; free(d); void danywhere(dnode*&f,int key) dnode*d=null; dnode*pf=null; dnode*p=null; 49
p=f; d=f; pf=f; int found=0; while(d!=null&&!found) if(d->data==key) found=1; p=f; d=d->rlink; if(!found&&d==null) cout<<"\n node that you want to delete it not found \n"; if(found) if(pf==d) f=f->rlink; f->llink=null; free(d); d->llink->rlink=d->rlink; d->rlink->llink=d->llink; free(d); main() //clrscr(); dnode*f=intl(); dnode*n=null; int x; int op; do cout<<"\n enter 1 to addbegin and \n 2 to addend \n 3 to addaft \n 4 to display \n 5 to exit \n 6 to add befor specific data \n 51
7 to delete from begin \n 8 to delete from end\n 9 to delete from mid list \n 10 to delete any where \n 11 to show list from last \n"; cin>>op; switch(op) case 1: n=creatnode(); cout<<"enter information"; cin>>n->data; addbeg(f,n); case 2: n=creatnode(); cout<<"enter information"; cin>>n->data; addend(f,n); case 3: n=creatnode(); cout<<"enter data"; cin>>n->data; cout<<"enter data that you want to add after it"; cin>>x; addaft(f,n,x); case 4: visilist(f); case 6: int y; n=creatnode(); cout<<"enter information of node \n"; cin>>n->data; cout<<"enter data you want add befor it \n"; cin>>y; addbef(f,n,y); case 7: dbeg(f); case 8: dend(f); 51
case 9: int z; cout<<" \n enter data you wnat to delete from list \n "; cin>>z; dmid(f,z); case 10: int t; cout<<"\n enter data you want delete it \n"; cin>>t; danywhere(f,t); case 11: revlist(f); while(op!=5); //*************************************** برنامج قوم بعمل ة االضافة ف البدا ة والنها ة وقبل أي رقم و قوم بالعرض و قوم بعمل ة االضافة بعد أي رقم والحذف من البدا ة والنها ة والوسط وترت ب العناصر وتقس م القائمة وا جاد مجموع االعداد الزوج ة والفرد ة: #include<iostream.h> //using namespace std; #include<conio.h> #include<alloc.h> struct sll int data; struct sll*llink; ; sll*f; sll*creatnode() return((sll*)malloc(sizeof(sll))); sll*intl() f=null; return f; void addbeg(sll*&f,sll*n) 52
n->llink=f; f=n; void addend(sll*f,sll*n) sll*p=null; p=f; while(p->llink!=null) p=p->llink; p->llink=n; n->llink=null; void addaft(sll*f,sll*n,int e) sll*p=null; p=f; while(p->data!=e&&p!=null) p=p->llink; if(p!=null) n->llink=p->llink; p->llink=n; cout<<"the node you want to add after it not found \n"; void visitlist(sll*f) sll*p=null; p=f; while(p!=null) cout<<p->data; p=p->llink; void addbef(sll*f,sll*n,int e) sll*p=null; sll*old=null; p=f; while(p->data!=e&&p!=null) old=p; p=p->llink; if(p!=null) n->llink=p; old->llink=n; cout<<"the node you want to add befor it not found \n"; void dbeg(sll*&f) 53
sll*d=null; d=f; f=f->llink; free(d); void dend(sll*f) sll*p=null; sll*d=null; p=f; while(p->llink!=null) d=p; p=p->llink; d->llink=null; void dlend(sll*f) sll*d; sll*p; d=f; p=f; while(p->llink!=null) d=p; p=p->llink; d->llink=null; free(p); void dmid(sll*f,int key) sll*p=null; sll*d=null; p=f; while(p->llink->data!=key&&p!=null) p=p->llink; d=p->llink; if(p!=null) p->llink=d->llink; cout<<"\n data you want to delete it not found \n"; //******************** void odev(sll*&f,sll*n) sll*p=f; if(n->data%2==0) n->llink=f; f=n; if(f==null) 54
n->llink=f; f=n; p=f; while(p->llink!=null) p=p->llink; n->llink=null; p->llink=n; p=n; //******************************** void div_list(sll*f,int e) sll*p=null; sll*p2=null; sll*f2=null; p=f; while(p->data!=e) p=p->llink; f2=p->llink; p2=p->llink; p->llink=null; cout<<"\n first list \n"; p=f; while(p!=null) cout<<p->data; p=p->llink; cout<<"\n second list is \n"; p2=f2; while(p2!=null) cout<<p2->data; p2=p2->llink; //************************ void findsum(sll*f) sll*p=null; p=f; int sumeven=0; int sumodd=0; while(p!=null) if(p->data%2==0) sumeven=sumeven+p->data; sumodd=sumodd+p->data; p=p->llink; cout<<"the sum of even number is \n"<<sumeven<<endl; 55
cout<<"the sum of odd number is \n"<<sumodd<<endl; //************************** void rev_list(sll*&f) sll*pre=null; sll*current=null; sll*next=null; current=f; pre=null; while(current!=null) next=current->llink; current->llink=pre; pre=current; current=next; f=pre; //************************ main() //clrscr(); int x; sll*f,*n=null; f=intl(); int op; do cout<<"\n enter 1 to addbegin \n 2 to add after specific data \n 3 to add end \n 4 to display list \n 5 to exit \n 6 to add befor specific node \n 7 delete from begin \n 8 delete from end \n 9 delete from midlist \n 10 to orderlist \n 11 to split list \n 12 to find sum of odd and even number \n 13 to revers list \n 14 delet in end\n"; cin>>op; switch(op) case 1: n=creatnode(); cout<<"enter information"; cin>>n->data; addbeg(f,n); case 2: n=creatnode(); cout<<"enter information"; cin>>n->data; cout<<"enter data you want to add after it \n"; cin>>x; addaft(f,n,x); case 3: n=creatnode(); cout<<"enter information"; cin>>n->data; addend(f,n); case 4: 56
cout<<"\n @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"; visitlist(f); case 6: int y; n=creatnode(); cout<<"enter information of node"; cin>>n->data; cout<<"enter data you want to add befor it \n"; cin>>y; addbef(f,n,y); case 7: dbeg(f); case 8: dend(f); case 9: int k; cout<<"enter data you want to delete it from midlist"; cin>>k; dmid(f,k); case 10: n=creatnode(); cout<<"enter information"; cin>>n->data; odev(f,n); case 11: int e; cout<<"enter data you want to split list from it \n"; cin>>e; div_list(f,e); case 12: findsum(f); case 13: rev_list(f); case 14: dlend(f); while(op!=5); 57
اعداد الطالب : عبد الرحمن ح ى محمد صلح جامعة صنعاء كل ة الحاسوب وتكنولوج ا المعلومات مستوى ثان )Information System( قسم نظم معلومات تم جمع االفكار و الدروس واألغلب من محاضرة من بعض المواقع ومن عدة كتب د/ فضل باعلوي أ /هبة أ/ مروة الهادي ف حالة وجود ان تبلغون اتمنى خطؤ أي ف اسرع وقت ممكن للتواصل على البر د اإللكترون 700hnoon@gmail.com او على الف س بوك http://www.facebook.com/hnoon2015 عبد الرحمن ح صلح 58