1.動態順序隊列
#include <stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100
typedef int ElemType;
typedef struct{
ElemType *base;//動態分配
int front;
int rear;
}Queue;
void InitQueue(Queue *q);
void QueueDestroy(Queue q);
void QueueClear(Queue q);
int QueueLength(Queue q);
int QueueEmpty(Queue q);
void EnQueue(Queue *q,ElemType e);
void DeQueue(Queue *q,ElemType *e);
int GetHead(Queue *q,ElemType *e);
void Display(Queue q);
int main(void){
Queue q;ElemType e;int len;
InitQueue(&q);
Display(q);
for(int i=0;i<5;i++){
int a=2*i+1;
EnQueue(&q,a);
}
Display(q);
len=QueueLength(q);
printf("隊列長度爲%d\n",len);
DeQueue(&q,&e);
printf("出隊的元素爲%d\n",e);
Display(q);
len=QueueLength(q);
printf("隊列長度爲%d\n",len);
return 0;
}
void InitQueue(Queue *q){
q->base=(ElemType*)malloc(MAX_SIZE*sizeof(ElemType));
if(!q->base)
exit(-1);
q->front=q->rear=0;
}
void QueueDestroy(Queue q){
free(q.base);
q.base=NULL;
}
void QueueClear(Queue q){
q.front=0;
q.rear=0;
}
int QueueLength(Queue q){
return (q.rear-q.front+MAX_SIZE)%MAX_SIZE;
}
int QueueEmpty(Queue q){
if(q.front==q.rear)
return 1;
return 0;
}
void EnQueue(Queue *q,ElemType e){
if((q->rear+1)%MAX_SIZE==q->front)
exit(-1);
q->base[q->rear]=e;
q->rear=(q->rear+1)%MAX_SIZE;
}
void DeQueue(Queue *q,ElemType *e){
if(q->front==q->rear)
exit(-1);
*e=q->base[q->front];
q->front=(q->front+1)%MAX_SIZE;
}
int GetHead(Queue *q,ElemType *e){
if(QueueEmpty(*q))
return -1;
*e=q->base[q->front];
return *e;
}
void Display(Queue q){
if(q.front==q.rear)
printf("隊列爲空\n");
else{
int i=q.front;
printf("這個隊列爲:");
while(i!=q.rear){
printf("%d ",q.base[i]);
i=(i+1)%MAX_SIZE;
}
printf("\n");
}
}
2.鏈式
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE -1
typedef int Status;
typedef int ElemType;
typedef struct QNode{
ElemType data;
struct QNode *next;
}QNode;//結點定義
typedef struct Link_Queue{
QNode *front,*rear;
}Link_Queue;//鏈隊
void InitQueue(Link_Queue *q);
Status DestroyQueue(Link_Queue q);
void ClearQueue(Link_Queue q);
int QueueEmpty(Link_Queue q);
int QueueLength(Link_Queue q);
void EnQueue(Link_Queue *q,ElemType e);
void EnQueue_1(Link_Queue *q,ElemType e);
void DeQueue(Link_Queue *q,ElemType *e);
void GetHead(Link_Queue q,ElemType *e);
void Display(Link_Queue q);
int main(void){
Link_Queue q;
InitQueue(&q);
ElemType e,b,a;
int len=0;
Display(q);
for(int i=0;i<5;i++){
a=2*i+1;
EnQueue(&q,a);
}
Display(q);
GetHead(q,&e);
len=QueueLength(q);
printf("隊列長度爲%d\n",len);
DeQueue(&q,&b);
Display(q);
GetHead(q,&e);
return 0;
}
void InitQueue(Link_Queue *q){
q->front=q->rear=(QNode*)malloc(sizeof(QNode));
if(!q->front)
exit(-1);
q->front->next=NULL;
}
Status DestroyQueue(Link_Queue q){
QNode *p=NULL;
if(q.front==q.rear){
printf("當前鏈隊列爲空,無需完成銷燬操作\n");
return ERROR;
}
while(q.front->next){
p=q.front->next;
q.front->next=p->next;
if(QueueLength(q)==0)
break;
free(p);
}
printf("銷燬成功\n");
return OK;
}
void ClearQueue(Link_Queue q){
DestroyQueue(q);
InitQueue(&q);
}
int QueueEmpty(Link_Queue q){
if(q.front==q.rear)
return OK;
return ERROR;
}
int QueueLength(Link_Queue q){
QNode *p;
int len=0;
if(q.front==q.rear)
return ERROR;
else
p=q.front->next;
while(p){
len++;
p=p->next;
}
return len;
}
void EnQueue(Link_Queue *q,ElemType e){//帶頭結點
QNode *p;
p=(QNode*)malloc(sizeof(QNode));
if(!p){
printf("插入元素失敗\n");exit(-1);
}
p->data=e;
p->next=NULL;//生成新結點
q->rear->next=p;
q->rear=p;
}
void EnQueue_1(Link_Queue *q,ElemType e){//不帶頭結點
QNode *p;
p=(QNode*)malloc(sizeof(QNode));
if(!q)
exit(-1);
p->data=e;p->next=NULL;
if(q->front==NULL){//邊界操作
q->front=p;q->rear=p;
return ;
}
q->rear->next=p;
q->rear=p;
}
void DeQueue(Link_Queue *q,ElemType *e){
QNode *p;
if(q->front==q->rear)
exit(-1);
p=q->front->next;
*e=p->data;
q->front->next=p->next;
if(q->rear==p)
q->rear=q->front;
free(p);
printf("出隊的元素爲%d\n",*e);
}
void GetHead(Link_Queue q,ElemType *e){//取第一個元素
if(q.front==q.rear)
exit(-1);
*e=q.front->next->data;
printf("頭元素爲:%d\n",*e);
}
void Display(Link_Queue q){
if(q.front==q.rear)
printf("隊列爲空\n");
else {
printf("該隊列爲:");
QNode *p=q.front->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
}