第三章 队列【数据结构】【链队列】【循环队列】
来源:互联网 发布:淘宝神器返利是真的吗 编辑:程序博客网 时间:2024/05/18 04:58
最近越来越感觉到c语言指针的强大~~
#include<stdio.h>#include<stdlib.h>#define QElemType int#define OK 1#define ERROR 0#define OVERFLOW 0typedef int Status;//------------单链表------------队列的链式存储结构 typedef struct QNode { QElemType data; struct QNode *next;}QNode,*QueuePtr;typedef struct{ QueuePtr front,rear;//队头指针和队尾指针 }LinkQueue;//-----------------基本函数操作----------------- Status InitQueue(LinkQueue &Q,int n){ Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));//构造一个空队列 if(!Q.front) exit(OVERFLOW); Q.front->next = NULL; printf("请输入n个数\n"); for(int i = 1; i <= n; i ++)//读入n个数,并依次加入队列 { QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); scanf("%d",&p->data); p->next = NULL; Q.rear->next = p; Q.rear = p; } return OK;}//销毁队列Q Status DestroyQueue(LinkQueue &Q){ while(Q.front) { Q.rear = Q.front->next ; free(Q.front); Q.front = Q.rear ; } return OK;}//插入元素e为Q 的新的队尾元素 Status EnQueue(LinkQueue &Q,QElemType &e){ QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); if(!p) exit(OVERFLOW);//存储分配失败 p->data = e; p->next = NULL; Q.rear->next = p; Q.rear = p; return OK;}//若队列不为空,则删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR Status DeQueue(LinkQueue &Q,QElemType &e){ if(Q.front == Q.rear ) return ERROR; QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); p = Q.front->next ; e = p->data ; Q.front->next = p->next ; free(p); return OK;}void PrintQueue(LinkQueue *Q)//输出队列Q 中的元素 { QueuePtr p = Q->front->next ;//将队列的头元素指针地址赋值给p while(p!=NULL) { printf("%d ",p->data); p = p->next ; } printf("\n");}int main() { LinkQueue Q; int n; printf("请输入n\n"); scanf("%d",&n);//读入n个数,加入队列 InitQueue(Q,n);//初始化队列 printf("初始化后的队列为:\n"); PrintQueue(&Q);//输出队列中的元素 int e; printf("请输入一个整数e\n"); scanf("%d",&e);//读入e EnQueue(Q,e);//插入元素e为Q的新的队尾元素 printf("将e插入队尾后,队列更新为\n"); PrintQueue(&Q);//输出插入队尾后队列的值 DeQueue(Q,e);//删除Q的队头元素,用e返回其值 printf("删除队头元素后的队列为\n"); PrintQueue(&Q);//输出删除队头后的队列 DestroyQueue(Q);//销毁队列,释放存储空间 return 0;}
循环队列的实现
#include<stdio.h>#include<stdlib.h>typedef int QElemType;#define OVERFLOW 0#define MAXSIZE 1000typedef int Status;#define OK 1#define ERROR 0typedef struct { QElemType *base; int front; int rear;}SqQueue;Status InitQueue(SqQueue &Q){ int n; printf("请输入n\n"); scanf("%d",&n); Q.base = (QElemType*)malloc(MAXSIZE*sizeof(QElemType)); if(!Q.base) exit(OVERFLOW); Q.front = Q.rear = 0; printf("请输入n个元素\n"); for(int i = 0; i < n; i ++) { scanf("%d",&Q.base[i]); Q.rear = (Q.rear +1)%MAXSIZE; } return OK;} int QueueLength(SqQueue Q){ return (Q.rear - Q.front +MAXSIZE)%MAXSIZE;}Status EnQueue(SqQueue &Q,QElemType e){ if((Q.rear +1)%MAXSIZE==Q.front ) return ERROR; Q.base[Q.rear +1] = e; Q.rear = (Q.rear + 1)%MAXSIZE; return OK;}Status DeQueue(SqQueue &Q,QElemType &e){ if(Q.front == Q.rear ) return ERROR; e = Q.base[Q.front]; Q.front = (Q.front + 1)%MAXSIZE; return OK;}void PrintQueue(SqQueue S){ SqQueue Q = S; while((Q.front+1)%MAXSIZE != Q.rear) { printf("%d ",Q.base[Q.front]); Q.front = (Q.front + 1)%MAXSIZE; } printf("\n"); return ;}int main(){ SqQueue Q; QElemType e; InitQueue(Q); printf("队列的长度为:%d\n",QueueLength(Q)); printf("请输入插入元素的值e:\n"); scanf("%d",&e); EnQueue(Q, e); printf("插入元素以后的队列值为:\n"); PrintQueue(Q); DeQueue(Q,e); printf("删除队头元素后的队列值为:\n"); PrintQueue(Q); return 0;}
阅读全文
0 0
- 第三章 队列【数据结构】【链队列】【循环队列】
- 【数据结构】队列-循环队列
- 【数据结构-队列】循环队列
- 数据结构(队列):循环队列
- 数据结构 第三章-- 链队列
- 数据结构第三章-队列
- (实验三)《数据结构》第三章 循环队列与链队列验证
- 数据结构 - - 链队列与循环队列
- 队列-循环队列/链队列
- 队列,链队列,循环队列
- 队列,链队列,循环队列
- 数据结构-08 队列(循环队列)
- 数据结构-【队列】链式队列和循环队列
- 数据结构 第三章-- 循环队列(队列的顺序表示和实现)
- 数据结构编程笔记十:第三章 栈和队列 循环队列的实现
- 数据结构之循环队列
- 循环队列(数据结构)
- 数据结构_循环队列
- 类 / 对象
- ubuntu16.04中安装下载工具uget+aria2并配置Firefox
- Java流之缓冲流
- 训练日记
- Qt Charts 之 QChart Class
- 第三章 队列【数据结构】【链队列】【循环队列】
- 实现点击图片下载
- 1036. 跟奥巴马一起编程(15)
- 计算1!+2!+3!+...+n!
- Android命名规范(包名)
- 理解红黑树(上)插入操作
- 用户注册页面
- Error:Execution failed for task ':app:transformClassesWithProfilers-transformFor_360Debug'. > 2
- Python爬虫实战之爬取B站番剧信息(详细过程)