#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
using namespace std;
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
typedef int DataType; //类型定义
typedef struct _QueueNode
{
DataType dt;
_QueueNode *next;
}QueueNode;
typedef struct _LinkedQueue
{
QueueNode *first;
QueueNode *rear;
}LinkedQueue;
/*******************************************************************************
* 函数名称:CreateLinkedQueue
* 函数功能:创建一个队列
* 输入参数:无
* 输出参数:无
* 返 回 值: LinkedQueue指针
*******************************************************************************/
LinkedQueue *CreateLinkedQueue(void)
{
LinkedQueue *lq = (LinkedQueue*)malloc(sizeof(LinkedQueue));
lq->first = NULL;
lq->rear = NULL;
return lq;
}
/*******************************************************************************
* 函数名称:AddNodeLinkedQueue
* 函数功能:(入队)在队列尾添加一个节点
* 输入参数:LinkedQueue **lq,
DataType dt
* 输出参数:无
* 返 回 值: >0 入队成功
<0 入队失败
*******************************************************************************/
int AddNodeLinkedQueue(LinkedQueue **lq, DataType dt)
{
if(NULL == *lq)
return -1;
if(NULL == (*lq)->first)
{
QueueNode *qn = (QueueNode*)malloc(sizeof(QueueNode));
qn->next = NULL;
memcpy((uint8 *)&(qn->dt),(uint8 *)&dt, sizeof(DataType));
(*lq)->first = qn;
(*lq)->rear = qn;
return 1;
}
QueueNode *qn = (QueueNode*)malloc(sizeof(QueueNode));
qn->next = NULL;
memcpy((uint8 *)&(qn->dt),(uint8 *)&dt, sizeof(DataType));
qn->next = (*lq)->rear;
(*lq)->rear = qn;
return 2;
}
/*******************************************************************************
* 函数名称:VisitAllNodeLinkedQueue
* 函数功能:遍历整个队列
* 输入参数:LinkedQueue *lq
* 输出参数:无
* 返 回 值: 无
*******************************************************************************/
void VisitAllNodeLinkedQueue(LinkedQueue *lq)
{
if(NULL == lq)
return;
QueueNode *qn = lq->rear;
printf("[");
while(NULL != qn)
{
printf("%d",qn->dt);
qn = qn->next;
if(NULL != qn)
printf(",");
}
printf("]\n");
}
/*******************************************************************************
* 函数名称:GetRearLinkedQueue
* 函数功能:取得队尾,但不删除节点
* 输入参数:LinkedQueue *lq
* 输出参数:QueueNode **node
* 返 回 值: >0成功,<0失败
*******************************************************************************/
int GetRearLinkedQueue(LinkedQueue *lq, QueueNode **node)
{
if(NULL == lq || NULL == lq->rear)
return -1;
*node = lq->rear;
return 1;
}
/*******************************************************************************
* 函数名称:GetFirstLinkedQueue
* 函数功能:取得队头,但不删除节点
* 输入参数:LinkedQueue *lq
* 输出参数:QueueNode **node
* 返 回 值: >0成功,<0失败
*******************************************************************************/
int GetFirstLinkedQueue(LinkedQueue *lq, QueueNode **node)
{
if(NULL == lq || NULL == lq->rear)
return -1;
*node = lq->first;
return 1;
}
/*******************************************************************************
* 函数名称:RemoveFirstLinkedQueue
* 函数功能:出队,删除节点
* 输入参数:LinkedQueue **lq
* 输出参数:LinkedQueue **lq
* 返 回 值: >0 出队成功
<0 出队失败
*******************************************************************************/
int RemoveFirstLinkedQueue(LinkedQueue **lq)
{
if(NULL == (*lq) || NULL == (*lq)->rear)
return -1;
QueueNode *pre_node = (*lq)->rear;
QueueNode *curr_node = (*lq)->rear;
QueueNode *head_node = (*lq)->rear;
while(NULL != curr_node->next)
{
pre_node = curr_node;
curr_node = curr_node->next;
}
if(pre_node == curr_node)
{
memset((uint8 *)&(curr_node->dt), 0x00, sizeof(DataType));
free(curr_node);
curr_node = NULL;
(*lq)->rear = NULL;
(*lq)->first = NULL;
return 1;
}
memset((uint8 *)&(curr_node), 0x00, sizeof(DataType));
free(curr_node);
curr_node = NULL;
(*lq)->first = pre_node;
(*lq)->first->next = NULL;
return 2;
}
/*******************************************************************************
* 函数名称:GetLenLinkedQueue
* 函数功能:取得队列长度
* 输入参数:LinkedQueue **lq
* 输出参数:无
* 返 回 值: 长度
*******************************************************************************/
int GetLenLinkedQueue(LinkedQueue *lq)
{
if(NULL == lq || NULL == lq->rear)
return 0;
QueueNode *qn = lq->rear;
int len = 0;
while(NULL != qn)
{
qn = qn->next;
len++;
}
return len;
}
int main()
{
LinkedQueue *lq = CreateLinkedQueue();
QueueNode *qn = NULL;
AddNodeLinkedQueue(&lq, 1);
AddNodeLinkedQueue(&lq, 2);
//AddNodeLinkedQueue(&lq, 3);
//AddNodeLinkedQueue(&lq, 4);
VisitAllNodeLinkedQueue(lq);
printf("queue first: %d\n",GetFirstLinkedQueue(lq,&qn)>0?qn->dt:-1);
printf("queue rear: %d\n",GetRearLinkedQueue(lq,&qn)>0?qn->dt:-1);
RemoveFirstLinkedQueue(&lq);
VisitAllNodeLinkedQueue(lq);
printf("queue first: %d\n",GetFirstLinkedQueue(lq,&qn)>0?qn->dt:-1);
printf("queue rear: %d\n",GetRearLinkedQueue(lq,&qn)>0?qn->dt:-1);
printf("queue len : %d\n",GetLenLinkedQueue(lq));
return 1;
}