C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++の任意のポインターを使用して、リンクリスト内の次に高い値のノードをポイントします


この問題では、値、リンクポインター、および任意のポインターを持つリンクリストが提供されます。私たちのタスクは、リスト内の次の大きな値を指すように任意のポインターポイントを作成することです。

問題を理解するために例を見てみましょう

C ++の任意のポインターを使用して、リンクリスト内の次に高い値のノードをポイントします

ここでは、リンクリストの連続するより大きな要素である8ポイントから12、12から41、41から54、54から76を見ることができます。

この問題を解決するために、マージソートアルゴリズムを使用して要素をソートし、ソートを任意のポインターのリンクリストとして使用します。

このために、リンクリストでマージソートアルゴリズムを使用して、任意のポインタをソートおよびリンクリストのプライマリポインタとして扱います。これにより、問題が解決されます。つまり、各任意のポイントは、次に大きいノードを指します。

ソリューションの実装を示すプログラム

#include <iostream>
using namespace std;
class Node {
   public:
   int data;
   Node* next, *arbit;
};
Node* SortedMerge(Node* a, Node* b);
void FrontBackSplit(Node* source, Node** frontRef, Node** backRef);
void MergeSort(Node** headRef) {
   Node* head = *headRef;
   Node* a, *b;
   if ((head == NULL) || (head->arbit == NULL))
      return;
   FrontBackSplit(head, &a, &b);
   MergeSort(&a);
   MergeSort(&b);
   *headRef = SortedMerge(a, b);
}
Node* SortedMerge(Node* a, Node* b) {
   Node* result = NULL;
   if (a == NULL)
      return (b);
   else if (b == NULL)
      return (a);
   if (a->data <= b->data){
      result = a;
      result->arbit = SortedMerge(a->arbit, b);
   } else {
      result = b;
      result->arbit = SortedMerge(a, b->arbit);
   }
   return (result);
}
void FrontBackSplit(Node* source, Node** frontRef, Node** backRef) {
   Node* fast, *slow;
   if (source == NULL || source->arbit == NULL){
      *frontRef = source;
      *backRef = NULL;
      return;
   }
   slow = source, fast = source->arbit;
   while (fast != NULL){
      fast = fast->arbit;
      if (fast != NULL){
         slow = slow->arbit;
         fast = fast->arbit;
      }
   }
   *frontRef = source;
   *backRef = slow->arbit;
   slow->arbit = NULL;
}
void addNode(Node** head_ref, int new_data) {
   Node* new_node = new Node();
   new_node->data = new_data;
   new_node->next = (*head_ref);
   new_node->arbit = NULL;
   (*head_ref) = new_node;
}
Node* populateArbitraray(Node *head) {
   Node *temp = head;
   while (temp != NULL){
      temp->arbit = temp->next;
      temp = temp->next;
   }
   MergeSort(&head);
   return head;
}
int main() {
   Node* head = NULL;
   addNode(&head, 45);
   addNode(&head, 12);
   addNode(&head, 87);
   addNode(&head, 32);
   Node *ahead = populateArbitraray(head);
   cout << "\t\tArbitrary pointer overlaoded \n Traversing linked List\n";
   cout<<"Using Next Pointer\n";
   while (head!=NULL){
      cout << head->data << ", ";
      head = head->next;
   }
   printf("\nUsing Arbit Pointer\n");
   while (ahead!=NULL){
      cout<<ahead->data<<", ";
      ahead = ahead->arbit;
   }
   return 0;
}

出力

Arbitrary pointer overlaoded
Traversing linked List
Using Next Pointer
32, 87, 12, 45,
Using Arbit Pointer
12, 32, 45, 87,

  1. C++でランダムポインタを使用してリストをコピーする

    リンクリストは線形データ構造であり、各ノードには2つのブロックがあり、一方のブロックにはノードの値またはデータが含まれ、もう一方のブロックには次のフィールドのアドレスが含まれます。 各ノードにリスト内の他のノードを指すランダムポインタが含まれるようなリンクリストがあると仮定します。タスクは、元のリストと同じリストを作成することです。ランダムなポインタを持つ元のリストからリストをコピーすることを、リンクリストの「ディープコピー」と呼びます。 例 入力-1 出力: 5-> 2 -> 3 -> 7 ->4 -> 説明: この問題を解決するためのア

  2. C++のリンクリスト内の最大値の右側のノードへのポイントアービットポインタ

    この問題では、値、リンクポインター、および任意のポインターを持つリンクリストが提供されます。私たちのタスクは、リンクリストの右側にある最大値を指すように任意のポインターポイントを作成することです。 問題を理解するために例を見てみましょう ここでは、リンクリストの次の任意のポインタを見ることができます。これは、リンクリストの右側にある最大の要素を指しています。 12 -> 76, 76 -> 54, 54 -> 8, 8 -> 41 この問題を解決するには、ノードの右側にある最大の要素を見つける必要があります。このために、リンクリストを逆方向にトラバースし、す