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

วิธีการแบบเรียกซ้ำสำหรับการสลับการแยกรายการที่เชื่อมโยงใน C ++


กำหนดรายการเชื่อมโยงแบบเดี่ยวเป็นอินพุต เป้าหมายคือการแบ่งรายการออกเป็นสองรายการที่เชื่อมโยงโดยลำพังซึ่งมีโหนดสำรองของรายการดั้งเดิม หากรายการอินพุตมีโหนด a → b → c → d → e → f หลังจากแยกแล้ว รายการย่อยสองรายการจะเป็น a → c → e และ b → d → f

เราจะใช้ตัวชี้สองตัว N1 และ N2 ตัวหนึ่งชี้ไปที่ส่วนหัวของรายการดั้งเดิมและอีกตัวชี้ไปที่ส่วนหัว → ถัดไป ตอนนี้ย้ายพอยน์เตอร์ทั้งสองไปที่โหนดถัดไปและสร้างรายการย่อย

ตัวอย่าง

ป้อนข้อมูล − รายการ :- 1 → 5 → 7 → 12 → 2 → 96 → 33

ผลผลิต − รายการดั้งเดิม :1 5 7 12 2 96 33

รายการ 1:1 7 2 33

รายการ 2:5 12 96

คำอธิบาย − เริ่มจาก 1 และ 5 และจุดถัดไปไปยังโหนดสำรองเพื่อสร้างรายการย่อยที่แสดงด้านบน

ป้อนข้อมูล − รายการ :- 13 → 53 → 90 → 18 → 44 → 11 → 99 → 32

ผลผลิต − รายการดั้งเดิม :13 53 90 18 44 11 99 32

รายการ 1:13 90 44 99

รายการ 2:53 18 11 32

คำอธิบาย − เริ่มจาก 13 และ 53 และจุดถัดไปไปยังโหนดสำรองเพื่อสร้างรายการย่อยที่แสดงด้านบน

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้

ในแนวทางนี้ เราจะใช้ตัวชี้ N1 และ N2 สองตัว ตัวหนึ่งชี้ไปที่ส่วนหัวของรายการดั้งเดิม และอีกตัวชี้ไปที่ส่วนหัว→ ถัดไป ตอนนี้ย้ายพอยน์เตอร์ทั้งสองไปที่โหนดถัดไปและสร้างรายการย่อย

  • ใช้โครงสร้างโหนดที่มีส่วนข้อมูล int และโหนดเป็นตัวชี้ถัดไป

  • ฟังก์ชัน addtohead(โหนด** head, int data) ใช้เพื่อเพิ่มโหนดในส่วนหัวเพื่อสร้างรายการที่เชื่อมโยงโดยลำพัง

  • สร้างรายการที่เชื่อมโยงโดยลำพังโดยใช้ฟังก์ชันข้างต้นโดยมีส่วนหัวเป็นตัวชี้ไปยังโหนดแรก

  • การแสดงฟังก์ชัน (หัวโหนด*) ใช้เพื่อพิมพ์รายการที่เชื่อมโยงโดยเริ่มจากโหนดหลัก

  • ใช้ตัวชี้โหนดสองตัว node1 และ node2

  • ฟังก์ชัน splitList(หัวโหนด*, โหนด** n1, โหนด** n2) นำพอยน์เตอร์ของโหนดและชี้ n1 ไปที่ส่วนหัว และ n2 ไปยังส่วนหัว → ถัดจากสตริงเดิม

  • ข้างในนั้นเรียก split(*n1, *n2) เพื่อแยกรายการดั้งเดิมออกเป็นสองรายการย่อย

  • การแยกฟังก์ชัน (โหนด* N1, โหนด* N2) รับตัวชี้ N1 และ N2 และสร้างรายการย่อยสองรายการที่มีโหนดสลับกันของรายการดั้งเดิม

  • หากทั้ง N1 และ N2 เป็นโมฆะ ก็จะไม่ส่งคืนสิ่งใด

  • ถ้า N1→ next ไม่เป็นค่าว่าง ให้ตั้งค่า tmp=N1->next->next และ N1->next =tmp;

  • f N2→ next ไม่เป็นค่าว่าง จากนั้นให้ตั้งค่า tmp=N2->next->next และ N2->next =tmp;

  • การแยกการโทร (N1->ถัดไป, N2->ถัดไป); สำหรับการทำซ้ำครั้งต่อไป

  • ในตอนท้ายพิมพ์รายการย่อยโดยใช้ display()

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node* next;
};
void addtohead(Node** head, int data){
   Node* nodex = new Node;
   nodex->data = data;
   nodex->next = (*head);
   (*head) = nodex;
}
void split(Node* N1, Node* N2){
   Node *tmp;
   if (N1 == NULL || N2 == NULL){
      return;
   }
   if (N1->next != NULL){
      tmp=N1->next->next;
      N1->next = tmp;
   }
   if (N2->next != NULL){
      tmp=N2->next->next;
      N2->next = tmp;
   }
   split(N1->next, N2->next);
}
void splitList(Node* head, Node** n1, Node** n2){
   *n1 = head;
   *n2 = head->next;
   split(*n1, *n2);
}
void display(Node* head){
   Node* curr = head;
   if (curr != NULL){
      cout<<curr->data<<" ";
      display(curr->next);
   }
}
int main(){
   Node* head = NULL;
   Node *node1 = NULL, *node2 = NULL;
   addtohead(&head, 20);
   addtohead(&head, 12);
   addtohead(&head, 15);
   addtohead(&head, 8);
   addtohead(&head, 10);
   addtohead(&head, 4);
   addtohead(&head, 5);

   cout<<"Original List :"<<endl;
   display(head);
   splitList(head, &node1, &node2);
   cout<<endl<<"List 1: ";
   display(node1);
   cout<<endl<<"List 2: ";
   display(node2);
   return 0;
}

ผลลัพธ์

หากเรารันโค้ดด้านบน มันจะสร้างผลลัพธ์ต่อไปนี้

Original List :
5 4 10 8 15 12 20
List 1: 5 10 15 20
List 2: 4 8 12