一 介绍
队列是一种特殊的线性表,特殊之处在于只允许在一端进行删除操作,在一端进行插入操作。队列是受限制的线性表,允许删除操作的一端叫队首(front),允许插入操作的的一端叫队尾(rear)。
二 代码()
# include<stdio.h>
# include<stdlib.h>
# include<malloc.h>
typedef struct node{
int data;
struct node * next;
}Node, *qNode;
typedef struct queue{
qNode front;
qNode rear;
}Queue;
void initQueue(Queue *);
void enQueue(Queue *, int);
void deQueue(Queue *);
void traverselQueue(Queue *);
bool isEmpty(Queue *);
int queueLength(Queue *);
void clearQueue(Queue *);
void destroyQueue(Queue *);
int main(){
Queue q;
initQueue(&q);
enQueue(&q, 1);
enQueue(&q, 2);
enQueue(&q, 3);
enQueue(&q, 4);
traverselQueue(&q);
/*
printf("\n");
deQueue(&q);
traverselQueue(&q);
if(isEmpty(&q)){
printf("空\n");
} else
printf("不空\n");
printf("len:%d",queueLength(&q));
*/
/*
clearQueue(&q);
traverselQueue(&q);
*/
destroyQueue(&q);
return 0;
}
void initQueue(Queue * q){
q->front = q->rear = (qNode)malloc(sizeof(Node));
if(!q->front){
printf("error");
exit(-1);
}
q->front->next = NULL;
}
void enQueue(Queue * q, int val){
qNode newNode = (qNode)malloc(sizeof(Node));
if(!newNode){
printf("error");
exit(-1);
}
newNode->data = val;
newNode->next = NULL;
q->rear->next = newNode;
q->rear = newNode;
}
void traverselQueue(Queue * q){
if(q->rear == q->front)
printf("队列为空");
qNode p = q->front->next;
while(p){
printf("%d ", p->data);
p = p->next;
}
}
void deQueue(Queue * q){
if(q->front == q->rear){
return;
}
qNode p = q->front->next;
q->front->next = p->next;
free(p);
}
bool isEmpty(Queue * q){
if(q->front == q->rear)
return true;
else
return false;
}
int queueLength(Queue * q){
int len = 0;
qNode p = q->front->next;
while(p){
len++;
p = p->next;
}
return len;
}
void clearQueue(Queue * q){
if(q->front == q->rear){
return;
}
while(q->front->next != NULL) {
qNode p = q->front->next;
q->front->next = p->next;
free(p);
p = NULL;
}
q->front = q->rear;
}
void destroyQueue(Queue * q){
clearQueue(q);
free(q);
q = NULL;
}