链式队列 有表头

来源:互联网 发布:网络用语arp是什么意思 编辑:程序博客网 时间:2024/05/28 18:43
#ifndef QUEUE_H_INCLUDED
#define QUEUE_H_INCLUDED


typedef int elem;
//有头结点  好处在于插入时候比较简单  空表的插入也是一样的  但是出的时候要单独考虑空表
struct node
{
    elem data;
    struct node*next;
};


typedef struct
{
    struct node*front;
    struct node*rear;
}queue;


//typedef struct node* queue;
int Empty(queue Q)
{
    if(Q.front==Q.rear) return 1;
    return 0;
}


int length(queue Q)
{
    int len;
    for(len=0;Q.front!=Q.rear;Q.front=Q.front->next)
    len++;
    return len;
}




queue Initial(queue Q)//初始化
{
    Q.front=(struct node*)malloc(sizeof(struct node));
    Q.front->next=NULL;
    Q.rear =Q.front;
    return Q;
}


queue EnQueue(queue Q,elem x)//入队
{
    struct node*newnode=(struct node*)malloc(sizeof(struct node));
    newnode->data=x;
    newnode->next=NULL;


    Q.rear->next=newnode;
    Q.rear=Q.rear->next;//空队列有表头 所以可以引用next
    return Q;
}


queue DeQueue(queue Q,elem*x)//出队列
{
    if(Empty(Q)) {printf("empty queue\n");exit(0);}
    *x=Q.front->next->data;
    struct node*tmp=Q.front->next;
    Q.front->next = tmp->next;
    if(Q.rear==tmp) Q.rear=Q.front;//只有一个的时候 需要修改rear
    free(tmp);
    return Q;
}


void Print(queue Q)
{
    printf("queue has %d elements.\n",length(Q));
    for(;Q.front!=Q.rear;Q.front=Q.front->next)
    printf("%d\t",Q.front->next->data);
    printf("\n");


}




#endif // QUEUE_H_INCLUDED
原创粉丝点击