پایتون

جلسه ۸۱: اضافه کردن در پایتون

در این درس یاد میگیریم که چگونه المان هایی را به یک linked list در مکان های مختلف اضافه کنیم.   در درس قبلی، ما کلاس های node و LinkedList را تعریف کرده‌ایم. در این درس متدهایی را پیاده‌سازی میکنیم که برای اضافه کردن المان ها کاربرد دارد:

  • append
  • prepend
  • insert_after_node

Append

متد append یک المان را به انتهای linked list اضافه میکند. شکل زیر یک تصویر از کاری که append انجام میدهد را میبینید:

اکنون این موضوع را در کد های زیر پیاده‌سازی میکنیم:

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None

class LinkedList:
  def __init__(self):
    self.head = None

  def append(self, data):
    new_node = Node(data)

ما یک new_node در خط ۱۱با استفاده از کلاس Node تعریف کرده ایم. که شامل data و next خواهد بود. ما data را به ورودی این متد دادیم . فیلد data در new_node مقدار data ای که به ورودی متد append دادیم، را خواهد داشت.

linked list های خالی

برای append باید این موضوع را هم درنظر بگیریم که اگر linked list خالی بودچه باید کرد:

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None

class LinkedList:
  def __init__(self):
    self.head = None

  def append(self, data):
    new_node = Node(data)
    if self.head is None:
      self.head = new_node
      return

در کدبالا، خالی بودن یک linked list را بررسی میکنیم، که این کار با استفاده از بررسی مقدار head انجام میشود. در خط ۱۲ اگر self.head مقدار None داشته باشد، مشخص میشود که linked-list  خالی است و هیچ چیز آنجا نیست. مقدار head در این صورت به جایی اشاره نمیکند و بنابراین هیچ نودی در linked list ما وجود ندارد. اگر هیچ نودی هم در linked list نداشته باشیم، مقدار اشاره گر head را به new_node که در خط ۱۳ ساخته شد، ارجاع میدهیم. در خط بعدی به سادگی  return را داریم. موضوع یک لیست خالی به سادگی‌ای بود که ملاحظه کردید.

linked list ای که خالی نباشد

اکنون ببینیم اگر یک linked list خالی نباشد چه باید کرد. ما یک new_node ساخته ایم، و ما میخواهیم آن را به انتهای یک linked لیست اضافه کنیم. ما میتوانیم از head شروع کنیم و روی تک تک المان های linked list حرکت کنیم تا به نود انتهایی برسیم. وقتی رسیدیم باید new_node را به صورت زیر به انتها اضافه کنیم:

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None

class LinkedList:
  def __init__(self):
    self.head = None

  def append(self, data):
    new_node = Node(data)
    if self.head is None:
      self.head = new_node
      return
    last_node = self.head
    while last_node.next:
      last_node = last_node.next
    last_node.next = new_node

در کد بالا ما در خط ۳۲ یک متد جدید ساختیم و اسم آن را insert_after_node قرار داده‌ایم. یک ورودی self خواهد بود. ورودی بعدی prev_node است که منظور نودی است که قرار است دیتا ما، که ورودی سوم است، بعد از prev_node قرار بگیرد. که در نتیجه باید بر اساس data ابتدا یک نود نیز تشکیل بشود. همانطور که قبلا گفته شد، ابتدا باید بررسی کنیم که آیا prev_node مقدار None است یا خیز. اگر prev_node مقدار None داشت یا اصلا وجود نداشت در اینصورت string زیر را در خط ۳۴ برای کاربر پرینت میکنیم.

Previous node does not exist.

