优先队列
优先队列相比队列多了一个功能,就是自动排序
代码实现
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#define QUETYPE char
#define SORTTYPE int
typedef struct node {
QUETYPE data;
struct node *next;
} QueueNode, *QueueNodePtr;
typedef struct {
QueueNodePtr head;
QueueNodePtr tail;
} Queue, *QueuePtr;
QueuePtr createQueue();
QueueNodePtr createQueueNode(QUETYPE key);
void insertQueue(QueuePtr q, QUETYPE key);
QUETYPE outQueue(QueuePtr q);
void deleteQueue(QueuePtr q);
/**********排序**********/
SORTTYPE sortData(QueueNodePtr q) {
return q->data;
}
void exchange(QueueNodePtr a, QueueNodePtr b) {
SORTTYPE *aa = &(a->data);
SORTTYPE tmp_a = a->data;
SORTTYPE *bb = &(b->data);
*aa = b->data;
*bb = tmp_a;
}
void queueSort(QueuePtr q) {
//选择排序
QueueNodePtr tmp = NULL;
tmp = q->head;
while (tmp != NULL) {
QueueNodePtr tmp2 = tmp;
SORTTYPE data = sortData(tmp);
while (tmp2 != NULL) {
if (sortData(tmp2) < data) {
exchange(tmp, tmp2);
}
tmp2 = tmp2->next;
}
tmp = tmp->next;
}
}
/**********排序**********/
void main() {
QueuePtr q = createQueue();
for (int i = 10; i >0; i--) {
insertQueue(q, i, 1);
}
outQueue(q);
deleteQueue(q);
}
QueuePtr createQueue() {
QueuePtr q = (QueuePtr)malloc(sizeof(Queue));
memset(q, 0, sizeof(Queue));
q->head = q->tail = NULL;
return q;
}
QueueNodePtr createQueueNode(QUETYPE key) {
QueueNodePtr q = (QueueNodePtr)malloc(sizeof(Queue));
memset(q, 0, sizeof(Queue));
q->next = NULL;
q->data = key;
return q;
}
void insertQueue(QueuePtr q, QUETYPE key, int isSort) {
QueueNodePtr a = createQueueNode(key);
if (q->head == NULL) { //notice
q->head = q->tail = a;
}
else {
q->tail->next = a;
q->tail = a;
}
if(isSort == 1) //自动排序
queueSort(q);
}
QUETYPE outQueue(QueuePtr q) {
QUETYPE v;
if (q->head != NULL) { //notice
v = q->head->data;
QueueNodePtr tmp = q->head->next;
free(q->head);
q->head = tmp;
}
else {
v = NULL;
}
return v;
}
void deleteQueue(QueuePtr q) {
if (q->head != NULL) { //notice
QueueNodePtr tmp = q->head;
QueueNodePtr tmp2;
while (tmp != NULL) {
tmp2 = tmp;
tmp = tmp->next;
free(tmp2);
}
}
free(q);
}