C++を使用して二重リンクリストのソートをマージします。
問題の説明
二重にリンクされたリストが与えられます。マージソートアルゴリズムを使用してソートします
List: 10->20->8-17->5->13->4 Sorted list: 4->5->8->10->13->17->20
アルゴリズム
1. If head is NULL or list contains only one element then return list 2. Create two lists by dividing original list into 2 parts 3. Sort first and second part of list 4. Merge both sorted list
例
#include <iostream> #include <new> #define SIZE(arr) (sizeof(arr) / sizeof(arr[0])) using namespace std; struct node { int data; struct node *next; struct node *prev; }; node *createList(int *arr, int n){ node *head, *p, *q; p = head = new node; head->data = arr[0]; head->prev = NULL; head->next = NULL; for (int i = 1; i < n; ++i) { q = new node; q->data = arr[i]; q->prev = p; q->next = NULL; p->next = q; p = q; } return head; } void displayList(node *head){ while (head != NULL) { cout << head->data << " "; head = head->next; } cout << endl; } node *mergeSortedLists(node *head1, node *head2){ node *result = NULL; if (head1 == NULL) { return head2; } if (head2 == NULL) { return head1; } if (head1->data < head2->data) { head1->next = mergeSortedLists(head1->next, head2); head1->next->prev = head1; head1->prev = NULL; return head1; } else { head2->next = mergeSortedLists(head1, head2->next); head2->next->prev = head2; head2->prev = NULL; return head2; } } void splitList(node *src, node **fRef, node **bRef){ node *fast; node *slow; slow = src; fast = src->next; while (fast != NULL) { fast = fast->next; if (fast != NULL) { slow = slow->next; fast = fast->next; } } *fRef = src; *bRef = slow->next; slow->next = NULL; } void mergeSort(node **head){ node *p = *head; node *a = NULL; node *b = NULL; if (p == NULL || p->next == NULL) { return; } splitList(p, &a, &b); mergeSort(&a); mergeSort(&b); *head = mergeSortedLists(a, b); } int main(){ int arr[] = {10, 20, 8, 17, 5, 13, 4}; node *head; head = createList(arr, SIZE(arr)); cout << "Unsorted list: " << endl; displayList(head); mergeSort(&head); cout << "Final sorted list: " << endl; displayList(head); return 0; }
出力
上記のプログラムをコンパイルして実行する場合。次の出力を生成します-
Unsorted list: 10 20 8 17 5 13 4 Final sorted list: 4 5 8 10 13 17 20
-
C++で二重にリンクされた循環リスト
循環リンクリストは、最初の要素が最後の要素を指し、最後の要素が最初の要素を指すリンクリストのバリエーションです。単一リンクリストと二重リンクリストの両方を循環リンクリストにすることができます。 二重リンクリストでは、最後のノードの次のポインタが最初のノードを指し、最初のノードの前のポインタが最後のノードを指し、両方向に循環します。 上の図のように、考慮すべき重要なポイントは次のとおりです。 最後のリンクの次は、二重リンクリスト内のリストの最初のリンクを指します。 最初のリンクの前のポイントは、二重にリンクされたリストの最後を指します。 アルゴリズム displayFo
-
C++で二重にリンクされたリストを使用した優先キュー
データと優先度は整数値として与えられ、タスクは与えられた優先度に従って二重にリンクされたリストを作成し、結果を表示することです。 キューはFIFOデータ構造であり、最初に挿入された要素が最初に削除されます。優先度付きキューは、優先度に応じて要素を挿入または削除できるキューの一種です。キュー、スタック、またはリンクリストのデータ構造を使用して実装できます。優先キューは、次のルールに従って実装されます- 優先度が最も高いデータまたは要素は、優先度が最も低いデータまたは要素の前に実行されます。 2つの要素の優先度が、順番に実行される要素と同じである場合、それらはリストに追加されます。 優先