链队的操作包括初始化、入队、出队、取队头元素。下面是实现代码:
初始化之前,还是预定义:
#define OK 1
#define ERROR 0
#define OVEFLOW -2
typedef int Status;
typedef intElemType;
typedef structQNode{
ElemType data;
QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
初始化:
Status InitQueue(LinkQueue*Q)
{
Q->front = (QNode *)malloc(sizeof(QNode));
if (!Q->front)
exit(OVERFLOW);
Q->rear = Q->front;
Q->front->next = NULL;
return OK;
}
先为Q->front动态分配空间,之后检查是否分配成功,如果不成功就直接退出(个人觉得在实际操作中返回错误会更加友好一点);如果分配成功,让Q->rear指向Q->front,表示此时队列为空队。最后让Q->front->next即Q->front的指针域为空。
入队:
Status EnQueue(LinkQueue *Q,ElemType e)
{
QueuePtr p;
p = (QNode *)malloc(sizeof(QNode));
if (!p)
return ERROR;
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = Q->rear->next;
return OK;
}
先声明一个QueuePtr类型指针p,并为其动态分配空间。检测是否分配成功,如果不成功返回错误;如果成功,将e的值赋值给p->data,让p->next为NULL。为了让p称为队列的队尾,先把p赋值给Q->rear->next,然后让Q->rear指向p所指向的元素。
出队:
Status DeQueue(LinkQueue *Q,ElemType *e)
{
QueuePtr p;
if (Q->rear == Q->front)
return ERROR;
p = Q->front->next;
*e = p->data;
Q->front->next = p->next;
if (p == Q->rear)
Q->rear = Q->front;
free(p);
return OK;
}
声明一个QueuePtr类型指针p,检测队列是否为空队,如果为空队,返回错误。让p指向Q->front->next,并且用*e保存即将出队的元素的值。将p->next赋值给Q->front->next,使Q->front和p->next指向的元素连接起来。检查p是不是队尾元素,如果是,让队尾Q->rear指针指向Q->front队头指针。释放p。
取队头元素:
ElemType GetHead(LinkQueueQ)
{
if (Q.rear == Q.front)
return ERROR;
return Q.front->next->data;
}
检查是否为空队,如果是,返回错误;如果不是,返回队头第一个元素的data。
加入main()测试:
int main(void)
{
LinkQueue Q;
ElemType e;
int n;
if (InitQueue(&Q) == OK)
printf("初始化成功!\n");
printf("1.入队\n2.出队\n3.取队头元素\n4.退出\n");
while (1)
{
printf("请选择:");
scanf("%d", &n);
switch (n)
{
case 1:
printf("输入你要插入的元素:");
scanf("%d", &e);
if (EnQueue(&Q, e) == OK)
printf("插入成功!\n");
else
printf("插入失败!\n");
break;
case 2:
if (DeQueue(&Q, &e) == OK)
printf("%d已经出队。\n",e);
else
printf("出队失败!\n");
break;
case 3:
printf("%d是队头元素。\n",GetHead(Q));
break;
case 4:
exit(0);
}
}
return 0;
}