Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ลบโหนดหางจากรายการเชื่อมโยงที่กำหนดโดยใช้ C++


รายการที่เชื่อมโยงเป็นโครงสร้างข้อมูลเชิงเส้นที่มีโหนดและแต่ละโหนดมีสองฟิลด์ หนึ่งคือค่าหรือข้อมูลที่จะแทรกและฟิลด์อื่นเก็บที่อยู่ของโหนดถัดไป

งานของเราคือการลบโหนดออกจากจุดสิ้นสุดของรายการที่เชื่อมโยง โหนดสุดท้ายเรียกว่าโหนดท้าย หากไม่มีโหนดในรายการที่เชื่อมโยง ให้คืนค่า NULL

ตัวอย่างเช่น −

อินพุต 1 − 1 → 2 → 3 → 4 → 5

ผลผลิต − 1 → 2 → 3 → 4 →

คำอธิบาย - ในรายการที่เชื่อมโยงโดยลำพังที่กำหนด โหนดจากจุดสิ้นสุดคือ '5' หลังจากลบโหนดสุดท้ายแล้ว เอาต์พุตจะเป็น 1 → 2 → 3 → 4 →

อินพุต 2 − 5 → 8 →3

ผลผลิต − 5 → 8 →

คำอธิบาย - ในรายการที่เชื่อมโยงโดยลำพังที่กำหนด โหนดจากจุดสิ้นสุดคือ '3' หลังจากลบโหนดออกจากจุดสิ้นสุด ผลลัพธ์จะเป็น 5 →8 →.

แนวทางการแก้ปัญหานี้

วิธีง่ายๆ ในการแก้ปัญหานี้คือการสร้างโหนดก่อนหน้าที่เก็บค่าของโหนดปัจจุบันในภายหลังเมื่อตัวชี้ปัจจุบันจะชี้ไปที่โหนดสุดท้ายของรายการที่เชื่อมโยง

วนซ้ำทุกโหนดของรายการที่เชื่อมโยงหากโหนดปัจจุบันชี้ไปที่โหนดสุดท้าย และสุดท้าย กลับจากรายการที่เชื่อมโยง

  • เริ่มต้นรายการที่เชื่อมโยงโดยการแทรกโหนดเข้าไป

  • ฟังก์ชัน insertAtFirst(node*&head, int data) จะแทรกโหนดทั้งหมดในรายการที่เชื่อมโยง

  • ฟังก์ชัน deleteAtTail(node*head) ใช้ตัวชี้ที่กำลังชี้ไปที่ส่วนหัว

  • สร้างตัวชี้โหนดก่อนหน้าและเริ่มต้นเป็น NULL

  • สร้างตัวชี้โหนดชั่วคราวซึ่งกำลังชี้ไปที่ส่วนหัวของตัวชี้

  • เลื่อนไปตามตัวชี้ชั่วคราวจนกว่าจะไปไม่สุดของรายการที่เชื่อมโยง

  • เก็บค่าของตัวชี้ชั่วคราวในพอยน์เตอร์ของโหนดก่อนหน้า

  • ลบตัวชี้ชั่วคราว

  • กลับรายการเชื่อมโยง

ตัวอย่าง

#include<iostream>
using namespace std;
class node{
   public:
   int data;
   node*next;
   node(int d){
      data=d;
      node*next= NULL;
   }
};
void insertAtFirst(node*&head, int data){
   node*n= new node(data);
   n->next= head;
   head=n;
}
void printNode(node*head){
   while(head!=NULL){
      cout<<head->data<<"->";
      head=head->next;
   }
   cout<<endl;
}
void deleteatTail(node*head){
   node*prev= NULL;
   node*temp= head;
   while(temp->next!=NULL){
      prev= temp;
      temp=temp->next;
   }
   delete temp;
   prev->next= NULL;
   return;
}
int main(){
   node*head= NULL;
   insertAtFirst(head,5);
   insertAtFirst(head,4);
   insertAtFirst(head,3);
   insertAtFirst(head,2);
   insertAtFirst(head,1);
   deleteatTail(head);
   printNode(head);
}

ผลลัพธ์

การเรียกใช้โค้ดด้านบนจะสร้างผลลัพธ์เป็น

1→2→3→4→

ในรายการเชื่อมโยงเดี่ยวอินพุตที่กำหนด 1 → 2 → 3 → 4 → 5 โหนดสุดท้ายของรายการที่เชื่อมโยงคือ '5' ดังนั้น หลังจากลบโหนดสุดท้าย รายการที่เชื่อมโยงจะกลายเป็น 1 → 2 → 3 → 4 →