- 创建头结点,初始化。
- 入队。
- 出队。
- 取队头元素。
- 遍历。
注:1.根据队列的入队,出队规则,设置头结点便于实现出队操作;
2.头指针front始终指向头结点,尾指针rear指向队列最后一个元素,length用于记录队列中元素个数,遍历操作会用到length。
#include <stdio.h>
#include <stdlib.h>
typedef int dataType;
typedef struct Node
{
dataType data;
struct Node *next;
}QueueNode;
typedef struct
{
QueueNode *front;
QueueNode *rear;
int length;
}LinkQueue;
int create(LinkQueue *q)
{
q->front=q->rear=(QueueNode *)malloc(sizeof(QueueNode));
q->front->next=NULL;
q->front->data=0;
q->length=0;
return;
}
int push_in(LinkQueue *q,dataType value)
{
QueueNode *p;
p=(QueueNode *)malloc(sizeof(QueueNode));
p->data=value;
p->next=NULL;
q->length++;
q->rear->next=p;
q->rear=p;
return;
}
int pop_out(LinkQueue *q,dataType *value)
{
QueueNode *p;
if(q->front->next==NULL)
{
printf("LinkQueue is Empty!\n");
return;
}
p=q->front->next;
*value=p->data;
q->front->next=p->next;
q->length--;
printf("Pop Element is %d.\n",*value);
free(p);
return;
}
dataType getHead(LinkQueue *q)
{
if(q->front->next==NULL)
{
printf("LinkQueue is Empty!\n");
return;
}
return(q->front->next->data); //q->front指向头结点,头结点的next才指向第一个元素的结点
}
int traverse(LinkQueue *q)
{
QueueNode *p;
int i;
if(q->front->next==NULL)
{
printf("LinkQueue is Empty!\n");
return;
}
p=q->front->next;
printf("Head -> ");
for(i=0;i<q->length;i++)
{
printf("%d -> ",p->data);
p=p->next;
}
printf("NULL\n");
return;
}
int main()
{
LinkQueue q;
int i;
dataType value;
create(&q);
for(i=1;i<10;i++)
push_in(&q,i);
traverse(&q);
printf("\n");
for(i=1;i<10;i++)
{
pop_out(&q,&value);
printf("First Element is %d.\n",getHead(&q));
traverse(&q);
printf("\n");
}
return 0;
}
执行结果: