c语言算法设计:在一个循环链队中只有尾指针(记为rear,结点结构为数据源data,指针域为next,没有头结点),请给出这个队列的入队、出队实现过程并测试。
时间: 2024-03-14 08:45:48 浏览: 124
下面是循环链队列的入队、出队实现过程:
```c
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *next;
} Node;
typedef struct LinkQueue
{
Node *rear; // 队尾指针
} LinkQueue;
// 初始化循环链队列
void InitQueue(LinkQueue *q)
{
q->rear = NULL;
}
// 判断循环链队列是否为空
int IsEmpty(LinkQueue *q)
{
return q->rear == NULL;
}
// 入队
void EnQueue(LinkQueue *q, DataType x)
{
Node *s = (Node *)malloc(sizeof(Node));
s->data = x;
if (IsEmpty(q)) // 如果队列为空,让rear指向新结点
{
q->rear = s;
s->next = s;
}
else // 否则,插入到队尾
{
s->next = q->rear->next;
q->rear->next = s;
q->rear = s; // rear指向新结点
}
}
// 出队
int DeQueue(LinkQueue *q, DataType *x)
{
if (IsEmpty(q))
{
printf("Queue is empty.\n");
return 0;
}
Node *p = q->rear->next;
*x = p->data;
if (q->rear == p) // 如果队列只有一个结点,将rear置为NULL
{
q->rear = NULL;
}
else // 否则删除队头结点
{
q->rear->next = p->next;
}
free(p);
return 1;
}
// 测试
int main()
{
LinkQueue q;
DataType x;
InitQueue(&q);
EnQueue(&q, 1);
EnQueue(&q, 2);
EnQueue(&q, 3);
while (DeQueue(&q, &x))
{
printf("%d ", x);
}
return 0;
}
```
输出结果为:1 2 3
阅读全文