*文件名:queue_linknode.h
*创建者:ycj
*创建时间:2015-3-16
*文件说明:链式队列头文件说明
*************************************************/
#include <stdio.h>
#include <stdlib.h>
struct queue_link
{
int num;//代表数据
int high;//优先级
struct queue *pNext;//存储下一个结点的地址
};
typedef struct queue_link Queue;//简化队列
Queue *init(Queue *queue);//初始化
Queue *EnQueue(Queue *queue, int num, int high);//入队
Queue *DeQuene(Queue *queue, Queue *pout);//出队
Queue *freeall(Queue *queue);//清空
void sort(Queue *queue);//优先级排队
void printfall(Queue *queue) ;//打印所有数据
Queue *insertEnQueue(Queue *queue, int num, int high);//根据优先级入列(插入排序法)
/************************************************
*文件名:queue_linknode.c
*创建者:ycj
*创建时间:2015-3-16
*文件说明:链式队列模块实现函数
*************************************************/
#include "queue_linknode.h"Queue *init(Queue *queue)//初始化
{
return NULL;
}
Queue *EnQueue(Queue *queue, int num, int high)//顺序入队(无优先级)
{
Queue *pnewnode = (Queue *)malloc(sizeof(Queue));//分配内存
pnewnode->num = num;
pnewnode->high = high;
pnewnode->pNext = NULL;
if (queue == NULL)//链表为空
{
queue = pnewnode;
return queue;//返回头结点
}
else
{
Queue *p = queue;
while (p->pNext != NULL)
{
p = p->pNext;//p循环到最后一个结点
}
p->pNext = pnewnode;//在末尾加一个结点
//sort(queue);//优先级排队
return queue;
}
}
Queue *DeQuene(Queue *queue, Queue *pout)//出队
{
if (queue == NULL)
{
return NULL;
}
else
{
pout->num = queue->num;
pout->high = queue->high;//赋值
Queue *ptemp = queue;//记录删除的地址
queue = queue->pNext;//跳过第一个结点
free(ptemp);//释放结点
return queue;
}
}
Queue *freeall(Queue *queue)//清空
{
if (queue == NULL)
{
return NULL;
}
else
{
Queue *phead, *pfree;
phead = queue;//保存头结点
while (phead->pNext != NULL)
{
pfree = phead->pNext;
phead->pNext = pfree->pNext;
free(pfree);
}
free(phead);
return NULL;
}
}
void sort(Queue *queue)//优先级排队
{
if (queue == NULL || queue->pNext == NULL)
{
return;
}
冒泡排序:存在问题
//for (Queue *p1 = queue; p1 != NULL; p1 = p1->pNext)
//{
// for (Queue *p2 = queue; 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;
// }
// }
//}
}
//根据优先级入列(插入排序法)
Queue *insertEnQueue(Queue *queue, int num, int high)
{
Queue *pnewnode = (Queue *)malloc(sizeof(Queue));//分配内存
pnewnode->num = num;
pnewnode->high = high;
if (queue == NULL)//队列为空
{
pnewnode->pNext = NULL;
queue = pnewnode;
return queue;
}
else
{
if (pnewnode->high < queue->high)//头部插入
{
pnewnode->pNext = queue;//插入在头结点前
queue = pnewnode;
return queue;
}
else
{
Queue *p = queue;//头结点
while (p->pNext != NULL)//p循环到尾部
{
p = p->pNext;
}
if (pnewnode->high >= p->high)//尾部插入
{
p->pNext = pnewnode;
pnewnode->pNext = NULL;
return queue;
}
else//中间判断插入
{
Queue *p1, *p2;
p1 = p2 = NULL;
p1 = queue;//头结点
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 queue;
}
}
}
}
void printfall(Queue *queue)//打印所有数据
{
if (queue == NULL)
{
return;
}
else
{
printf("%d,%d,%p,%p\n", queue->num, queue->high, queue, queue->pNext);
printfall(queue->pNext);//进入下一个结点
}
}
/************************************************
*文件名:test.c
*创建者:ycj
*创建时间:2015-3-16
*文件说明:链式队列模块的测试
*************************************************/
#include "queue_linknode.h"void main()
{
Queue *phead = NULL;
phead = init(phead);
printf("根据优先级入列:");
phead = insertEnQueue(phead, 1, 2);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 2, 1);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 3, 3);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 4, 4);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 5, 2);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 6, 3);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 11, 4);
printf("\n");
printfall(phead);
phead = insertEnQueue(phead, 111, 5);
printf("\n");
printfall(phead);
//phead = freeall(phead);//清空
//printfall(phead);//打印所有数据
printf("出队:\n");
while (phead != NULL)//不为空就继续
{
Queue *pout = (Queue *)malloc(sizeof(Queue));
phead = DeQuene(phead, pout);//出队
printf("出队的数据:\n");
printf("%d,%d\n", pout->num, pout->high);
printf("剩下的队列数据:\n");
printfall(phead);
}
system("pause");
}