C语言实现队列基本操作-初始化,入队,出队,打印,删除
C语言:
#include <stdio.h>
#include <stdlib.h>
// 队列的实现
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int Status;
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode * next;
}QNode, *QueuePtr;
typedef struct {
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
}LinkQueue;
Status InitQueue(LinkQueue &Q)
{
// 构造一个空队列
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q.front) exit(OVERFLOW); // 分配存储失败
Q.front->next = NULL;
return OK;
}
Status DestroyQueue(LinkQueue &Q)
{
// 销毁队列 Q
while(Q.front){
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
return OK;
}
Status EnQueue(LinkQueue &Q, QElemType e)
{
// 插入元素 e 为 Q 的新的队列元素
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW); // 存储分配失败
p->data = e;
p->next = NULL; // 队尾 next == NULL,有 data
Q.rear->next = p;
Q.rear = p; // 更新队尾
return OK;
}
Status DeQueue(LinkQueue &Q, QElemType &e)
{
// 若对头不空,则删除对头元素,用 e 返回其值,并返回 OK,否则返回 ERROR
if(Q.front == Q.rear) return ERROR;
QueuePtr p = Q.front->next; // Q.front 没有 data, next != NULL(除非空队列)
e = p->data;
Q.front->next = p->next; // 更新队头
if(Q.rear == p) Q.rear = Q.front; // 队列为空了
free(p);
return OK;
}
Status PrintQueue(LinkQueue Q)
{
// 打印队列 Q 全部元素
QueuePtr p = Q.front;
while(p->next){
printf("%d ", p->next->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkQueue q;
InitQueue(q); // 初始化队列
QElemType e1 = 666, e2 = 888; // 向队列添加元素
EnQueue(q, e1);
EnQueue(q, e2);
printf("队列元素: ");
PrintQueue(q); // 打印队列
QElemType e3;
DeQueue(q, e3);
printf("删除元素为: %d \n", e3);
printf("队列元素: ");
PrintQueue(q); // 打印队列
DestroyQueue(q); // 删除队列
return 0;
}
/* Code Running Results 队列元素: 666 888 删除元素为: 666 队列元素: 888 */
栈和单链线性表基本操作实现: