建立大根堆并使用头插法建立升序链表
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iterator>
#include <queue>
using namespace std;
struct LinkNode {
int data;
LinkNode* next;
};
void printlist(LinkNode* head) {
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
}
int main() {
int n, a[1001];
priority_queue<int> pq; // 大根堆只存储数据
// 建立头结点,头指针head始终指向头结点,无论链表是否为空
LinkNode* head = new LinkNode;
head->next = NULL;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
pq.push(a[i]);
}
// 建立大根堆并使用头插法建立升序链表
while (!pq.empty()) {
int out = pq.top();
pq.pop();
LinkNode* newnode = new LinkNode;
newnode->data = out;
newnode->next = NULL;
if (head->next == NULL) { // 是第一个结点,直接插到头结点后面
head->next = newnode;
}
else {
newnode->next = head->next;
head->next = newnode;
}
}
printlist(head->next); // 传入第一个有效数据结点
printf("\n");
}
return 0;
}

京公网安备 11010502036488号