#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 }
原文:https://www.cnblogs.com/fake8864/p/12912661.html