/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.
*******************************************************************************/
#include <iostream>
using namespace std;
// تعريف بنية العقدة التي تتكون منها القائمة المترابطة
struct node
{
int data; // البيانات عبارة عن أعداد
node *next; // مؤشر على العقدة القادمة
};
// دالة مساعدة لطباعة البيانات بشكل معاكس إنطلاقا من عقدة ما
void printReverse(node *head)
{
// شرط التوقف
if (head == NULL)
return;
printReverse(head->next); // إستعمال الطريقة التعاودية
cout << head->data << " ";
}
// تعريف صنف القائمة المترابطة
class LinkedList
{
private:
node *head,*tail;
public:
LinkedList() // الدالة البانية
{
head = NULL;
tail = NULL;
}
void addNode(int n) // دالة لإضافة عقدة جديدة للقائمة
{
node *tmp = new node;
tmp->data = n;
tmp->next = NULL;
if(head == NULL)
{
head = tmp;
tail = tmp;
}
else
{
tail->next = tmp;
tail = tail->next;
}
}
void printList() // طباعة بيانات القائمة المترابطة
{
node *n = this->head;
while (n != NULL)
{
cout << n->data << " ";
n = n->next;
}
}
void printReverseList() // طباعة بيانات القائمة المترابطة بشكل عكسي
{
printReverse(this->head); // إستعمال الدالة المساعدة السابقة مع تمرير رأس القائمة لها
}
void fillList(int total) // ملأ القائمة بعدد محدد من العناصر
{
int data;
for (int i = 0; i < total; ++i) {
cout << "data " << i << " = " << endl;
cin >> data;
addNode(data); // إستعمال دالة الإضافة
}
}
};
int main() {
LinkedList l; // تعريف قائمة مترابطة
l.fillList(6); // ملأ القائمة ب 6 عناصر يُمكنك تغيير العدد حسب ما تريد
l.printList(); // طباعة عناصر القائمة بشكلها الطبيعي
cout << endl;
l.printReverseList(); // طباعة عناصر القائمة بالشكل العكسي
return 0;
}