直接看代码吧。嘿嘿~
/*
** File name: LinkPriorityQueue.h
** Author: ZhouFeng
** Date: 2012/03/30
** LPQ -- LinkPriorityQueue
*/
#ifndef LINK_PRIORITY_QUEUE_H
#define LINK_PRIORITY_QUEUE_H
#define ERROR 0
#define SUCCESS 1
#define BOOL int
#define TRUE 1
#define FALSE 0
typedef int EleDataType;
typedef struct EleType
{
EleDataType data;
int nPriority;
}EleType;
typedef struct LPQNode
{
EleType eleData;
struct LPQNode *pNext;
}LPQNode;
typedef struct LinkPriorityQueue
{
int nCount;
struct LPQNode *pRear;
struct LPQNode *pFront;
}LinkPriorityQueue, *PLPQ;
void InitLPQ(PLPQ *pLPQAddr);
BOOL IsLPQEmpty(PLPQ pLPQ);
/* et -- EleType varible. */
int LPQAppend(PLPQ pLPQ, EleType et);
int LPQDelete(PLPQ pLPQ, EleType *et);
int GetLPQ(PLPQ pLPQ, EleType *et);
void FreeLPQ(PLPQ *pLPQ);
#endif
/*
** File name: LinkPriorityQueue.c
** Author: ZhouFeng
** Date: 2012/03/30
** LPQ operation definition.
*/
#include <stddef.h>
#include <stdlib.h>
#include "LinkPriorityQueue.h"
void InitLPQ(PLPQ *pLPQAddr)
{
*pLPQAddr = (PLPQ)malloc(sizeof(LinkPriorityQueue));
(*pLPQAddr)->pRear = NULL;
(*pLPQAddr)->pFront = NULL;
(*pLPQAddr)->nCount = 0;
}
BOOL IsLPQEmpty(PLPQ pLPQ)
{
if(pLPQ == NULL)
{
return TRUE;
}
if(pLPQ->nCount == 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
int LPQAppend(PLPQ pLPQ, EleType et)
{
LPQNode *pNewLPQNode;
if(pLPQ == NULL)
{
return ERROR;
}
pNewLPQNode = (LPQNode*)malloc(sizeof(LPQNode));
pNewLPQNode->eleData.data =et.data;
pNewLPQNode->eleData.nPriority = et.nPriority;
pNewLPQNode->pNext = NULL;
if(pLPQ->pRear != NULL)
{
pLPQ->pRear->pNext = pNewLPQNode;
}
pLPQ->pRear = pNewLPQNode;
if(pLPQ->pFront == NULL)
{
pLPQ->pFront = pNewLPQNode;
}
++(pLPQ->nCount);
return SUCCESS;
}
int LPQDelete(PLPQ pLPQ, EleType *et)
{
LPQNode *pIterator;
int nMaxPriority;
LPQNode *pMaxPriority, *pPrious, *pMaxPrious;
if(pLPQ == NULL || IsLPQEmpty(pLPQ) || et == NULL)
{
return ERROR;
}
/*
** Find the Max Priority Node.
*/
/* Set the max-priority node pointer. */
pMaxPriority = pLPQ->pFront;
/* Set the front of max-priority node pointer and prious pointer. */
pPrious = pMaxPrious = pLPQ->pFront;
pIterator = pMaxPriority->pNext;
/* Init the Max priority number. */
nMaxPriority = pMaxPriority->eleData.nPriority;
while(pIterator != NULL)
{
if(nMaxPriority > pIterator->eleData.nPriority)
{
nMaxPriority = pIterator->eleData.nPriority;
/* Save the Max-Priority node pointer. */
pMaxPriority = pIterator;
/* Save the Prious pointer. */
pMaxPrious = pPrious;
}
pPrious = pIterator;
pIterator = pIterator->pNext;
}
(*et).data = pMaxPriority->eleData.data;
(*et).nPriority = pMaxPriority->eleData.nPriority;
/* Check the pMaxPriority has changed. */
if(pMaxPriority != pLPQ->pFront)
{
/* pFront needn't changed. */
pMaxPrious->pNext = pMaxPriority->pNext;
}
else
{
/* pFront changed. */
pLPQ->pFront = pLPQ->pFront->pNext;
}
free(pMaxPriority);
--(pLPQ->nCount);
return SUCCESS;
}
int GetLPQ(PLPQ pLPQ, EleType *et)
{
LPQNode *pIterator;
int nMaxPriority;
LPQNode *pMaxPriority, *pPrious, *pMaxPrious;
if(pLPQ == NULL || IsLPQEmpty(pLPQ) || et == NULL)
{
return ERROR;
}
/* Find the Max Priority Node. */
pMaxPriority = pLPQ->pFront;
pPrious = pMaxPrious = pLPQ->pFront;
pIterator = pMaxPriority->pNext;
nMaxPriority = pLPQ->pFront->eleData.nPriority;
while(pIterator != NULL)
{
if(nMaxPriority > pIterator->eleData.nPriority)
{
nMaxPriority = pIterator->eleData.nPriority;
pMaxPriority = pIterator;
pMaxPrious = pPrious;
}
pPrious = pIterator;
pIterator = pIterator->pNext;
}
(*et).data = pMaxPriority->eleData.data;
(*et).nPriority = pMaxPriority->eleData.nPriority;
return SUCCESS;
}
void FreeLPQ(PLPQ *pLPQ)
{
LPQNode *pIterator, *pTemp;
pIterator = (*pLPQ)->pFront;
while(pIterator != NULL)
{
pTemp = pIterator;
pIterator = pIterator->pNext;
free(pTemp);
}
*pLPQ = NULL;
}
测试程序:
#include <stdio.h>
#include "LinkPriorityQueue.h"
#define TEST_SIZE 10
int main(int argc, char *argv[])
{
EleType et;
LinkPriorityQueue *pLPQ;
int i = 0;
InitLPQ(&pLPQ);
printf("[Original]\nPriority Data\n");
printf("-------- ----\n");
for(i = 0; i < TEST_SIZE / 2; ++i)
{
et.data = i;
et.nPriority = i;
LPQAppend(pLPQ, et);
printf("%5d%10d\n", et.nPriority, et.data);
}
for(i = TEST_SIZE / 2; i < TEST_SIZE; ++i)
{
et.data = i;
et.nPriority = i % (TEST_SIZE / 2);
printf("%5d%10d\n", et.nPriority, et.data);
LPQAppend(pLPQ, et);
}
/* Get the Max Priority Data. */
GetLPQ(pLPQ, &et);
printf("The max-priority is %d, data=%d.\n", et.nPriority, et.data);
printf("Priority Data\n");
printf("-------- ----\n");
while(LPQDelete(pLPQ, &et) == SUCCESS)
{
printf("%5d%10d\n", et.nPriority, et.data);
}
FreeLPQ(&pLPQ);
return 0;
}
输出截图:
分享到:
相关推荐
10.链式队列以及优先级队列应用.ppt
实验一——链式结构实现线性表.doc
该文件包括堆栈的头文件(Seq开头)和链表的头文件(Lin开头),另外还实现了十进制转化为八进制、对称串判断和带头结点的单循环链表实现链式队列
编写一个数组,利用链式 不是顺序的 实现元素 排序 查找 插入等!
该文件实现链式队列功能,包含队列的创建queucreat、入队add与出队output,并通过打印显示函数的执行效果。
JAVA语言实现数据的链式结构 分享下挣挣人气
本程序共设计了单链表上多项式相加需要的的6个基本操作运算,分别是链式队列的入队,出队,遍历,长度,取队头,以及销毁队列操作。附带实验报告。
链式循环队列.cpp
java队列实现(顺序队列、链式队列、循环队列)
链式队列
顺序队列和链式队列的实现
顺序循环队列和链式队列的类定义和实现(C++).docx顺序循环队列和链式队列的类定义和实现(C++).docx
数据结构链式队列源代码,c语言,能运行,与课本相符
里面包含了c文件和exe文件,基本操作为:1:初始化链队列2:销毁链队列3:清空链队列4:链队列是否为空5:返回链队列头元素6:元素入队7:元素出队8:当前链队列长度
链式队列的简单实现,含有如下功能 1.创建队列; 2.销毁队列; 3.清空队列; 4.进队列; 5.出队列; 6.获取队头元素; 7.获取队列的长度。
链式队列c++模版实现,功能:创建,删除,出入队,修改元素,包含测试代码。
使用链表实现的队列 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材
严蔚敏-数据结构链式队列c++实现 还不错哦!
链式队列的表示和实现源码,包括队列初始化,添加元素、删除元素等操作。
数据结构中队列源程序: 顺序队列.c 顺序循环队列.c 链式队列.c