/*****************************************
1.把队列的实现(链式)
create
enQueue
deQueue
getFront//得到第一个的值,但是不出队
clearQueue//清空队列
destroyQueue//销毁创建的空间
getLength//得到队列的长度
**************************************/
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct node //定义双向结点
{
Elemtype data;
struct node *next;
struct node *prev;
}Node;
typedef struct linkqueue //定义队
{
Node *front;
Node *rear;
int max;
int length;
}Linkqueue;
Linkqueue *crea(int max) //生成原始队(空队)
{
Linkqueue *q=(Linkqueue *)malloc(sizeof(*q));
q->front=NULL;
q->rear=NULL;
q->max=max;
q->length=0;
return q;
}
int isFull(Linkqueue *q) //判断队是否已满
{
if(q->length==q->max) //若满了
{
return 1; //返回 1
}
return 0; //否则返回 0
}
int isEmpty(Linkqueue *q) //判断队是否为空
{
if(q->front==NULL) //若为空
{
return 1; //返回 1
}
return 0; //否则返回0
}
//入队
void Enqueue(Linkqueue *q,Elemtype data)
{
if(isFull(q))
{
return ;
}
q->length++;
Node *pnew=(Node *)malloc(sizeof(*pnew));
pnew->data=data;
pnew->next=NULL;
pnew->prev=NULL;
if(isEmpty(q))
{
q->front=q->rear=pnew;
}
else
{
q->front->prev=pnew; //从front插入记得要从rear输出!!!
pnew->next=q->front;
q->front=pnew;
}
}
//出队
Elemtype Dequeue(Linkqueue *q)
{
if(isEmpty(q))
{
return 100;
}
q->length--;
Node *p=q->rear;
Elemtype a=p->data;
q->rear=q->rear->prev;
// q->rear->prev=NULL; //导致段错误!!
q->rear->next=NULL;
// p->next=NULL;
p->prev=NULL;
free(p);
/*********************
Node *pre=NULL;
pre=p;
p=p->next;
p->prev=NULL;
pre->next=NULL;
free(pre);
*********************/
return a;
}
//将队清空还原成初始状态
/************************************************
出队的时候就已经把出去的结点所占空间释放了,
不能重复释放一个空间,会导致段错误,
注意释放的起始位置!!!!!!!!!!
***********************************************
补充:
若以length为清空队的游标,则不需要注意上面的情况
**********/
/***
void clear(Linkqueue *q)
{
if(isEmpty(q))
{
return ;
}
Node *p=q->front; //段错误的根源!!!!!!
while(q->front)
{
p=q->front;
q->front=q->front->next;
printf("aaa\n");
q->front->prev=NULL;
p->next=NULL;
free(p);
}
q->length=0;
}
****/
Elemtype getfront(Linkqueue *q)
{
Elemtype a=q->front->data;
return a;
}
Elemtype getrear(Linkqueue *q)
{
Elemtype a=q->rear->data;
return a;
}
Elemtype getlength(Linkqueue *q)
{
Elemtype a=q->length;
return a;
}
//将队清空还原成初始状态
void clear(Linkqueue *q)
{
if(isEmpty(q))
{
return ;
}
Node *p=q->rear;
while(q->rear)
{
p=q->rear;
q->rear=q->rear->prev;
q->rear->next=NULL;
p->prev=NULL;
free(p);
q->length--;
if(q->length==1)
/*********************************
用 if(q->length==0) //错误,进不来!!!
为什么??
因为已经退出while(q->rear)这个循环了!!!!
*********************************/
{
free(q->rear);
return ;
}
}
}
//把队销毁
void destory(Linkqueue *q)
{
if(isEmpty(q))
{
return ;
}
clear(q);
free(q);
}
int main()
{
Linkqueue *q=crea(10);
Enqueue(q,1);
Enqueue(q,10);
Enqueue(q,11);
Enqueue(q,12);
Enqueue(q,13);
Enqueue(q,14);
Enqueue(q,15);
Enqueue(q,16);
Enqueue(q,17);
Elemtype a=Dequeue(q);
printf("%d\n",a);
a=getfront(q);
printf("q->front=%d\n",a);
a=getrear(q);
printf("q->rear=%d\n",a);
a=getlength(q);
printf("q->length=%d\n",a);
a=Dequeue(q);
printf("%d\n",a);
a=Dequeue(q);
printf("%d\n",a);
a=Dequeue(q);
printf("%d\n",a);
a=Dequeue(q);
printf("%d\n",a);
destory(q);
return 0;
}
/*
输出结果:
1
q->front=17
q->rear=10
q->length=8
10
11
12
13
*/