12 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	title, localeTitle
| title | localeTitle | 
|---|---|
| Data Structure Linked List | قائمة ربط بنية البيانات | 
تماما كما هو مصنوع من الطوق مع الزهور ، تتكون قائمة مرتبطة من العقد. نحن ندعو كل زهرة على هذا الطوق الخاص لتكون عقدة. ويشير كل من العقدة إلى العقدة التالية في هذه القائمة بالإضافة إلى أنه يحتوي على بيانات (هنا هو نوع من الزهور).
أنواع
- قائمة متصلة Singly
تحتوي القوائم المرتبطة بشكل فردي على عقد تحتوي على حقل data بالإضافة إلى حقل next ، والذي يشير إلى العقدة التالية في التسلسل. العمليات التي يمكن إجراؤها على القوائم المرتبطة فرديًا هي الإدراج والحذف والعبور.
`
Singly Link List  
  head  |  |  +-----+--+      +-----+--+      +-----+------+  |  1  |o----->  |  2  |o----->  |  3  | NULL |  +-----+--+      +-----+--+      +-----+------+ 
`
الوضعية
يتم الاحتفاظ بالتنفيذ الداخلي لـ CPython والإطارات والمتغيرات التي تم تقييمها على كومة.
لهذا نحن بحاجة إلى التكرار فقط إلى الأمام الحصول على الرأس ، لذلك يتم استخدام قائمة مرتبطة بشكل فردي.
- قائمة ترتبط Doubly
القوائم المرتبطة مضاعف تحتوي على العقدة التي لديها data الحقل next الميدان وآخر حقل ارتباط prev لافتا إلى العقدة السابقة في التسلسل.
`
قائمة ترتبط Doubly
         head  |  |  +------+-----+--+    +--+-----+--+       +-----+------+  |      |     |o------>  |     |o------>  |     |      |  | NULL |  1  |          |  2  |          |  3  | NULL |  |      |     |  <------o|     |  <------o|     |      |  +------+-----+--+    +--+-----+--+       +-----+------+ 
`
الوضعية
ذاكرة التخزين المؤقت للمتصفح والتي تسمح لك بالضغط على الزر BACK and FORWARD. هنا نحتاج إلى الاحتفاظ بقائمة مرتبطة بشكل مضاعف ، مع URLs كحقل بيانات ، للسماح بالوصول في كلا الاتجاهين. للانتقال إلى عنوان URL السابق ، سنستخدم الحقل prev والانتقال إلى الصفحة next سنستخدم الحقل next .
- قائمة مرتبطة دائرية
القوائم المرتبطة الدائرية هي قائمة مرتبطة بشكل فردي حيث العقدة الأخيرة ، يشير الحقل next إلى العقدة الأولى في التسلسل.
`
قائمة مرتبطة دائرية
    head  |  |  +-----+--+      +-----+--+      +-----+--+ 
-> | 1 | o -----> | 2 | --- -----> | 3 | س
| + ----- + - + + ----- + - + + ----- + - + |
| |
`
الوضعية
حل مشكلة المشاركة بالوقت من قبل نظام التشغيل.
في بيئة المشاركة بالوقت ، يجب أن يحتفظ نظام التشغيل بقائمة بالمستخدمين الحاليين ويجب أن يسمح لكل مستخدم بشكل متناوب باستخدام جزء صغير من وقت وحدة المعالجة المركزية (CPU) ، مستخدم واحد في كل مرة. سيقوم نظام التشغيل باختيار مستخدم ، أو السماح له باستخدام كمية صغيرة من وقت وحدة المعالجة المركزية ثم الانتقال إلى المستخدم التالي.
بالنسبة لهذا التطبيق ، يجب ألا يكون هناك أية مؤشرات NULL ما لم يكن هناك أحد يطلب وقت وحدة المعالجة المركزية على الإطلاق ، أي أن القائمة فارغة.
العمليات الأساسية
- إدراج
لإضافة عنصر جديد إلى القائمة.
`
الإدراج في البداية
- إنشاء عقدة جديدة مع البيانات المعطاة.
- أشر إلى عقدة جديدة nextheadالقديم.
- ضع headعلى هذه العقدة الجديدة.
الإدراج في الوسط / النهاية
الإدراج بعد العقدة X.
- إنشاء عقدة جديدة مع البيانات المعطاة.
- نقطة العقدة الجديدة nextلالقديمة Xnext.
- النقطة X nextهذه العقدة الجديدة.
 `
تعقيد الوقت: O (1)
- حذف
لحذف العنصر الموجود من القائمة.
`
الحذف في البداية
- الحصول على العقدة التي وجهها headكما تيمب.
- headإلى نقطة- next.
- ذاكرة حرة تستخدمها عقدة Temp.
الحذف في المنتصف / النهاية
الحذف بعد العقدة X.
- الحصول على العقدة التي أشار إليها Xكمؤشر.
- نقطة X nextTempnext.
- ذاكرة حرة تستخدمها عقدة Temp.
 `
تعقيد الوقت: O (1)
- عبور
للسفر عبر القائمة.
`
اجتياز
- احصل على العقدة التي يتم توجيهها بواسطة headكتيار.
- تحقق مما إذا كان Current ليس خاليًا وقم بعرضه.
- أشر إلى الحالي إلى nextوالانتقال إلى الخطوة أعلاه.
 `