برمیگردیم به خط ۳۵٫ اگر prev_node مقدار None نبود، سپس یک نود جدید در خط ۳۶ میسازیم. اکنون  نیاز دارید تا به تصویر مربوط به این بخش مراجعه کنید. همانطور که که در step2 نمایش داده شده است، در خط ۳۸ ما مقدار next از new_node را برابر مقدار next نودی که قرار است بعد آن اضافه شود، نسبت میدهیم. برای اجرای step3 بر اساس تصویر بالا، ما prev_node.next را به نود new_node در خط ۳۹ نسبت میدهیم. بنابراین new_node اکنون بعد از prev_node قرار گرفته است. در کد بالا، مقدار D را بعد از B قرار میدهیم و linked list را پرینت میکنیم تا کارایی متد نوشته شده را بررسی کنیم. همانطور که میبینید، متد و کد ما به درستی کار میکند. اینها متدهایی بودند که میتوان در مورد اضافه کردن المان در linked list ها بررسی کرد. در درس بعدی ما این کد را ادامه میدهیم و متدهای دیگری دز LinkedList میسازیم. امیدواریم که این درس برای شما مفید باشد. منتظر شما در درس بعدی هستیم!

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None

class LinkedList:
  def __init__(self):
    self.head = None
  
  def print_list(self):
    cur_node = self.head
    while cur_node:
      print(cur_node.data)
      cur_node = cur_node.next

  def append(self, data):
    new_node = Node(data)
    if self.head is None:
      self.head = new_node
      return
    last_node = self.head
    while last_node.next:
      last_node = last_node.next
    last_node.next = new_node
  
llist = LinkedList()
llist.append("A")
llist.append("B")
llist.append("C")
llist.append("D")


llist.print_list()  

ما مقدار پیش فرض cur_node را برابر head در linked list قرار دادیم. سپس از یک حلقه while برای حرکت و پرینت کردن اعضای cur_node استفاده کرده‌ایم، البته اگر این مقدار برابر none نباشد. در کد بالا، ما چهار المان را به linked list اضافه کرده ایم. که این را در خروجی کد بالا میتوانید مشاهده کنید. اکنون سراغ متد دیگری که وظیفه اضافه کردن المان ها را به linked list دارد، میرویم.

Prepend

این متد برای اضافه کردن یک المان به ابتدای  یک linked list بکار میرود که در تصویر زیر آن را میبینید:

ما یک نود جدید بر اساس داده ای که به آن داده میشود، میسازیم، که در مثال بالا این داده D است. اکنون میخواهیم مقدار next در این نود را به مقداری که head دارد متصل کنیم و همچنین مقدار head به نود جدید ما اشاره کند و متصل گردد. اکنون کد زیر را مینویسیم و در ادامه مرحله به مرحله آن را بررسی میکنیم.

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None

class LinkedList:
  def __init__(self):
    self.head = None
  
  def print_list(self):
    cur_node = self.head
    while cur_node:
      print(cur_node.data)
      cur_node = cur_node.next

  def append(self, data):
    new_node = Node(data)
    if self.head is None:
      self.head = new_node
      return
    last_node = self.head
    while last_node.next:
      last_node = last_node.next
    last_node.next = new_node

  def prepend(self, data):
    new_node = Node(data)

    new_node.next = self.head
    self.head = new_node
  
  
llist = LinkedList()
llist.append("A")
llist.append("B")
llist.append("C")

llist.prepend("D")

llist.print_list()  

ما یک متد با نام prepend ساخته‌ایم. که ورودی self و data را دارد که مشخص میکند قرار است چه داده‌ای prepend بشود. ما یک نود جدید میسازیم البته بر اساس داده‌هایی که به متد وارد شده است. بعد در خط ۲۹ مقدار next از new_node را به head ساختار linked list نسبت میدهیم، و سپس مقدار اشاره head را در خط ۳۰ به new_node نسبت میدهیم.اکنون ما مقدار D را به llist در ابتدای آن اضافه کرده‌ایم. که در قبل فقط اعضای A B C را داشت. شما میتوانید کدهای بالا را تغییر بدهید و این متد را بیشتر بررسی کنید.

Insert After Node

آخرین متدی که میخوایم در این درس بررسی کنیم اضافه کردن یک المان بعد از یک نود مشخص است. در مثالی که در اسلایدهای زیر میبینید، ما یک linked list ای داریم شامل A,B و C. اکنون میخواهیم مقدار D را بعد از نود B اضافه کنیم.

