【学习点滴-数据结构-栈&队列】 链式队列的实现及应用

队列的链式实现源码如下:这是之后的链队列操作的基础。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define QOVERFLOW -1 

typedef int QElem,Status;

typedef struct QNode{
    QElem data;
    QNode *next;           
}QNode,*QueuePtr;

typedef struct{
    QueuePtr front;
    QueuePtr rear;        
}Queue;

Status InitQueue(Queue &q){
    q.rear = q.front = (QueuePtr)malloc(sizeof(QNode));
    if(!q.front){
        exit(QOVERFLOW);                         
    }
    q.front->next = NULL;
    return OK;      
}

Status EnQueue(Queue &q,QElem e){
    QueuePtr node = (QueuePtr)malloc(sizeof(QNode));
    if(!node){
        exit(QOVERFLOW);          
    }
    node->data = e;
    node->next = NULL;
    q.rear->next = node;
    q.rear = node;
    return OK;       
}

Status QueueEmpty(Queue q){
    return (q.front == q.rear);   
}

Status DeQueue(Queue &q,QElem &e){
    if(QueueEmpty(q)){
         return ERROR;
    }       
    QueuePtr p = q.front->next;//待删除节点 
    e = p->data;
    q.front->next = p->next;
    if(q.rear == p){//是否只有一个元素 
         q.rear = q.front;
    }
    free(p);
    return OK;  
}

Status DestroyQueue(Queue &q){
    while(q.front){
        q.rear = q.front->next;
        free(q.front);
        q.front = q.rear;    
    }
    return OK;   
} 

void visit(QueuePtr node){
     printf("visit % d \n",node->data); 
} 

Status QueueTraverse(Queue q){
     QueuePtr node = q.front->next;
     while(node){
          visit(node);
          node = node->next;    
     }      
} 

Status GetHead(Queue q,QElem &e){
     if(QueueEmpty(q)){
         return ERROR;                  
     }
     QueuePtr p = q.front->next;
     e = p->data;      
} 

main(){
    Queue queue;
    InitQueue(queue);
    int rands,res; 
    for(int i = 0;i<100;i++){
        rands = rand()%1000;
        EnQueue(queue,rands);
        GetHead(queue,res);
        printf("入队:%d 队头:%d\n",rands,res);  
    }
    while(!QueueEmpty(queue)){
        GetHead(queue,res);         
        DeQueue(queue,rands); 
        printf("队头:%d 出队: %d\n",res,rands);   
    }
    system("pause");
    return 0;        
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值