تعقيد الوقت: O (n) // Here n هو حجم قائمة الارتباط
التنفيذ
تنفيذ C ++ من قائمة مرتبطة بشكل فردي
`// Header files #include
struct node { int data; struct node *next; };
// Head pointer always points to first element of the linked list struct node *head = NULL; `
طباعة البيانات في كل عقدة
`// Display the list void printList() { struct node *ptr = head;
// Start from the beginning 
while(ptr != NULL) { std::cout << ptr->data << " "; ptr = ptr->next; }
std::cout << std::endl; } `
الإدراج في البداية
`// Insert link at the beginning void insertFirst(int data) { // Create a new node struct node *new_node = new struct node;
new_node->data = data; 
// Point it to old head new_node->next = head;
// Point head to new node head = new_node;
std::cout << "Inserted successfully" << std::endl; } `
الحذف في البداية
`// Delete first item void deleteFirst() { // Save reference to head struct node *temp = head;
// Point head to head's next 
head = head->next;
// Free memory used by temp temp = NULL: delete temp;
std::cout << "Deleted successfully" << std::endl; } `
بحجم
`// Find no. of nodes in link list void size() { int length = 0; struct node *current;
for(current = head; current != NULL; current = current->next) 
{ length++; }
std::cout << "Size of Linked List is " << length << std::endl; } `
البحث
`// Find node with given data void find(int data){
// Start from the head 
struct node* current = head;
// If list is empty if(head == NULL) { std::cout << "List is empty" << std::endl; return; }
// Traverse through list while(current->data != data){
// If it is last node 
if(current->next == NULL){ 
    std::cout << "Not Found" << std::endl; 
    return; 
} 
else{ 
    // Go to next node 
    current = current->next; 
} 
}
// If data found std::cout << "Found" << std::endl; } `
الحذف بعد العقدة
`// Delete a node with given data void del(int data){
// Start from the first node 
struct node* current = head; struct node* previous = NULL;
// If list is empty if(head == NULL){ std::cout << "List is empty" << std::endl; return ; }
// Navigate through list while(current->data != data){
// If it is last node 
if(current->next == NULL){ 
    std::cout << "Element not found" << std::endl; 
    return ; 
} 
else { 
    // Store reference to current node 
    previous = current; 
    // Move to next node 
    current = current->next; 
} 
}
// Found a match, update the node if(current == head) { // Change head to point to next node head = head->next; } else { // Skip the current node previous->next = current->next; }
// Free space used by deleted node current = NULL; delete current; std::cout << "Deleted succesfully" << std::endl; } `
بايثون تنفيذ قائمة مرتبطة Singly
`class Node(object): # Constructor def init(self, data=None, next=None): self.data = data self.next = next
# Function to get data 
def get_data(self): return self.data
Function to get next node
def get_next(self): return self.next
Function to set next field
def set_next(self, new_next): self.next = new_next class LinkedList(object): def init(self, head=None): self.head = head `
إدراج
   # Function to insert data  def insert(self, data):  # new_node is a object of class Node  new_node = Node(data)  new_node.set_next(self.head)  self.head = new_node  print("Node with data " + str(data) + " is created succesfully") 
بحجم
   # Function to get size  def size(self):  current = self.head  count = 0  while current:  count += 1  current = current.get_next()  print("Size of link list is " + str(count)) 
البحث
   # Function to search a data  def search(self, data):  current = self.head  found = False  while current and found is False:  if current.get_data() == data:  found = True  else:  current = current.get_next()  if current is None:  print("Node with data " + str(data) + " is not present")  else:  print("Node with data " + str(data) + " is found") 
الحذف بعد العقدة
   # Function to delete a node with data  def delete(self, data):  current = self.head  previous = None  found = False  while current and found is False:  if current.get_data() == data:  found = True  else:  previous = current  current = current.get_next()  if current is None:  print("Node with data " + str(data) + " is not in list")  elif previous is None:  self.head = current.get_next()  print("Node with data " + str(data) + " is deleted successfully")  else:  previous.set_next(current.get_next())  print("Node with data " + str(data) + " is deleted successfully") 
مزايا
- القوائم المرتبطة هي بنية بيانات ديناميكية ، والتي يمكن أن تنمو وتقلص ، وتخصيص ، وإلغاء تخصيص الذاكرة أثناء تشغيل البرنامج.
- يتم تنفيذ الإدراج وحذف العقدة بسهولة في قائمة مرتبطة في أي موقف.
سلبيات
- يستخدمون ذاكرة أكثر من صفائف بسبب الذاكرة المستخدمة من قبل المؤشرات الخاصة بهم ( nextprev).
- الوصول العشوائي غير ممكن في القائمة المرتبطة. علينا الوصول إلى العقد بالتتابع.
- إنها أكثر تعقيدًا من المصفوفة. إذا كانت اللغة تدعم التحقق من المصفوفة تلقائيًا ، فإن Arrays ستخدمك بشكل أفضل.
ملحوظة
يجب علينا استخدام free () في C وحذفها في C ++ لتحرير المساحة المستخدمة بواسطة عقدة المحذوفة ، بينما يتم تجميع المساحة الحرة في Python و Java تلقائيًا بواسطة أداة تجميع البيانات المهملة.