اکنون مراحلی که باید برای اضافه کردن D بعد B، انجام دهیم را میبینیم. اول از همه ما یک نود جدید بر اساس داده D میسازیم. این step1 است که در اسلاید بالا هم میبینید. سپس نیاز داریم که بررسی کنیم که آیا نودی که قرار است بعد از آن دیتای ما وارد شود در linked list موجود است یا نه. اگر جواب نه بود کار ناتمام است. در غیر اینصورت مقدار next برای المان D برابر مقدار next از داده B قرار میدهیم که دراین مثال C است. شما میتوانید به اسلاید شماره ۲ در اسلاید بالا بروید تا بیشتر متوجه این موضوع بشوید. سپس برای پیاده‌سازی مرحله ۳ میتوانیم مقدار next در B را به نود جدید یعنی D نسبت بدهیم. اکنون این مراحل را کدنویسی میکنیم:

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None

class LinkedList:
  def __init__(self):
    self.head = None
  
  def print_list(self):
    cur_node = self.head
    while cur_node:
      print(cur_node.data)
      cur_node = cur_node.next

  def append(self, data):
    new_node = Node(data)
    if self.head is None:
      self.head = new_node
      return
    last_node = self.head
    while last_node.next:
      last_node = last_node.next
    last_node.next = new_node

  def prepend(self, data):
    new_node = Node(data)

    new_node.next = self.head
    self.head = new_node
  
  def insert_after_node(self, prev_node, data):
    if not prev_node:
      print("Previous node does not exist.")
      return
    new_node = Node(data)

    new_node.next = prev_node.next
    prev_node.next = new_node

  
  
llist = LinkedList()
llist.append("A")
llist.append("B")
llist.append("C")


llist.insert_after_node(llist.head.next, "D")

llist.print_list()  

در کد بالا ما در خط ۳۲ یک متد جدید ساختیم و اسم آن را insert_after_node قرار داده‌ایم. یک ورودی self خواهد بود. ورودی بعدی prev_node است که منظور نودی است که قرار است دیتا ما، که ورودی سوم است، بعد از prev_node قرار بگیرد. که در نتیجه باید بر اساس data ابتدا یک نود نیز تشکیل بشود. همانطور که قبلا گفته شد، ابتدا باید بررسی کنیم که آیا prev_node مقدار None است یا خیز. اگر prev_node مقدار None داشت یا اصلا وجود نداشت در اینصورت string زیر را در خط ۳۴ برای کاربر پرینت میکنیم.

Previous node does not exist.

برمیگردیم به خط ۳۵٫ اگر prev_node مقدار None نبود، سپس یک نود جدید در خط ۳۶ میسازیم. اکنون  نیاز دارید تا به تصویر مربوط به این بخش مراجعه کنید. همانطور که که در step2 نمایش داده شده است، در خط ۳۸ ما مقدار next از new_node را برابر مقدار next نودی که قرار است بعد آن اضافه شود، نسبت میدهیم. برای اجرای step3 بر اساس تصویر بالا، ما prev_node.next را به نود new_node در خط ۳۹ نسبت میدهیم. بنابراین new_node اکنون بعد از prev_node قرار گرفته است. در کد بالا، مقدار D را بعد از B قرار میدهیم و linked list را پرینت میکنیم تا کارایی متد نوشته شده را بررسی کنیم. همانطور که میبینید، متد و کد ما به درستی کار میکند. اینها متدهایی بودند که میتوان در مورد اضافه کردن المان در linked list ها بررسی کرد. در درس بعدی ما این کد را ادامه میدهیم و متدهای دیگری دز LinkedList میسازیم. امیدواریم که این درس برای شما مفید باشد. منتظر شما در درس بعدی هستیم!

