https://blog.csdn.net/xy010902100449/article/details/46563643
数据结构和算法
【摘要】前一篇博客主要讨论循环队列,但是循环队列都是事先申请好空间,使用期间是不能释放的。但是链队列,每次都可以进行申请和释放结点。再无法预估队列长度的时候,我们可以考虑用链队列。
(1)设计队列数据结构
/*结点结构*/
typedef struct _QUEUE_NODE
{
int pData;
struct _QUEUE_NODE *next;
}QUEUE_NODE,*QUEUEPtr;
/*队列的链表结构*/
typedef struct LinkQueue
{
QUEUEPtr head;
QUEUEPtr tail;
int count;
}LinkQueue;
(2) 初始化队列
STATUS init_queue(LinkQueue* pQueueNode)
{
pQueueNode->head = (QueuePtr)malloc(sizeof(QUEUE_NODE)); // 生成头结点
if(!pQueueNode->head) // 生成头结点失败
return FALSE;
pQueueNode->tail = pQueueNode->head;
pQueueNode->head->next=NULL; // 头结点的next域为空
pQueueNode->count = 0;
return TRUE;
}
(3) 把数据压入队列
STATUS insert_queue(LinkQueue* pQueueNode, int value)
{
QUEUEPtr s = (QUEUEPtr)malloc(sizeof(QUEUE_NODE));
if(NULL == s)
return FALSE;
s->data = value;
s->next = NULL;
pQueueNode->tail->next = s;
pQueueNode->tail = s; //队尾指针位置
pQueueNode->count ++;
return TRUE;
}
(4)把数据弹出队列
STATUS get_queue_data(LinkQueue* pQueueNode, int* value)
{
QUEUEPtr s = NULL;
if(NULL == pQueueNode || NULL == value || pQueueNode->head == pQueueNode->tail)
return FALSE;
if(0 == pQueueNode->count)
return FALSE;
*value = pQueueNode->head; //返回值
s = pQueueNode->head; //保存下来
pQueueNode->head = s->next;//重新赋值头指针
/*
带头结点的队列
s = pQueueNode->head->next; //保存下来
pQueueNode->head = s->next;//重新赋值头指针
if(pQueueNode->tail==s) //队头就是队尾
{
pQueueNode->tail = pQueueNode->head
}
*/
free(s);
s = NULL;
pQueueNode-> count--;
return TRUE;
}
(5)统计当前队列中有多少数据
int get_total_number(const LinkQueue* pQueueNode)
{
if(NULL == pQueueNode)
return 0;
return pQueueNode->count;
}