有序链式队列





  1. 编写头文件

struct
queue

{

   
int
num;           
//代表数据

   
int
high;          
//优先级1111

   
struct
queue *pNext;//存储下一个节点的地址

};

typedef 
struct
queue
Queue;                          
//简化队列

Queue
* init(Queue
*queueHead);                       
//初始化

Queue
* EnQueue(Queue
*queueHead,
int
num,
int
high); 
//入队

Queue
* DeQueue(Queue
*queueHead,
Queue *pOut);       
//出队

Queue
* freeall(Queue
*queueHead);                  
//清空

void 
sort(Queue
*queueHead);                         
//优先级排队

void
printfall(Queue
*queueHead);                     
//打印所有数据,递归

Queue *
insertEnQueue(Queue
*queueHead,
int
num,
int
high);

 

  1. 编写实现队列的代码

#include
"Queue.h"

#include
<stdio.h>

#include
<stdlib.h>

 

//初始化

Queue
* init(Queue
*queueHead)

{

   
return
NULL;

}

 

//入队

Queue
* EnQueue(Queue
*queueHead,
int
num,
int
high)

{

   
//分配内存

   
Queue *pnewnode
= (Queue *)malloc(sizeof(Queue));

   
pnewnode->num
= num;

   
pnewnode->high
= high;

   
pnewnode->pNext
= NULL;

 

   
if (queueHead
== NULL)

   
{

       
queueHead =
pnewnode;

   
}

   
else

   
{

       
Queue *p
= queueHead;

       
while (p->pNext
!= NULL)

       
{

           
p =
p->pNext;

       
}

       
//确定要插入的位置

       
//插入,这里是尾部插入

       
p->pNext
= pnewnode;

   
}

   
return
queueHead;

}

 

//出队

Queue
* DeQueue(Queue
*queueHead,
Queue *pOut)

{

   
if (queueHead
== NULL)

   
{

       
return
NULL;

   
}

   
else

   
{

       
//这里相当于是

       
pOut->num
= queueHead->num;

       
pOut->high
= pOut->high;

       
Queue *pTemp
= queueHead;    

       
//记录要删除的地址

       
queueHead =
queueHead->pNext;

       
//释放节点

       
free(pTemp);

 

       
return
queueHead;

   
}

}

 

////优先级排队

//void sort(Queue *queueHead)

//{

// 
if (queueHead == NULL || queueHead->pNext == NULL)

// 
{

//     
return;

// 
}

// 
else

