/*
*数据结构(队列):双端队列
*用单链表实现,链式存储结构
*Date:2017/4/16
*/
#include <stdio.h>
#include <stdlib.h>
#define ElemType char
#define InitSize 100
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode;
typedef struct{
LNode *front,*rear;
int length;
}LinkQueue;
void initQueue(LinkQueue &Q); //初始化队列
bool emptyQueue(LinkQueue Q); //判空操作
void EnQueueFront(LinkQueue &Q,ElemType e); //前端入队
void EnQueueBack(LinkQueue &Q,ElemType e); //后端入队
void DeQueueFront(LinkQueue &Q,ElemType &e); //前端出队
void DeQueueBack(LinkQueue &Q,ElemType &e); //后端出队
void getHeadFront(LinkQueue Q,ElemType &e); //获取前端队头元素值
void getHeadBack(LinkQueue Q,ElemType &e); //获取后端队头元素值
void printQueue(LinkQueue Q); //打印队列
void clearQueue(LinkQueue &Q); //清空队列
void initQueue(LinkQueue &Q){
ElemType e;
Q.front = Q.rear = (LNode *)malloc(sizeof(LNode)); //Q.front 作为头结点
Q.rear->next = NULL;
Q.length = 0;
while(scanf("%c",&e) != EOF && e != '\n'){
if(Q.length < InitSize){
LNode *p = (LNode *)malloc(sizeof(LNode));
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
Q.length++;
}
}
}
bool emptyQueue(LinkQueue Q){
if(Q.front == Q.rear){
return true;
}else{
return false;
}
}
void EnQueueFront(LinkQueue &Q,ElemType e){
if(Q.length < InitSize){
LNode *p = (LNode *)malloc(sizeof(LNode));
p->data = e;
p->next = Q.front->next;
Q.front->next = p;
Q.length++;
}
}
void EnQueueBack(LinkQueue &Q,ElemType e){
if(Q.length < InitSize){
LNode *p = (LNode *)malloc(sizeof(LNode));
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
Q.length++;
}
}
void DeQueueFront(LinkQueue &Q,ElemType &e){
if(!emptyQueue(Q)){
LNode *p;
e = Q.front->next->data;
p = Q.front->next;
Q.front->next = p->next;
free(p);
Q.length--;
}
}
void DeQueueBack(LinkQueue &Q,ElemType &e){
if(!emptyQueue(Q)){
LNode *p = Q.front;
e = Q.rear->data;
while(p->next != Q.rear){
p = p->next;
}
p->next = NULL;
free(Q.rear);
Q.rear = p;
Q.length--;
}
}
void getHeadFront(LinkQueue Q,ElemType &e){
if(!emptyQueue(Q))
e = Q.front->next->data;
}
void getHeadBack(LinkQueue Q,ElemType &e){
if(!emptyQueue(Q))
e = Q.rear->data;
}
void printQueue(LinkQueue Q){
LNode *p = Q.front->next;
while(p != NULL){
printf("%c",p->data);
p = p->next;
}
printf("\n");
}
void clearQueue(LinkQueue &Q){
LNode * p = Q.front;
while(Q.front != Q.rear){
Q.front = p->next;
free(p);
p = Q.front;
}
free(Q.rear);
printf("队列已经清空\n");
}
int main(){
freopen("in.txt","r",stdin);
LinkQueue Q;
ElemType e;
initQueue(Q);
printQueue(Q);
EnQueueFront(Q,'F');
printf("EnQueueFront(&Q,'F'):\n");
printQueue(Q);
EnQueueBack(Q,'B');
printf("EnQueueBack(&Q,'B'):\n");
printQueue(Q);
DeQueueFront(Q,e);
printf("DeQueueFront(&Q,e):%c\n",e);
printQueue(Q);
DeQueueBack(Q,e);
printf("DeQueueBack(&Q,e):%c\n",e);
printQueue(Q);
getHeadFront(Q,e);
printf("getHeadFront(Q,e):%c\n",e);
getHeadBack(Q,e);
printf("getHeadBack(Q,e):%c\n",e);
if(emptyQueue(Q)){
printf("Q is NULL\n");
}else{
printf("Q isn't NULL\n");
}
clearQueue(Q);
if(emptyQueue(Q)){
printf("Q is NULL\n");
}else{
printf("Q isn't NULL\n");
}
return 0;
}
in.txt:
peer