队列的两种表示
分别使用数组法和单链表法
数组法需要注意添加元素时,头指针的限制条件
Q->rear = (Q->rear+1) % MAX_SIZE
包括判断队列是否满,也需要用此式与Q->front
判断是否相等
#include <stdio.h>
#include <malloc.h>
#define MAX_SIZE 100
typedef int elemType;
typedef struct QNode *queue;
struct QNode{
elemType data[MAX_SIZE];
int front;
int rear;
};
queue createQueue();
void addQueue(queue Q,elemType x);
int isFull(queue Q);
elemType deleteQueue(queue Q);
int isEmpty(queue Q);
queue createQueue()
{
queue Q;
Q = (queue)malloc(sizeof(struct QNode));
Q->front = -1;
Q->rear = -1;
return Q;
}
int isFull(queue Q)
{
return ((Q->rear+1)% MAX_SIZE == Q->front);
}
int isEmpty(queue Q)
{
return (Q->front == Q->rear);
}
void addQueue(queue Q,elemType x)
{
if(isFull(Q)){
printf("Queue is Full\n");
return;
}else{
Q->rear = (Q->rear+1)%MAX_SIZE;
Q->data[Q->rear] = x;
}
}
elemType deleteQueue(queue Q)
{
if(isEmpty(Q)){
printf("Queue is empty\n");
return 0;
}else{
Q->front = (Q->front+1)%MAX_SIZE;
return Q->data[Q->front];
}
}
int main()
{
queue Q;
Q = createQueue();
addQueue(Q,3);
printf("3 enter\n");
addQueue(Q,5);
printf("5 enter\n");
addQueue(Q,23);
printf("23 enter\n");
addQueue(Q,2);
printf("2 enter\n");
while(!isEmpty(Q)){
printf("%d delete\n",deleteQueue(Q));
}
}
//3 enter
//5 enter
//23 enter
//2 enter
//3 delete
//5 delete
//23 delete
//2 delete
单链表法
注意,这个队列中,储存信息的节点Node是一个结构,包括前后指针Node节点的QNode是第二个结构。
同时,初始化与增加节点时,因为一开始声明的是指针,所以一定要malloc
分配空间!!
例:
Q = (queue)malloc(sizeof(struct QNode));
↑ 针对初始化时,申请一个QNode的空间
因为之前通过typedef
声明了QNode
与 queue
等价,所以前面可以用此代替
再例:
struct Node *node;
node = (struct Node*)malloc(sizeof(struct Node));
不要搞错malloc
使用的前后对象
#include <stdio.h>
#include <malloc.h>
typedef int elemType;
typedef struct QNode *queue;
struct Node{
elemType data;
struct Node *next;
}; //储存信息的节点
struct QNode{
struct Node *rear;
struct Node *front;
//一个队列节点,包括前后指针节点
};
queue createQueue();
void addQueue(queue Q,elemType x);
elemType deleteQueue(queue Q);
int isEmpty(queue Q);
queue createQueue()
{
queue Q;
Q = (queue)malloc(sizeof(struct QNode));
Q->front = NULL;
Q->rear = NULL;
return Q;
}
void addQueue(queue Q,elemType x)
{
struct Node *node;
node = (struct Node*)malloc(sizeof(struct Node));
node->data = x;
node->next = NULL;
if(Q->rear == NULL){ //此时队列空
Q->rear = node;
Q->front = node;
}else{
Q->rear->next = node;
Q->rear = node;
//node入列且调整rear向node
}
}
int isEmpty(queue Q)
{
return (Q->front == NULL);
}
elemType deleteQueue(queue Q)
{
struct Node *temp;
elemType deleteElem;
if(isEmpty(Q)){
printf("Queue is empty");
return 0;
}
temp = Q->front;
if(Q->front == Q->rear){ //只有一个元素
Q->front = Q->rear = NULL;
}else{
Q->front = Q->front->next;
}
deleteElem = temp->data;
free(temp);
return deleteElem;
}
int main()
{
queue Q;
Q = createQueue();
addQueue(Q,5);
printf("5 Enter\n");
addQueue(Q,3);
printf("3 Enter\n");
addQueue(Q,334);
printf("334 Enter\n");
addQueue(Q,233);
printf("233 Enter\n");
while(!isEmpty(Q)){
printf("Delete %d\n",deleteQueue(Q));
}
return 0;
}
//5 Enter
//3 Enter
//334 Enter
//233 Enter
//Delete 5
//Delete 3
//Delete 334
//Delete 233