// 
{

//     
for (Queue *p1 = queueHead; p1 != NULL;p1 = p1->pNext)

// 
    {

//         
for (Queue *p2 = queueHead; 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
*queueHead)

{

   
if (queueHead
== NULL)

   
{

       
return;

   
}

   
else

   
{

       
printf("%d,%d,%p,%p\n",
queueHead->num,
queueHead->high,
queueHead,
queueHead->pNext);

       
printfall(queueHead->pNext);

   
}

}

 

Queue
* insertEnQueue(Queue
*queueHead,
int
num,
int
high)

{

   
//分配内存

   
Queue 
*pnewnode = (Queue
*)malloc(sizeof(Queue));

   
pnewnode->num
= num;

   
pnewnode->high
= high;

   
//节点为空

   
if (queueHead
== NULL)

   
{

       
pnewnode->pNext
= NULL;

       
queueHead =
pnewnode;

       
return
queueHead;

   
}

   
else

   
{

       
//头插

   
    if (pnewnode->high
> queueHead->high)

   
    {

           
//头部插入

           
pnewnode->pNext
= queueHead;

           
//指向这个节点

           
queueHead =
pnewnode;

           
return
queueHead;

       
}

       
else

       
{

           
//头节点

           
Queue *p
= queueHead;

           
while (p->pNext
!= NULL)

           
{

               
p =
p->pNext;

           
}

           
//循环到尾部

           
if (pnewnode->high
<= p->high)

           
{

               
p->pNext
= pnewnode;

               
pnewnode->pNext
= NULL;

               
return
queueHead;

           
}

           
else

           
{

               
Queue *p1,
*p2;

               
p1 =
p2 =
NULL; 
//避免野指针

               
p1 =
queueHead; 
//头结点

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

           
}

       
}

   
}

}

 

3.编写主函数

#include
"Queue.h"

#include
<stdio.h>

#include
<stdlib.h>

 

int
main(int
argc,char
*argv[])

{

   
//创建头结点

   
Queue *phead
= NULL;

   
//初始化

   
phead =
init(phead);

   
phead =
insertEnQueue(phead,
1, 1);

   
printfall(phead);

   
phead =
insertEnQueue(phead,
2, 12);

   
printfall(phead);

   
phead =
insertEnQueue(phead,
3, 3);

   
printfall(phead);

   
phead =
insertEnQueue(phead,
4, 14);

   
printfall(phead);

   
phead =
insertEnQueue(phead,
5, 5);

   
printfall(phead);

   
phead =
insertEnQueue(phead,
6, 16);

   
printfall(phead);

   
phead =
insertEnQueue(phead,
6, 0);

   
printfall(phead);

   
phead =
insertEnQueue(phead,
7, 0);

   
printfall(phead);

   
phead =
insertEnQueue(phead,
8, 0);

   
printfall(phead);

   
phead =
insertEnQueue(phead,
9, 1);

   
printfall(phead);

   
phead =
insertEnQueue(phead,
10, 0);

   
printfall(phead);

   
phead =
insertEnQueue(phead,
11, 16);

   
printfall(phead);

   
phead =
insertEnQueue(phead,
111, 19);

   
printfall(phead);

 

   
printf("打印排序后的链式队列:\n");

   
printfall(phead);

 

 

   
getchar();

   
return 0;

}

 

 

 

时间: 2024-09-20 08:56:40

有序链式队列的相关文章

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-1后的示意图: 上图中,a0是当前 队头数据元素,an-1是当前 队尾数据元素. 为了

链式队列的一个问题

问题描述 两个问题求大神解析:1 一个链式队列的队头和队尾指针分别为f和r,则判断对空的条件为----A f != NULL B r != NULL C f == NULL D f == r2 一个带头节点的链式队列的头指针f指向头节点,队尾指针为r,则判断队列为空的条件为------A f != NULL B r != NULL C f == NULL D f == r 解决方案 1. 题目没有说清楚是否带头结点,假设不带头结点,队头队尾指针分别为f和r,则f和r都指向真正的节点,那么f==r

数据结构之自建算法库——链队(链式队列)

本文针对数据结构基础系列网络课程(3):栈和队列中第10课时队列的链式存储结构及其基本运算的实现. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 链队算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:liqueue.h,包含定义链队数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef LIQUEUE_H_INCLUDED #define LIQUEUE_H_INCLUDED typedef char ElemType; typ

链式队列(数据结构C#)

http://hi.baidu.com/bbjjss2008/blog/item/5c8f224572da0921cffca3a3.html

链式队列

QueueNode.h template<typename Type> class LinkQueue; template<typename Type> class QueueNode{ private: friend class LinkQueue<Type>; QueueNode(const Type item,QueueNode<Type> *next=NULL) :m_data(item),m_pnext(next){} private: Type

基本数据结构之队列的链式表示

该队列为链式队列,初建队列时,队头和队尾均指向头结点,头结点中不存放数据,只存放指针,头结点的下一个节点才开始存放数据,这这样做的目的是为了在入队和出队时方便对队列的操作,而不用考虑特殊情况. C语言源代码 #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *pNext; }NODE,*PNODE; typedef struct Queue { PNODE front;

数据结构的C++实现之队列的链式存储结构

队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列.为了操作上的 方便,我们将队头指针指向链队列的头节点,而队尾指针指向终端节点.空队列时,front和rear都指向头节点. 示例程序 :(改变自<大话数据结构>) #include<iostream> using namespace std; typedef int ElemType; typedef struct Node { ElemType data; struct Node *nex

队列的动态链式存储实现代码分享_C 语言

复制代码 代码如下: #include <stdlib.h>#include <malloc.h>#include <memory.h>#include <assert.h>#include "DynaLnkQueue.h" /*------------------------------------------------------------操作目的: 初始化队列初始条件: 无操作结果: 构造一个空的队列函数参数:  LinkQue

PHP实现的链式操作示例代码

这篇文章主要介绍了PHP实现的链式操作实例.写程序的人都喜欢偷懒,希望少打几行代码,并且让代码看起来很酷. 就好比很多小伙伴在写if-else-的时候会直接使用三元运算符一样. 而用过JS的人应该都见识过js中的链式方法.如 somevars.func().func2()-funcN():这样的写法使得代码更简练,并且作用关系一目了然. 那么在php中可以这么做么,显然也是可以的,但是php与js的差别是,在js中变量本身具有对象的性质,但是php的变量却不是. 现在在很多的PHP的WEB框架中