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

C ++ แบ่งพาร์ติชั่นรายการที่เชื่อมโยงรอบ ๆ ค่าที่กำหนดและรักษาคำสั่งซื้อดั้งเดิม


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

Input : 1->4->3->2->5->2->3,
x = 3
Output: 1->2->2->3->3->4->5

Input : 1->4->2->10
x = 3
Output: 1->2->4->10

Input : 10->4->20->10->3
x = 3
Output: 3->10->4->20->10

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

แนวทางในการหาแนวทางแก้ไข

ในแนวทางนี้ เราจะรักษารายการสามรายการ ได้แก่ เล็ก เท่ากัน ใหญ่ ตอนนี้เรารักษาลำดับและรวมรายการเป็นรายการสุดท้าย ซึ่งเป็นคำตอบของเรา

ตัวอย่าง

รหัส C++ สำหรับแนวทางข้างต้น

#include<bits/stdc++.h>
using namespace std;
struct Node{ // structure for our node
    int data;
    struct Node* next;
};
// A utility function to create a new node
Node *newNode(int data){
    struct Node* new_node = new Node;
    new_node->data = data;
    new_node->next = NULL;
    return new_node;
}
struct Node *partition(struct Node *head, int x){
    struct Node *smallhead = NULL, *smalllast = NULL; // we take two pointers for the list                                                     //so that it will help us in concatenation
    struct Node *largelast = NULL, *largehead = NULL;
    struct Node *equalhead = NULL, *equallast = NULL;
    while (head != NULL){ // traversing through the original list
        if (head->data == x){ // for equal to x
            if (equalhead == NULL)
                equalhead = equallast = head;
            else{
                equallast->next = head;
                equallast = equallast->next;
            }
        }
        else if (head->data < x){ // for smaller than x
            if (smallhead == NULL)
                smalllast = smallhead = head;
            else{
               smalllast->next = head;
               smalllast = head;
           }
        }
        else{ // for larger than x
            if (largehead == NULL)
                largelast = largehead = head;
            else{
                largelast->next = head;
                largelast = head;
            }
        }
        head = head->next;
    }
    if (largelast != NULL) // largelast will point to null as it is our last list
        largelast->next = NULL;
   /**********Concatenating the lists**********/
    if (smallhead == NULL){
        if (equalhead == NULL)
           return largehead;
        equallast->next = largehead;
        return equalhead;
    }
    if (equalhead == NULL){
        smalllast->next = largehead;
        return smallhead;
    }
    smalllast->next = equalhead;
    equallast->next = largehead;
    return smallhead;
}
void printList(struct Node *head){ // function for printing our list
    struct Node *temp = head;
    while (temp != NULL){
        printf("%d ", temp->data);
        temp = temp->next;
   }
}
int main(){
    struct Node* head = newNode(10);
    head->next = newNode(4);
    head->next->next = newNode(5);
    head->next->next->next = newNode(30);
    head->next->next->next->next = newNode(2);
    head->next->next->next->next->next = newNode(50);
    int x = 3;
    head = partition(head, x);
    printList(head);
    return 0;
}

ผลลัพธ์

2 10 4 5 30

คำอธิบายของโค้ดด้านบน

ในแนวทางที่อธิบายข้างต้น เราจะเก็บรายการเชื่อมโยงสามรายการที่มีเนื้อหาตามลำดับ รายการที่เชื่อมโยงทั้งสามนี้จะมีองค์ประกอบที่เล็กกว่า เท่ากัน และมากกว่า x แยกจากกัน งานของเราง่ายขึ้นในขณะนี้ เราจำเป็นต้องเชื่อมรายการแล้วคืนหัว

บทสรุป

ในบทช่วยสอนนี้ เราจะแก้ปัญหาการแบ่งพาร์ติชั่นรายการที่มีการเชื่อมโยงรอบค่าที่กำหนดและคงลำดับเดิมไว้ นอกจากนี้เรายังได้เรียนรู้โปรแกรม C++ สำหรับปัญหานี้และแนวทางที่สมบูรณ์ (ปกติ) ซึ่งเราแก้ไขปัญหานี้ เราสามารถเขียนโปรแกรมเดียวกันในภาษาอื่นๆ เช่น C, java, python และภาษาอื่นๆ เราหวังว่าคุณจะพบว่าบทช่วยสอนนี้มีประโยชน์