#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct ListNode { // 定义结点结构
ElementType data;
struct ListNode *next;
}node;
typedef struct QueueRecord { // 定义结构体,用于存放队列的头指针和尾指针
node *Front;
node *Rear;
}Queue;
typedef Queue *PtrToQueue;
PtrToQueue InitQueue();void Enqueue(PtrToQueue Q, ElementType element);
void Dequeue(PtrToQueue Q);
void TraverseQueue(PtrToQueue Q);
int main()
{
PtrToQueue LinkedQueue = InitQueue();
for (int i = 0; i < 10; i++) {
Enqueue(LinkedQueue, i);
}
TraverseQueue(LinkedQueue);
Dequeue(LinkedQueue);
Dequeue(LinkedQueue);
TraverseQueue(LinkedQueue);
Enqueue(LinkedQueue, 50);
TraverseQueue(LinkedQueue);
DestoryQueue(LinkedQueue);
TraverseQueue(LinkedQueue);
}
/* 队列初始化 */
PtrToQueue InitQueue()
{
PtrToQueue queue = (PtrToQueue)malloc(sizeof(Queue)); // 创建一个队列,并动态分配内存
if(queue == NULL) {
perror("malloc failed!\n");
exit(EXIT_FAILURE);
}
queue->Front = queue->Rear = NULL; // 初始化头指针和尾指针
return queue;
}
/* 入队 */
void Enqueue(PtrToQueue Q,ElementType element)
{
node *newNode = (node *)malloc(sizeof(node)); // 新建一个链表结点,用于存放入队元素的值
if (newNode == NULL) {
perror("malloc failed!\n");
exit(EXIT_FAILURE);
}
newNode->next = NULL;
newNode->data = element;
if (Q->Rear == NULL) {
Q->Front = newNode;
Q->Rear = newNode;
}
else {
Q->Rear->next = newNode; // 让新结点作为当前尾结点的下一个结点
Q->Rear = newNode; // 尾指针指向新结点
}
}
/* 出队 */
void Dequeue(PtrToQueue Q)
{
node *delNode = Q->Front;
if (Q->Front == NULL) {
printf("队列为空,无法执行出队操作\n");
}
if (Q->Front == Q->Rear) {
Q->Front = NULL;
Q->Rear = NULL;
free(delNode); // 释放结点内存
}
else {
Q->Front = Q->Front->next;
free(delNode); // 释放结点内存
}
}
/* 遍历队列 */
void TraverseQueue(PtrToQueue Q)
{
node *tmpNode = Q->Front;
if (tmpNode == NULL) {
printf("队列为空\n");
}
while(tmpNode != NULL) {
printf("%d ", tmpNode->data);
tmpNode = tmpNode->next;
}
printf("\n");
}
#include <stdio.h>
2 #include <stdlib.h>
3
4 #define OK 1
5 #define ERROR 0
6 #define MAXQSIZE 10
7 typedef int Status;
8 typedef int QElemType; //定义队列中元素类型
9
10 typedef struct
11 {
12 QElemType *base;
13 int front;
14 int rear;
15 }SqQueue; //定义循环队列类型
16
17 Status InitQueue(SqQueue & Q) ;//初始化为空队列,分配数组空间
18 Status GetHead(SqQueue Q,QElemType &e) ;//获取队头元素的值并返回在e中
19 Status EnQueue(SqQueue &Q,QElemType e);//队列非法,将元素e入队
20 Status DeQueue(SqQueue &Q,QElemType &e);//队列非法,将元素e入队
21 int QueueLength(SqQueue Q);//求队列的长度
22
23 int main()
24 {
25 SqQueue Q;
26 int m;
27 QElemType e;
28 InitQueue(Q);
29 scanf("%d",&m);
30 while(m!=0) //m=0表示操作结束
31 {
32 if(m==1) //m=1表示入队
33 {
34 scanf("%d",&e);
35 EnQueue(Q,e);
36 }
37 else if(m==2)//m=2表示出队
38 {
39 DeQueue(Q,e);
40 }
41 scanf("%d",&m);
42 }
43 printf("length=%d\n",QueueLength(Q));
44 if (GetHead(Q,e)==OK)
45 printf("first=%d",e);
46 else
47 printf("first=NULL");
48 return 0;
49 }
50
51 Status InitQueue(SqQueue & Q) //初始化为空队列,分配数组空间
52 {
53 Q.base=(QElemType *)malloc(sizeof(QElemType)*MAXQSIZE);
54 if(!Q.base)
55 return ERROR;
56 Q.front=Q.rear=0;
57 return OK;
58 }
59
60 Status GetHead(SqQueue Q,QElemType &e) //获取队头元素的值并返回在e中
61 {
62 if(Q.rear==Q.front) return ERROR;
63 e=Q.base[Q.front];
64 return OK;
65 }
66
67 Status EnQueue(SqQueue &Q,QElemType e)//队列非法,将元素e入队
68 {
69 if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;
70 Q.base[Q.rear]=e;
71 Q.rear=(Q.rear+1)%MAXQSIZE;
72 return OK;
73 }
74
75 Status DeQueue(SqQueue &Q,QElemType &e)//队列非法,将元素出队
76 {
77 if(Q.rear==Q.front) return ERROR;
78 e=Q.base[Q.front];
79 Q.front=(Q.front+1)%MAXQSIZE;
80 return OK;
81 }
82
83 int QueueLength(SqQueue Q)//求队列的长度
84 {
85 return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
86 }