供学习之用,参照他人理解学习
/*
队列先进先出,实际上创建了一个链表,由头指针,尾指针分别指向链表的头和尾,创建完成之后尾指针指向最后,头指针和尾指针操作同“一根”链(表)
1先进队列,也是出对列第一个
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9
4 5 6 7 8 9
5 6 7 8 9
6 7 8 9
7 8 9
8 9
9
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define QElemType int
#define OVERFLOW -1
typedef struct QueueNode{
QElemType data;
struct QueueNode* pNext;
}QueueNode;
typedef struct LinkQueue{
struct QueueNode* front;/*队列头指针*/
struct QueueNode* rear;/*队列尾指针*/
}LinkQueue;
void Init_queue(LinkQueue* pQueue) // the first node is always NULL,recommend the next style
{
pQueue->rear = pQueue->front = (QueueNode*)malloc(sizeof(QueueNode));
if(pQueue->front == NULL)
{
printf("apply for memory failed!\n");
exit(0);
}
pQueue->rear->pNext = NULL;
}
void InitQueue(LinkQueue* pQueue)
{
pQueue->front = pQueue->rear = NULL;
}
void AddQueue(LinkQueue* pQueue,QElemType data)
{
QueueNode* ptr = (QueueNode*)malloc(sizeof(QueueNode));
ptr->data = data;
ptr->pNext = NULL;
if(pQueue->front == NULL)
pQueue->front = pQueue->rear = ptr;
else
{
pQueue->rear->pNext = ptr;
pQueue->rear = ptr;
}
}
void Dequeue(LinkQueue* pQueue)
{
if(pQueue->front == NULL)
{
printf("the queue is empty!\n");
exit(0);
}
printf("dequeue data %d\n",pQueue->front->data);
pQueue->front = pQueue->front->pNext;
}
void DestroyQueue(LinkQueue* pQueue)
{
QueueNode* p = pQueue->front;
while(!p)
{
pQueue->front = pQueue->rear;
free(p);
p = pQueue->front;
}
pQueue->rear = NULL;//free the last node
}
void ShowQueue(LinkQueue* pQueue)
{
QueueNode* p = pQueue->front;
while(p!= NULL)
{
printf("data %d \n",p->data);
p = p->pNext;
}
printf("\n");
}
QElemType LengthQueue(LinkQueue* pQueue)
{
int length = 0;
QueueNode* p = pQueue->front;
while(p != NULL)
{
length++;
p = p->pNext;
}
return length;
}
int main()
{
int i = 0;
LinkQueue pQueue;
InitQueue(&pQueue);
for(i = 0; i < 10; i++)
AddQueue(&pQueue,i);
ShowQueue(&pQueue);
for(i = 0; i < 10; i++){
Dequeue(&pQueue);
printf("Now,the length is %d\n",LengthQueue(&pQueue));
ShowQueue(&pQueue);
}
system("pause");
return 0;
}