队列的链式存储

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define maxsize 20
typedef int status; 
typedef int elemtype;

typedef struct queuenode{
    elemtype data;
    struct queuenode * next;
}queuenode;/*定义链队列节点*/

typedef struct queuenode * queuenodeptr;

typedef struct linkqueue{
    queuenodeptr front,rear;
}linkqueue;/*定义链队列首尾指针*/

status visit(elemtype c){
    printf("%d ",c);
    return OK;
}

status initlinkqueue(linkqueue *Q){
    Q->rear=Q->front=(queuenodeptr)malloc(sizeof(queuenode));
    if(!Q->front||!Q->rear){
        return ERROR;
    }
    else
    Q->front=Q->rear;//内存分配成功后一定要让头指针等于尾指针,这是空队列判定条件
    Q->front->next=NULL;//让队首指向NULL
    return OK;
}

/*判空*/
status emptylinkqueue(linkqueue *Q){
    if(Q->front==Q->rear){/*再次强调空队列判定条件*/
        return TRUE;
    }
    else{
        return FALSE;
    }
}

/*返回队列长度*/
status linkqueuelength(linkqueue *Q){
    int length=0;
    queuenodeptr p=Q->front;
    while(p!=Q->rear){
        length++;
        p=p->next;
    }
    return length;
}

/*入队*/
status enterlinkqueue(linkqueue *Q,elemtype data){
        queuenodeptr push;
        push=(queuenodeptr)malloc(sizeof(queuenode));
        if(!push){
            return ERROR;
        }
        push->data=data;
        Q->rear->next=push;/*使队尾指向待进入元素*/
        Q->rear=push;/*让新元素成为新的尾指针*/
        push->next=NULL;/*让尾部指向NULL*/
    return OK;
}

/*出队*/
status exitlinkqueue(linkqueue *Q,elemtype data){
    if(emptylinkqueue(Q)){
        printf("队列空\n");
        return ERROR;
    }
    else{
        queuenodeptr p;
        p=Q->front->next;/*p指向队首*/
        data=p->data;
        printf("%d ",data);
        Q->front->next=p->next;/*队首指向p之后的元素*/
        free(p);/*释放p*/
    }
    return OK;
}

/*销毁链队列*/
status destroylinkqueue(linkqueue *Q){
    queuenodeptr current=Q->front,temp;
    while(current){
        temp=current->next;
        free(current);
        current=temp;
    }
    return OK;
}

/*遍历队列*/
status traverselinkqueue(linkqueue *Q){
    queuenodeptr current=Q->front->next,pnext;
    while(current!=Q->rear){/*未到尾*/
        visit(current->data);
        current=current->next;
    }
    printf("\n");
    return OK;
}

int main(void){
    linkqueue Q;
    elemtype data;
    initlinkqueue(&Q);
    emptylinkqueue(&Q);
    int length=0;
    printf("队列长为%d\n",linkqueuelength(&Q));
    for(int i=0;i<maxsize-1;i++){
        enterlinkqueue(&Q,i);
    }
    traverselinkqueue(&Q);
    for(int i=0;i<maxsize-2;i++){
        exitlinkqueue(&Q,data);
    }
    printf("\n");
    printf("出队列后,队列长为%d\n",linkqueuelength(&Q));
    printf("销毁队列\n");
    if(destroylinkqueue(&Q)){
        printf("销毁成功\n");
    }
}

你可能感兴趣的:(队列的链式存储)