#include<stdio.h>
#include<stdlib.h>typedef int QElemType;
typedef struct QNode //链结点
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;typedef struct
{
QueuePtr front; //队头指针 (队头出元素)
QueuePtr rear; //队尾指针 (队尾进元素)
}LinkQueue;void InitQueue(LinkQueue *Q)
{
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q->front)
{
exit(0);
}
Q->front->next = NULL;
}void EnQueue(LinkQueue *Q, QElemType e) //元素进入队列
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
{
exit(0);
}
p->data = e;p->next = NULL; //队尾进入,p变为队尾元素
Q->rear->next = p; //原Q->rear->next == NULL;
Q->rear = p;
}void DeQueue(LinkQueue *Q, QElemType *e) //元素出队列
{
QueuePtr p;if(Q->front == Q->rear)
{
exit(0);
}p = Q->front->next; //队头删除,队头得下一位置才是第一个元素的位置
*e = p->data;Q->front->next = p->next;
if(Q->rear == p)
{
Q->rear = Q->front; //队尾指针指向的位置有元素,但删除了队尾元素后,队尾指针也就丢失了,所以要重新赋值!而队头指针无元素
}free(p);
}void DestroyQueue(LinkQueue *Q) //销毁队列
{
while(!Q->front)
{
Q->rear = Q->front->next; //需好好注意
free(Q->front);
Q->front = Q->rear;
}
}
int QueueEmpty(LinkQueue Q)
{
if(Q.rear == Q.front)
{
return 1;
}
return 0;
}int QueueLength(LinkQueue Q)
{
QueuePtr p;
int i = 0;
while(Q.rear != Q.front)
{
p = Q.front->next;
Q.front = p;
++i;
}
return i;
}void GetHead(LinkQueue Q,QElemType *e)
{
*e = Q.front->next->data;
}
void main(void)
{
LinkQueue *Q;Q = NULL;
Q = (LinkQueue *)malloc(sizeof(LinkQueue));
InitQueue(Q);
EnQueue(Q,2);
EnQueue(Q,5);printf("%d\n",QueueLength(*Q));
}
第三章(3).链队列
最新推荐文章于 2022-03-27 21:32:27 发布