数据结构——链队列

一 介绍

队列是一种特殊的线性表,特殊之处在于只允许在一端进行删除操作,在一端进行插入操作。队列是受限制的线性表,允许删除操作的一端叫队首(front),允许插入操作的的一端叫队尾(rear)。

二 代码()

# include<stdio.h>
# include<stdlib.h>
# include<malloc.h>

typedef struct node{
    int data;
    struct node * next;
}Node, *qNode;

typedef struct queue{
    qNode front;
    qNode rear;
}Queue;

void initQueue(Queue *);
void enQueue(Queue *, int);
void deQueue(Queue *);
void traverselQueue(Queue *);
bool isEmpty(Queue *);
int queueLength(Queue *);
void clearQueue(Queue *);
void destroyQueue(Queue *);

int main(){

    Queue q;
    initQueue(&q);
    enQueue(&q, 1);
    enQueue(&q, 2);
    enQueue(&q, 3);
    enQueue(&q, 4);
    traverselQueue(&q);
    /*
    printf("\n");
    deQueue(&q);
    traverselQueue(&q);
    if(isEmpty(&q)){
        printf("空\n");
    } else
        printf("不空\n");
    printf("len:%d",queueLength(&q));
    */

    /*
    clearQueue(&q);
    traverselQueue(&q);
    */
    destroyQueue(&q);


    return 0;
}

void initQueue(Queue * q){
    q->front = q->rear = (qNode)malloc(sizeof(Node));
    if(!q->front){
        printf("error");
        exit(-1);
    }
    q->front->next = NULL;
}

void enQueue(Queue * q, int val){
    qNode newNode = (qNode)malloc(sizeof(Node));
    if(!newNode){
        printf("error");
        exit(-1);
    }
    newNode->data = val;
    newNode->next = NULL;
    q->rear->next = newNode;
    q->rear = newNode;
}

void traverselQueue(Queue * q){
    if(q->rear == q->front)
        printf("队列为空");
    qNode p = q->front->next;
    while(p){
        printf("%d ", p->data);
        p = p->next;
    }
}

void deQueue(Queue * q){
    if(q->front == q->rear){
        return;
    }
    qNode p = q->front->next;
    q->front->next = p->next;

    free(p);
}

bool isEmpty(Queue * q){
    if(q->front == q->rear)
        return true;
    else
        return false;
}

int queueLength(Queue * q){
    int len = 0;
    qNode p = q->front->next;
    while(p){
        len++;
        p = p->next;
    }
    return len;
}

void clearQueue(Queue * q){
    if(q->front == q->rear){
        return;
    }
    while(q->front->next != NULL) {
        qNode p = q->front->next;
        q->front->next = p->next;
        free(p);
        p = NULL;
    }

    q->front = q->rear;

}

void destroyQueue(Queue * q){

   clearQueue(q);
   free(q);
   q = NULL;

}



猜你喜欢

转载自blog.csdn.net/zxf15735185131/article/details/79671088
今日推荐