数据结构之链式队

/*****************************************

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

*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值