<span style="font-family:Microsoft YaHei;font-size:12px;">声明 Queue.h</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">typedef struct queue
{
int num;
int high;
struct queue *pNext;//存储下一个节点的地址
}Queue;
Queue * init(Queue *queueA);//初始化
Queue * EnQueue(Queue *queueA, int num, int high);//入队
Queue * DeQueue(Queue *queueA, Queue *pout);//出队
Queue * freeall(Queue *queueA);//清空
void sort(Queue *queueA);//根据优先级排队 冒泡
void printfall(Queue *queueA);//打印所有数据,递归
Queue * insertEnQueue(Queue *queueA, int num, int high);</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">-------------------------------------------------------------------------------</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">定义 Queue.c</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">Queue * init(Queue *queueA)//初始化
{
return NULL;
}
Queue * EnQueue(Queue *queueA, int num, int high)//顺序入队
{
Queue *pnewnode = (Queue *)malloc(sizeof(Queue));//分配内存
pnewnode->num = num;
pnewnode->high = high;
pnewnode->pNext = NULL;
if (queueA==NULL)//链表为空
{
queueA = pnewnode;
return queueA;//返回值
}
else
{
Queue *p = queueA;//头结点
while (p->pNext!=NULL)
{
p = p->pNext;
}
//确定要插入的位置
p->pNext = pnewnode;//插入
return queueA;//返回
}
}
Queue * DeQueue(Queue *queueA, Queue *pout)//顺序出队
{
if (NULL == queueA)
{
return NULL;
}
else
{
//每次只删除第一个节点
pout->num = queueA->num;
pout->high = queueA->high;//优先级 赋值
Queue *ptemp = queueA;//记录要删除的地址
queueA = queueA->pNext;//跳过queueA
free(ptemp);//释放节点
return queueA;
}
}
Queue * freeall(Queue *queueA)//清空
{
if (NULL==queueA)
{
return NULL;
}
else
{
Queue*pq1 = NULL, *pq2 = NULL;
pq1 = queueA;
while (pq1->pNext!=NULL)
{
pq2 = pq1->pNext;
pq1->pNext = pq2->pNext;
free(pq2);
}
free(queueA);
}
return NULL;
}
//队列插入排序实现 优先级入队
Queue * insertEnQueue(Queue *queueA, int num, int high)
{
Queue *pnewnode = (Queue *)malloc(sizeof(Queue));//分配内存
pnewnode->num = num;
pnewnode->high = high;
if (queueA == NULL)//节点为空
{
pnewnode->pNext = NULL;
queueA = pnewnode;
return queueA;
}
else
{
if (pnewnode->high >queueA->high)
{
pnewnode->pNext = queueA;//头部插入
queueA = pnewnode;//指向这个节点
return queueA;
}
else
{
Queue *p = queueA;//头结点
while (p->pNext != NULL)
{
p = p->pNext;
}
//p循环到尾部
if (pnewnode->high <= p->high)
{
p->pNext = pnewnode;
pnewnode->pNext = NULL;
return queueA;
}
else
{
Queue *p1, *p2;
p1 = p2 = NULL;//避免野指针
p1 = queueA;//头结点
while (p1->pNext != NULL)
{
p2 = p1->pNext;
if (p1->high>=pnewnode->high && p2->high<pnewnode->high)
{
pnewnode->pNext = p2;
p1->pNext = pnewnode;//插入
break;
}
p1 = p1->pNext;
}
return queueA;
}
}
}
}
void Popsort(Queue *queueA)//优先级排队
{
if (NULL == queueA|| NULL == queueA->pNext )
{
return NULL;
}
for (Queue * p1 = queueA; p1 != NULL;p1=p1->pNext)
{
for (Queue *p2 = queueA; p2 != NULL; p2 = p2->pNext)
{
if (p1->high >p2->high)
{
Queue temp;
temp.num = p1->num;
p1->num = p2->num;
p2->num = temp.num;
temp.high = p1->high;
p1->high = p2->high;
p2->high = temp.high;//交换节点数据
}
}
}
}
void printfall(Queue *queueA)//递归
{
if (NULL==queueA)
{
return;
}
else
{
printf("%-6d %-2d %p %p\n", queueA->num, queueA->high, queueA, queueA->pNext);
printfall(queueA->pNext);//进入下一个节点
}
}</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">-----------------------------------------------------------------------------</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">测试 main.c</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">#include<stdio.h>
#include<stdlib.h>
#include"Queue.h"
//测试 入队出队
void main1()
{
Queue *phead = NULL;//创建头结点
phead = init(phead);//初始化
phead = EnQueue(phead, 43, 1);
phead = EnQueue(phead, 889, 2);
phead = EnQueue(phead, 23, 4);
phead = EnQueue(phead, 1234, 9);
phead = EnQueue(phead, 678, 0);
phead = EnQueue(phead, 501, 4);
printfall(phead);
printf("\n按照优先级(大->小)排序后的输出样式:\n");
Popsort(phead);
printfall(phead);
//出队
int count = 0;
while (phead != NULL)
{
//分配内存
Queue * ptemp = (Queue *)malloc(sizeof(Queue));
phead = DeQueue(phead, ptemp);
printf("\n第%d次出队以后的数据显示:\n",++count);
printfall(phead);
printf("出队的是%d %d\n", ptemp->num, ptemp->high);
}
system("pause");
}
//测试 按照优先队列插入
void main2()
{
Queue *phead = NULL;//创建头结点
phead = init(phead);//初始化
phead = insertEnQueue(phead, 1, 1);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 2, 12);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 3, 44);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 4, 14);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 5, 5);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 6, 16);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 6, 45);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 7, 0);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 8, 0);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 9, 1);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 10, 0);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 11, 16);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 111, 89);
printf("\n");
printfall(phead);
system("pause");
}</span>