假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点,试用c语言编写相应的队列初始化,入队列和出队列算法
时间: 2024-04-21 08:06:06 浏览: 104
C语言使用非循环双向链表实现队列
队列初始化算法:
```c
void InitQueue(LinkQueue *Q)
{
Q->rear = (QueuePtr)malloc(sizeof(QNode)); //创建头结点
if (!Q->rear) exit(OVERFLOW);
Q->rear->next = Q->rear; //指向自己,表示空队列
}
```
入队列算法:
```c
void EnQueue(LinkQueue *Q, QElemType e)
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); //创建新结点
if (!p) exit(OVERFLOW);
p->data = e;
p->next = Q->rear->next; //新结点指向头结点
Q->rear->next = p; //队尾结点指向新结点
Q->rear = p; //队尾指针指向新结点
}
```
出队列算法:
```c
Status DeQueue(LinkQueue *Q, QElemType *e)
{
if (Q->rear->next == Q->rear) return ERROR; //空队列
QueuePtr p = Q->rear->next->next; //头结点的下一个结点
*e = p->data;
Q->rear->next->next = p->next; //删除头结点的下一个结点
if (Q->rear == p) Q->rear = Q->rear->next; //如果删除的是队尾结点,更新队尾指针
free(p);
return OK;
}
```
阅读全文