در خط ۱۵ last_node را داریم که مقدار آن به head اشاره دارد. ما متغیر last_node را این دلیل نام گذاری کردیم که این همان چیزی است که در نهایت به عنوان آخرین عضو، میخواهیم به آن برسیم. از head شروع میکنیم و روی linked list حرکت میکنیم. تا زمانی که last_node.next مقدار None نداشته باشد، ما حرکت کردن روی linked list را در خط ۱۷ انجام میدهیم تا اینکه مقدار last_node.next به none برسد. که در این زمان برنامه از حلقه while در خط ۱۶، خارج می‌شود. بعد از حلقه while مقدار last_node به اخرین نود ما اشاره دارد. در خط ۱۸ ما ورودی new_node را به linked list با ثبت next از last_node به new_node و ثبت  next نود جدید به None، نسبت میدهیم. اکنون نیاز داریم تا عملیات append را با پرینت کردن مقادیر Linked list، ارزیابی کنیم. برای این هدف، یک متد دیگری با نام print_list فرامی‌خوانیم.

()print_list

این  متد  ورودی آن فقط self است و مقدار کل linked list را برای ما چاپ خواهد کرد. از head شروع میکنیم و به هر نودی که میرسیم مقدار آن را چاپ کرده و سراغ نود بعدی میرویم. همیشه مقدار next را برای هر نود بررسی میکنیم تا None نباشد. اگر None نبود به سراغ نود بعدی میرویم. بدین صورت همه داده‌ها را تا زمانی که به None برسیم پرینت میکنیم. اکنون این را در پایتون پیاده‌سازی میکنیم:

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None

class LinkedList:
  def __init__(self):
    self.head = None
  
  def print_list(self):
    cur_node = self.head
    while cur_node:
      print(cur_node.data)
      cur_node = cur_node.next

  def append(self, data):
    new_node = Node(data)
    if self.head is None:
      self.head = new_node
      return
    last_node = self.head
    while last_node.next:
      last_node = last_node.next
    last_node.next = new_node
  
llist = LinkedList()
llist.append("A")
llist.append("B")
llist.append("C")
llist.append("D")


llist.print_list()  

ما مقدار پیش فرض cur_node را برابر head در linked list قرار دادیم. سپس از یک حلقه while برای حرکت و پرینت کردن اعضای cur_node استفاده کرده‌ایم، البته اگر این مقدار برابر none نباشد. در کد بالا، ما چهار المان را به linked list اضافه کرده ایم. که این را در خروجی کد بالا میتوانید مشاهده کنید. اکنون سراغ متد دیگری که وظیفه اضافه کردن المان ها را به linked list دارد، میرویم.

Prepend

این متد برای اضافه کردن یک المان به ابتدای  یک linked list بکار میرود که در تصویر زیر آن را میبینید:

ما یک نود جدید بر اساس داده ای که به آن داده میشود، میسازیم، که در مثال بالا این داده D است. اکنون میخواهیم مقدار next در این نود را به مقداری که head دارد متصل کنیم و همچنین مقدار head به نود جدید ما اشاره کند و متصل گردد. اکنون کد زیر را مینویسیم و در ادامه مرحله به مرحله آن را بررسی میکنیم.

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None

class LinkedList:
  def __init__(self):
    self.head = None
  
  def print_list(self):
    cur_node = self.head
    while cur_node:
      print(cur_node.data)
      cur_node = cur_node.next

  def append(self, data):
    new_node = Node(data)
    if self.head is None:
      self.head = new_node
      return
    last_node = self.head
    while last_node.next:
      last_node = last_node.next
    last_node.next = new_node

  def prepend(self, data):
    new_node = Node(data)

    new_node.next = self.head
    self.head = new_node
  
  
llist = LinkedList()
llist.append("A")
llist.append("B")
llist.append("C")

llist.prepend("D")

llist.print_list()  

ما یک متد با نام prepend ساخته‌ایم. که ورودی self و data را دارد که مشخص میکند قرار است چه داده‌ای prepend بشود. ما یک نود جدید میسازیم البته بر اساس داده‌هایی که به متد وارد شده است. بعد در خط ۲۹ مقدار next از new_node را به head ساختار linked list نسبت میدهیم، و سپس مقدار اشاره head را در خط ۳۰ به new_node نسبت میدهیم.اکنون ما مقدار D را به llist در ابتدای آن اضافه کرده‌ایم. که در قبل فقط اعضای A B C را داشت. شما میتوانید کدهای بالا را تغییر بدهید و این متد را بیشتر بررسی کنید.

