C语言 复杂队列(链表队列)
//复杂的队列二 --链表队列 #include<stdio.h>
#include<stdlib.h> #define datatype int struct queuelink{
datatype data;//数据
int high;//优先级
struct queuelink *pnext;//下一节点的指针
}; typedef struct queuelink QueueLink;
//链表队列,容量无限大 //清空队列
QueueLink * chearQueueLink(QueueLink *pql);
//入队
QueueLink * enQueueLink(QueueLink *pql, datatype data1, int high1);
//优先级入队(本质上还是链表排序--插入排序练习)
QueueLink * enPriorityQueueLink(QueueLink *pql, datatype data1, int high1);
//出队
QueueLink * deQueueLink(QueueLink *pql, QueueLink *pout);
//打印队列
void printfQueueLink(QueueLink *pql);
//同等优先级排序
QueueLink * samePriority(QueueLink *pql); void main(){
QueueLink * pql = NULL;
//入队
pql = enPriorityQueueLink(pql, , );
pql = enPriorityQueueLink(pql, , );
pql = enPriorityQueueLink(pql, , );
pql = enPriorityQueueLink(pql, , );
pql = enPriorityQueueLink(pql, , );
pql = enPriorityQueueLink(pql, , );
//打印元素
printfQueueLink(pql);
//出队
printf("\n-------------出队------------------\n");
QueueLink * pout = (QueueLink *)malloc(sizeof(QueueLink));
pql = deQueueLink(pql, pout);
printf("出队的元素是data=%d;high=%d\n",pout->data,pout->high);
pql=chearQueueLink(pql);
//打印元素
printfQueueLink(pql); system("pause");
} //入队
QueueLink * enQueueLink(QueueLink *pql, datatype data1, int high1){
//创建一个链表元素
QueueLink * p1 = (QueueLink *)malloc(sizeof(QueueLink));
QueueLink * p2 = pql;
p1->data = data1;
p1->high = high1;
p1->pnext = NULL;
//先判断队列是否为空
if (pql == NULL)
{
pql = p1;
}
else{
//遍历链表
while (p2->pnext != NULL){
p2 = p2->pnext;
}
p2->pnext = p1;
}
return pql;
} //优先级入队(本质上还是链表排序)
QueueLink * enPriorityQueueLink(QueueLink *pql, datatype data1, int high1){
//创建一个链表元素
QueueLink * p1 = (QueueLink *)malloc(sizeof(QueueLink));
p1->data = data1;
p1->high = high1;
p1->pnext = NULL;
QueueLink * p2 = pql;
QueueLink * p3 = pql;
//优先级队列,入队的时候必须进行排序
//优先级队列,首先必须先按照high优先级来分
//这里采用插入排序
//判断队列是否为空
int temp = ;
if (pql==NULL)
{
pql = p1;
return pql;
}
else{
//队列不为空
while (p2!=NULL){
//此时的队列是一个有序队列,所以只要找到比p1大的元素p2,
//在p2前面插入p1就可以了
if (p1->high<p2->high)
{
//对于p1->high<p2->high的解释:对于链表一般而言,我们要找到比p1大的元素p2,将p1插在p2的前面,
//其实必须要找到p2的前一个元素p3,那么通常写法是p1->high<p2->pnext->high,
//p2->pnext就是比p1大的那个元素,但是这么写有个问题,无法将p1与头指针相比较
//所以我用p2存储比p1大的元素,再通过循环找到p2的前一个元素
break;
}
p2 = p2->pnext;
}
if (p2==pql)
{
//说明p1的优先级比头结点小
//将p1插到最前面
p1->pnext = pql;
pql = p1; }
//在这里不用考虑p1的优先级比所有节点都大的情况,因为p1比所有节点都大,那p2==NULL
//p3->pnext==NULL
//此时的p3正好就是最后一个节点---p3->pnext = p1;
else{
//说明p1的优先级比头结点大
while (p3!=NULL){
if (p3->pnext==p2)
{
temp = ;
//此时p3就是p2的前一个节点
break;
}
p3 = p3->pnext;
}
}
//当temp==1时,p3就是p2的前一个节点
if (temp==)
{
p3->pnext = p1;
p1->pnext = p2;
}
return pql;
}
} //优先级出队
QueueLink * deQueueLink(QueueLink *pql, QueueLink *pout){
QueueLink * p = NULL;
if (pql == NULL)
{
return NULL;
}
else{
if (pql->pnext == NULL)
{
pout->data = pql->data;
pout->high = pql->high;
pout->pnext = NULL;
//释放元素
free(pql);
return NULL;
}
else{
//出队第一个元素
p = pql->pnext;
pout->data = pql->data;
pout->high = pql->high;
pout->pnext = NULL;
//释放元素
free(pql);
pql = p;
return pql;
}
}
} //递归打印队列
void printfQueueLink(QueueLink *pql){
if (pql==NULL)
{
return;
}
else{
printf("data=%d;hogh=%d\n", pql->data, pql->high);
printfQueueLink(pql->pnext);
}
} //清空队列
QueueLink * chearQueueLink(QueueLink *pql){
QueueLink *p = pql;
QueueLink *p1 = NULL;
while (p->pnext!=NULL){
p1 = p->pnext;
p->pnext = p1->pnext;
free(p1);
printfQueueLink(pql);
printf("\n--------------------\n");
}
//删除头结点指针
free(p);
return NULL;
}

