C语言实现链式队列

<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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveRocket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值