#include <stdio.h>
#include <stdlib.h>
// 链表:队列的链式存储结构
typedef struct QueueNode
{
char date;
struct QueueNode *next;
}qnode, *QueuePtr;
// 指向队列头和尾的指针结构体
typedef struct
{
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
}queue;
int main()
{
// 构造一个空队列
void InitQueue(queue *q);
// 向队尾插入元素
void InsertQueue(queue *q, char e);
// 若队列不为空,删除队头元素,并用e返回其值
void DelHead(queue *q, char e );
// 销毁队列
void DestoryQueue(queue *q);
// 判断队列是否为空,若空则返回1,不空返回0
int QueueEmpty(queue *q);
// 返回队列的长度,即元素个数
int QueueLength(queue *q);
// 若队列不为空则返回,用e返回队头元素
char GetHead(queue *q, char e);
// 定义
queue q;
char e='a';
char t;
int temp;
InitQueue(&q);
InsertQueue(&q,e);InsertQueue(&q,e);InsertQueue(&q,e);
DelHead(&q, e);
temp = QueueEmpty(&q);
if(temp)
printf("The queue is empty!\n");
else
printf("The queue isn't empty!\n");
temp = QueueLength(&q);
printf("The length is:%d\n",temp);
t = GetHead(&q, e);
printf("%c\n",t);
DestoryQueue(&q);
return 0;
}
// 构造一个空队列
void InitQueue(queue *q)
{
// 第一个队头节为空节点不被利用,但可以存储一些有关队列的信息使用
q->front = q->rear = (qnode *)malloc(sizeof(qnode));
if(!q->front)
exit(0);
q->front->next = NULL;
printf("Success to create queue!\n");
}
// 向队尾插入元素
void InsertQueue(queue *q, char e)
{
qnode *node;
node = (qnode *)malloc(sizeof(qnode));// 注意:malloc函数要用指针指向
if(!node)
exit(0);
node->date = e;
node->next = NULL;
q->rear->next = node; // 未插入时链队列的最后一个元素的下一个指针域,使其连接到下一个插入元素
q->rear = node; // 表示最后一个元素为node
printf("Success to insert:%c\n",e);
}
// 若队列不为空,删除队头元素,并用e返回其值
void DelHead(queue *q, char e )
{
// 定义,node用于指向头结点的下一个,即第一个对头元素
QueuePtr node;
// 如果队列为空,则退出
if(q->front == q->rear)
exit(0);
// 若不为空,则删除后返回删除的队头元素
node = q->front->next; // node指向头结点的下一个节点
e = node->date; // node节点的date赋值给e,以便返回节点信息
q->front->next = node->next; // node的下一个节点赋值给头结点的下一个节点,即删除对头的元素
// 如果只有头结点,没有队头元素时队头指针和队尾指针指向相同的节点
if(q->rear == node)
q->rear = q->front;
free(node); // 释放删除的节点
printf("Success to delete the head element!\n");
}
// 销毁队列,无论空与否均可
void DestoryQueue(queue *q)
{
while(q->front)
{
q->rear = q->front->next; // 队列的尾节点指向头结点的下一个节点
free(q->front); // 释放头结点
q->front = q->rear; // 使头结点和尾节点指向同一节点
}
printf("Success to destory queue!\n");
}
// 判断队列是否为空,若空则返回1,不空返回0
int QueueEmpty(queue *q)
{
// 如果队列为空
if(q->front->next == NULL)
return 1;
else
return 0;
}
// 返回队列的长度,即元素个数
int QueueLength(queue *q)
{
int cnt=0;
qnode *node;
node = q->front; // 使node指向队头结点
while(node != q->rear)
{
cnt++;
node = node->next;
}
return cnt;
}
// 若队列不为空则返回,用e返回队头元素
char GetHead(queue *q, char e)
{
// 判断队列是否为空,若为空则退出
if(q->front->next == NULL)
exit(0);
e = q->front->next->date;
return e;
}
总结:
1、(1)q->front:表示头结点
(2)q->rear:表示尾节点
(3)q->front->next:表示头结点的下一个节点
(4)q->rear->next:表示尾节点的下一个节点
2、warning:'e' is used uninitialized in this function 因为e只定义却未付值,开始给e赋值就解决了
3、注意:构造栈时,第一个队头节为空节点不被利用,但可以存储一些有关队列的信息使用
4、注意:变量要对其赋初值,否则会出错!求队列长度时未赋初值导致队列长度每次运行都是不同的长度值