链式队列

/************************************************
*文件名: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");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值