
题目分析:
(1):题目中第三点中写到占用的空间刻重复利用,而且空间只增不减,就可以锁定是链式存储了,因为顺序存储用到的数组空间是一开始就规定好的
答案:链式存储
(2):从空间可重复使用可以判断出是个循环队列,又是链式存储的,所以初始状态如下图所示;因为是循环队列,所以需要有一个分割结点来表示每轮循环的结束,rear代表实际存储元素的末尾,rear->next如果是front队首指针指向的位置说明此时队列已经满了

队列为空:front == rear时队列为空
队列为满:rear->next = front队列为满

(3):具体解释过程见第4题(出入队过程)

(4):
入队:链表建立循环队列,入队的时候需要采用尾部插入法;因为题目中写明可以增加空间所以先需要判断队列是否为满;为满是入队先将rear->data进行赋值,然后申请空间放新的结点,连接新结点,最后rear向前走一步(rear = rear->next);不为满就直接赋值然后rear向前走一步;
出队:需要先判断队列不为空,为空的条件就是front == rear;为空直接返回,不为空时需要将front前进一位front = front->next;
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
void EnQueue(LinkList front,LinkList &rear,ElemType x){
if (rear->next = front){
LinkList p_new = (LinkList)malloc(sizeof(LNode));
rear->data = x;
rear->next = p_new;
p_new->next = front;
rear = p_new;
} else{
rear->data = x;
rear = rear->next;
}
}
void DeQueue(LinkList &front,LinkList rear){
if (front == rear){
printf("queue is empty\n");
} else{
printf("DeQueue->data=%d\n",front->data);
front = front->next;
}
}
void CircleQueue(){
LinkList front,rear;
front = rear = (LinkList)malloc(sizeof(LNode));
rear->next = front;
EnQueue(front,rear,3);
EnQueue(front,rear,4);
DeQueue(front,rear);
DeQueue(front,rear);
DeQueue(front,rear);
return;
}
int main() {
CircleQueue();
return 0;
}
746

被折叠的 条评论
为什么被折叠?