C语言 复杂队列(链表队列)的更多相关文章
- 数据结构:C_链表队列的实现
数据结构链表形式队列的实现(C语言版) 1.写在前面 队列是一种和栈相反的,遵循先进先出原则的线性表. 本代码是严蔚敏教授的数据结构书上面的伪代码的C语言实现代码. 分解代码没有包含在内的代码如下: ...
- C语言实现链式队列
链式队列,简称"链队列",即使用链表实现的队列存储结构. 链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素, ...
- 基于Python语言使用RabbitMQ消息队列(一)
介绍 RabbitMQ 是一个消息中间人(broker): 它接收并且发送消息. 你可以把它想象成一个邮局: 当你把想要寄出的信放到邮筒里时, 你可以确定邮递员会把信件送到收信人那里. 在这个比喻中, ...
- java:数据结构复习(三)链表队列
@TOC 和栈一样,队列也是表,但是使用队列的特点是先进先出. 队列模型 队列的基本操作是入队,它是在表的末端插入一个元素,和出队,它是删除在表开头的一个元素 graph LR A[<kbd&g ...
- java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue
LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...
- Java并发编程原理与实战三十六:阻塞队列&消息队列
一.阻塞队列 1.阻塞队列BlockingQueue ---->可以理解成生产者消费者的模式---->消费者要等待到生产者生产出来产品.---->而非阻塞队列ConcurrentLi ...
- 《数据结构与算法之美》 <07>队列:队列在线程池等有限资源池中的应用?
我们知道,CPU 资源是有限的,任务的处理速度与线程个数并不是线性正相关.相反,过多的线程反而会导致 CPU 频繁切换,处理性能下降.所以,线程池的大小一般都是综合考虑要处理任务的特点和硬件环境,来事 ...
- javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例
1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispa ...
随机推荐
- 让 Popwindow 向上弹出
/** * 获取父控件的位置y-popwindow的高度 = 应该显示的y坐标. x这里设置为center 不刻意指定坐标 注意:控件坐标永远是 左上角坐标! * * @param parent */ ...
- 【转】一个非常常见但容易被忽略的c++问题——用IPML模式可以解决
pimpl (the pointer-to-implementation idiom)手法在 C++ 里已是“高手”们广泛运用的成熟方法之一,它的优点很多,诸如降低编译依赖.提高重编译速度之类的工具性 ...
- 自定义组件 -- android联系人
在android开发中,常常有联系人页面,在这篇和大家分享一下项目中刚刚添加的联系人页面,代码直接从项目中提取出来,没有太多时间修改:使用 StickyListHeaders-master 开源项目及 ...
- Runtime 方法替换 和 动态添加实例方法 结合使用
前言: 方法替换,可以替换任意外部类的方法,而动态添加方法只能实现在被添加类创建的对象里,但是将方法替换和动态添加方法结合使用,可以实现,对任意外部类动态添加需要的方法,这个方法可以是类方法也可以是实 ...
- iOS中倒计时
方法一:使用NSTimer来实现(比较适用于发送短信验证码倒计时) 主要是利用NSTimer的scheduledTimerWithTimeInterval方法来每秒执行一次changeTime方法 / ...
- C# 3个线程A B C 依次打印123123123..
C#经典面试题: 有3个线程,A线程打印1,B线程打印2,C线程打印3,请用程序实现依次打印123123123... class Program { static void Main(string[] ...
- [eclipse]改项目名称后tomcat连接问题解决方法
背景:在我们使用eclipse进行项目开发时,有时候会需要修改项目名称,当改动项目名称后发现tomcat启动访问出现问题,使用新的项目名称不可行,使用旧的项目名称却可以.修改web.xml里面的dis ...
- 异常处理——毕向东Java基础教程学习笔记
1.异常:就是程序运行过程中出现的不正常情况. 异常的由来:问题本身也是日常生活中一个具体的事物,也可以通过java类的形式进行描述,并封装成对象. 其实 ...
- Effective Java 03 Enforce the singleton property with a private constructor or an enum type
Principle When implement the singleton pattern please decorate the INSTANCE field with "static ...
- Linux Shell 05 位置变量(命令行参数)
在Linux shell 脚本中可能会用到一些命令行参数,常见如下: $0:脚本名称 $#:执行脚本时传入的参数个数,不包括脚本名称 $@:所有参数 $*:所有参数 $1...$9:第1个参数.... ...