第三章 队列【数据结构】【链队列】【循环队列】
最近越来越感觉到c语言指针的强大~~
#include<stdio.h> #include<stdlib.h> #define QElemType int #define OK 1 #define ERROR 0 #define OVERFLOW 0 typedef 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 1000 typedef int Status; #define OK 1 #define ERROR 0 typedef 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; }