链式队列需要有队头指针和队尾指针才能唯一确定一个队列,头指针一般指向头结点,尾指针指向最后一个元素结点。空的队列就是队头指针和队尾指针都指向了头结点。在可以确地长度最大值时采用循环队列,无法估计长度的时候用链式队列。
结构定义
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
//对头和队尾指针
QueuePtr front,rear;
}LinkQueue;
操作函数
//初始化
Status InitQueue(LinkQueue *Q){
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q->front) exit(OVERFLOW);
Q->front->next = NULL;
return OK;
}
//销毁队列
Status DestroyQueue(LinkQueue *Q){
while(Q->front){
Q->rear = Q->front->next;
free(Q->front);
Q->front = Q->rear;
}
return OK;
}
//插入元素e到队尾
Status EnQueue(LinkQueue *Q,QElemType e){
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return OK;
}
//出队列
Status DeQueue(LinkQueue *Q,QElemType *e){
if(Q->front == Q->rear) return ERROR;
QueuePtr p = Q->front->next;
*e = p->data;
Q->front->next = p->next;
//当队列中最后一个元素被删除了,队列尾指针也丢失了
//因此需要对队尾指针重新赋值
if(Q->rear == p) Q->rear = Q->front;
free(p);
return OK;
}
Status OutputQueue(LinkQueue Q){
QueuePtr p = Q.front->next;
while(p){
printf("元素的值是:%d\n",p->data);
p = p->next;
}
}
Main函数
int main() {
LinkQueue Q;
InitQueue(&Q);
int x,i;
QElemType e;
printf("请输入要入队列几个数:");
scanf("%d",&x);
for (i = 0; i < x; ++i) {
printf("请输入要入队列元素值:");
scanf("%d",&e);
EnQueue(&Q,e);
}
DeQueue(&Q,&e);
DeQueue(&Q,&e);
OutputQueue(Q);
return 0;
}