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

ลบโหนด N หลังจากโหนด M ของรายการที่เชื่อมโยงใน C ++ หรือไม่


ขั้นแรกให้เรากำหนดรายการเชื่อมโยงที่มีข้อมูลและตัวชี้ไปยังโหนดถัดไป

struct Node {
   int data;
   struct Node* next;
};

จากนั้นเราสร้างฟังก์ชัน createList(Node ** headPtr, int new_data) ซึ่งนำ doublePointer ไปยังโหนดและค่า int ภายในฟังก์ชันเรากำหนดโหนดที่สร้างขึ้นใหม่ตัวชี้ถัดไปให้กับ headptr จากนั้นจึงกำหนด headptr ให้กับโหนดที่สร้างขึ้นใหม่

void createList(Node ** headPtr, int new_data){
   Node* newNode = new Node();
   newNode->data = new_data;
   newNode->next = (*headPtr);
   (*headPtr) = newNode;
}

วิธี deleteNnodesAfterM(Node *head, int M, int N) รับโหนดรูทและค่า M และ N ข้างในเรากำหนด Node* ปัจจุบันให้กับส่วนหัวและประกาศ Node *t.

void deleteNnodesAfterM(Node *head, int M, int N){
   Node *current = head, *t;
   int nodeCount;

ภายในฟังก์ชันเรามี while loop ซึ่งทำงานในขณะที่กระแสไม่ชี้ไปที่ค่าว่าง ครั้งแรกสำหรับลูปรันสำหรับการวนซ้ำ M หลังจากลูปแรกเสร็จสิ้นการดำเนินการ ปัจจุบัน ตัวชี้ชี้ไปที่โหนดหลัง M ในรายการที่เชื่อมโยง จากนั้นโหนด *t จะถูกกำหนดค่าปัจจุบัน -> ถัดไป ซึ่งเป็นค่าแรกที่จะลบ

while (current){
   for (nodeCount = 1; nodeCount < M && current!= NULL; nodeCount++)
   current = current->next;
   if (current == NULL)
      return;
   t = current->next;

วินาทีสำหรับลูปรันสำหรับการวนซ้ำ N และทำให้จำนวนโหนด N ว่างจากตำแหน่งเริ่มต้น ปัจจุบัน -> ถัดไปถูกกำหนดให้กับ t และ t กลายเป็นโหนดปัจจุบันของเรา

for (nodeCount = 1; nodeCount<=N && t!= NULL; nodeCount++){
   Node *temp = t;
   t = t->next;
   free(temp);
}
current->next = t;
current = t;

สุดท้าย printList(Node *head) ซึ่งใช้ตัวชี้ส่วนหัวจะพิมพ์รายการที่เชื่อมโยง

void printList(Node *head){
   Node *temp = head;
   while (temp != NULL){
      cout<<temp->data<<" ";
      temp = temp->next;
   }
   cout<<endl;
}

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อลบโหนด N หลังจากโหนด M ของรายการที่เชื่อมโยง -

#include <iostream>
using namespace std;
struct Node{
   int data;
   Node *next;
};
void createList(Node ** headPtr, int new_data){
   Node* newNode = new Node();
   newNode->data = new_data;
   newNode->next = (*headPtr);
   (*headPtr) = newNode;
}
void printList(Node *head){
   Node *temp = head;
   while (temp != NULL){
      cout<<temp->data<<" ";
      temp = temp->next;
   }
   cout<<endl;
}
void deleteNnodesAfterM(Node *head, int M, int N){
   Node *current = head, *t;
   int nodeCount;
   while (current){
      for (nodeCount = 1; nodeCount < M && current!= NULL; nodeCount++)
      current = current->next;
      if (current == NULL)
      return;
      t = current->next;
      for (nodeCount = 1; nodeCount<=N && t!= NULL; nodeCount++){
         Node *temp = t;
         t = t->next;
         free(temp);
      }
      current->next = t;
      current = t;
   }
}
int main(){
   Node* head = NULL;
   int M=2, N=2;
   createList(&head, 2);
   createList(&head, 4);
   createList(&head, 6);
   createList(&head, 8);
   createList(&head, 10);
   createList(&head, 12);
   createList(&head, 14);
   cout << "M = " << M<< " N = " << N<<endl;
   cout<< "Original linked list :"<<endl;
   printList(head);
   deleteNnodesAfterM(head, M, N);
   cout<<"Linked list after deletion :"<<endl;
   printList(head);
   return 0;
}

ผลลัพธ์

รหัสข้างต้นจะสร้างผลลัพธ์ต่อไปนี้ -

M = 2 N = 2

Original linked list :
14 12 10 8 6 4 2

Linked list after deletion :
14 12 6 4