Insert After Node

آخرین متدی که میخوایم در این درس بررسی کنیم اضافه کردن یک المان بعد از یک نود مشخص است. در مثالی که در اسلایدهای زیر میبینید، ما یک linked list ای داریم شامل A,B و C. اکنون میخواهیم مقدار D را بعد از نود B اضافه کنیم.

اکنون مراحلی که باید برای اضافه کردن D بعد B، انجام دهیم را میبینیم. اول از همه ما یک نود جدید بر اساس داده D میسازیم. این step1 است که در اسلاید بالا هم میبینید. سپس نیاز داریم که بررسی کنیم که آیا نودی که قرار است بعد از آن دیتای ما وارد شود در linked list موجود است یا نه. اگر جواب نه بود کار ناتمام است. در غیر اینصورت مقدار next برای المان D برابر مقدار next از داده B قرار میدهیم که دراین مثال C است. شما میتوانید به اسلاید شماره ۲ در اسلاید بالا بروید تا بیشتر متوجه این موضوع بشوید. سپس برای پیاده‌سازی مرحله ۳ میتوانیم مقدار next در B را به نود جدید یعنی D نسبت بدهیم. اکنون این مراحل را کدنویسی میکنیم:

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None

class LinkedList:
  def __init__(self):
    self.head = None
  
  def print_list(self):
    cur_node = self.head
    while cur_node:
      print(cur_node.data)
      cur_node = cur_node.next

  def append(self, data):
    new_node = Node(data)
    if self.head is None:
      self.head = new_node
      return
    last_node = self.head
    while last_node.next:
      last_node = last_node.next
    last_node.next = new_node

  def prepend(self, data):
    new_node = Node(data)

    new_node.next = self.head
    self.head = new_node
  
  def insert_after_node(self, prev_node, data):
    if not prev_node:
      print("Previous node does not exist.")
      return
    new_node = Node(data)

    new_node.next = prev_node.next
    prev_node.next = new_node

  
  
llist = LinkedList()
llist.append("A")
llist.append("B")
llist.append("C")


llist.insert_after_node(llist.head.next, "D")

llist.print_list()  

در کد بالا ما در خط ۳۲ یک متد جدید ساختیم و اسم آن را insert_after_node قرار داده‌ایم. یک ورودی self خواهد بود. ورودی بعدی prev_node است که منظور نودی است که قرار است دیتا ما، که ورودی سوم است، بعد از prev_node قرار بگیرد. که در نتیجه باید بر اساس data ابتدا یک نود نیز تشکیل بشود. همانطور که قبلا گفته شد، ابتدا باید بررسی کنیم که آیا prev_node مقدار None است یا خیز. اگر prev_node مقدار None داشت یا اصلا وجود نداشت در اینصورت string زیر را در خط ۳۴ برای کاربر پرینت میکنیم.

Previous node does not exist.

برمیگردیم به خط ۳۵٫ اگر prev_node مقدار None نبود، سپس یک نود جدید در خط ۳۶ میسازیم. اکنون  نیاز دارید تا به تصویر مربوط به این بخش مراجعه کنید. همانطور که که در step2 نمایش داده شده است، در خط ۳۸ ما مقدار next از new_node را برابر مقدار next نودی که قرار است بعد آن اضافه شود، نسبت میدهیم. برای اجرای step3 بر اساس تصویر بالا، ما prev_node.next را به نود new_node در خط ۳۹ نسبت میدهیم. بنابراین new_node اکنون بعد از prev_node قرار گرفته است. در کد بالا، مقدار D را بعد از B قرار میدهیم و linked list را پرینت میکنیم تا کارایی متد نوشته شده را بررسی کنیم. همانطور که میبینید، متد و کد ما به درستی کار میکند. اینها متدهایی بودند که میتوان در مورد اضافه کردن المان در linked list ها بررسی کرد. در درس بعدی ما این کد را ادامه میدهیم و متدهای دیگری دز LinkedList میسازیم. امیدواریم که این درس برای شما مفید باشد. منتظر شما در درس بعدی هستیم!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا