1.假设以带头结点的单向循环链表表示队列,并且只设一个指针指向队尾 元素结点(注意:不设头指针),试设计并验证相应的队列初始化、队列判空、入 队列、出队列和遍历队列算法。
时间: 2024-01-14 12:02:42 浏览: 78
假设以带头结点的循环链表表示一个队列,并且只设一个队尾指针指向尾元素结点(注意不设头指针),试写出相应的置空队、入队、出队的算法 (Java)
好的,我来回答你的问题。
首先,我们来设计队列的数据结构:
```c
typedef struct Node {
int data;
struct Node *next;
} Node;
typedef struct Queue {
Node *rear;
} Queue;
```
其中,`Queue` 结构体中只需要一个指针 `rear`,指向队列的尾部元素。
接下来,我们来实现相应的队列操作:
1. 队列初始化:
```c
void initQueue(Queue *queue) {
queue->rear = NULL;
}
```
2. 队列判空:
```c
int isEmpty(Queue *queue) {
return queue->rear == NULL;
}
```
3. 入队列:
```c
void enQueue(Queue *queue, int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
if (isEmpty(queue)) {
queue->rear = newNode;
newNode->next = newNode;
} else {
newNode->next = queue->rear->next;
queue->rear->next = newNode;
queue->rear = newNode;
}
}
```
4. 出队列:
```c
int deQueue(Queue *queue) {
if (isEmpty(queue)) {
printf("Queue is empty!\n");
return -1;
} else {
int data = queue->rear->next->data;
Node *temp = queue->rear->next;
if (queue->rear == temp) {
queue->rear = NULL;
} else {
queue->rear->next = temp->next;
}
free(temp);
return data;
}
}
```
5. 遍历队列:
```c
void traverseQueue(Queue *queue) {
if (isEmpty(queue)) {
printf("Queue is empty!\n");
return;
} else {
Node *temp = queue->rear->next;
do {
printf("%d ", temp->data);
temp = temp->next;
} while (temp != queue->rear->next);
printf("\n");
}
}
```
最后,我们来测试一下这些操作是否正确:
```c
int main() {
Queue queue;
initQueue(&queue);
enQueue(&queue, 1);
enQueue(&queue, 2);
enQueue(&queue, 3);
traverseQueue(&queue);
printf("deQueue: %d\n", deQueue(&queue));
traverseQueue(&queue);
enQueue(&queue, 4);
traverseQueue(&queue);
return 0;
}
```
输出结果为:
```
1 2 3
deQueue: 1
2 3
2 3 4
```
可以看到,队列的操作都是正确的。
阅读全文