队列以及循环队列实现
1、定义:先进先出的线性表,就像排队,它只允许在队列一端插入元素,在另一端删除元素(插入一端队尾,删除一端队头)
2、典型例子:作业排队
3、基本功能
1、宏定义结构体定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include<stdio.h> #include<stdlib.h> #define ERROR 0; #define OK 1; typedef struct Node { int data; struct Node *next; }QNode; typedef struct pointer { QNode *front; //队首指针,不存放队列元素 QNode *rear; //队尾指针,存放队尾数据元素 }Qpointer; //就只是指针 |
2、初始化
// 队列的初始化 void Init_Q(Qpointer *Q) { QNode * que = (QNode *)malloc(sizeof(QNode));//队首结点队尾结点指向同一个元素,元素就是那个结构体 que ->next = NULL; Q->front = que; Q->rear = que; }
3、判空
//判断队列是否为空 int isEmpty(Qpointer *Q) { if(Q->front == Q->rear)//首尾元素相同就为空,不是环形的,不会插满的 { return 1; } return 0; }
4、插入数据元素
//插入数据元素,插入成功返回1,失败返回0 int PUsh_Q(Qpointer *Q,int e) { QNode * que; que = (QNode*)malloc(sizeof(QNode)); if(!que) { return 0; } que->data = e; que->next = NULL; Q->rear->next = que;//将节点插入队列尾(有头结点) Q->rear = que;//调整队尾指针(保持队尾指针在队尾) return 0; }
5、删除数据元素
//删除数据元素,删除成功返回1,失败返回0 int Pop_Q(Qpointer *Q,int *e) { QNode *que; if(isEmpty(Q)) { return 0; } que = Q->front->next;//有头结点嘛 *e = que->data; Q->front->next = que->next; if(Q->rear == que)//如果当前删除节点是最后一个人,就把队列设为空 { Q->rear = Q->front; } free(que); return 1; }
6、主函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | int main() { Qpointer *Q; int x; Q = (Qpointer *) malloc ( sizeof (Qpointer)); Init_Q(Q); printf ( "please input positive integers:" ); scanf ( "%d" ,&x); while (x>0) { PUsh_Q(Q,x); scanf ( "%d" ,&x); } // QNode *p = Q->front->next; if (!p) { return 0; } printf ( "queue element:\n" ); while (p) { printf ( "%d " ,p->data); p = p->next; } printf ( "\n" ); // printf ( "delete queue:\n" ); while (Pop_Q(Q,&x)) { printf ( "%d " ,x); } printf ( "\n" ); // p = Q->front; //指向头结点啊 free (p); free (Q); return 0; } |
7、循环队列实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define QUESIZE 6 #define CQdatatype int typedef struct CQNode { CQdatatype data[QUESIZE]; int front; int rear; }CQNode; int Init_CQ(CQNode *CQ) { CQ->front = CQ->rear = 0; //队初始化条件 return OK; } int Is_Empty_CQ(CQNode *CQ) //判断队空 { if (CQ->front == CQ->rear)判断队空条件 { return OK; } return ERROR; } int Is_Full_CQ(CQNode *CQ) //判断队满 { if ((CQ->rear+1)%QUESIZE == CQ->front)判断队满条件 { return OK; } return ERROR; } CQdatatype Get_Top_CQ(CQNode *CQ) //返回队首值 { if (Is_Empty_CQ) { return ERROR; } return CQ->data[CQ->front]; } int Push_CQ(CQNode *CQ,CQdatatype e) //进队 { if (Is_Full_CQ(CQ)) //判满 { printf ( "the queue is full\n" ); return ERROR; } CQ->data[CQ->rear] = e; CQ->rear = (CQ->rear+1)%QUESIZE;进队队尾指针移动 return OK; } int Pop_CQ(CQNode *CQ,CQdatatype *e) //出队 { if (Is_Empty_CQ(CQ)) //判空 { printf ( "the queue is empty\n" ); return ERROR; } *e = CQ->data[CQ->front]; //printf("%d\n",*e); CQ->front = (CQ->front+1)%QUESIZE;出队队头指针移动 return OK; } int main() { CQNode *CQ = (CQNode *) malloc ( sizeof (CQNode)); int i; int e; Init_CQ(CQ); for (i = 0;i < 5;i++) { Push_CQ(CQ,i+1); } for (i = 0;i < 5;i++) { Pop_CQ(CQ,&e); printf ( "%d " ,e); } printf ( "\n" ); free (CQ); return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)