循环链表

#include<stdio.h>  
#include<malloc.h>        //包含了malloc函数  
int flag = 0;
/* 
 *循环队列,用数组实现 
 */  
//队列结构体定义  
typedef struct Queue  
{ 
    int * pBase;    //用于动态分配内存,pBase保存数组的首地址  
    int front;      //指向头结点  
    int rear;       //指向最后一个元素的下一结点  
} QUEUE;
//函数声明  
void initQueue(QUEUE * pQueue);                 //队列初始化的函数  
bool isEmpty(QUEUE * pQueue);                   //判断队列是否为空的函数  
bool isFull(QUEUE * pQueue);                    //判断队列是否满的函数  
bool enQueue(QUEUE * pQueue, int value);        //入队的函数   
bool outQueue(QUEUE * pQueue, int * pValue);    //出队的函数,同时保存出队的元素  
void traverseQueue(QUEUE * pQueue);             //遍历队列的函数  
void clearQueue(QUEUE * pQueue);
//destroy Queue
void destroyQueue(QUEUE * pQueue);

/* 
 *主程序 
 */  
int main(void)  
{  
    int value;          //用于保存出队的元素  
    //创建队列对象  
    QUEUE queue;  
    //调用初始化队列的函数  
    initQueue(&queue);  
    //调用入队函数  
    enQueue(&queue, 1);  
    enQueue(&queue, 2);  
    enQueue(&queue, 3);  
    enQueue(&queue, 4);  
    enQueue(&queue, 5);  
    enQueue(&queue, 6);  
    enQueue(&queue, 7);  
    enQueue(&queue, 8);  
    //调用遍历队列的函数  
    traverseQueue(&queue);  
    //调用出队函数  
    if(outQueue(&queue, &value))  
    {  
        printf("出队一次,元素为:%d\n", value);  
    }  
    traverseQueue(&queue);  
    if(outQueue(&queue, &value))  
    {  
        printf("出队一次,元素为:%d\n", value);  
    }  
    traverseQueue(&queue); 
    clearQueue(&queue);
    traverseQueue(&queue);
    destroyQueue(&queue);
    getchar(); 
    return 0;  
}  
/* 
 *初始化函数的实现 
 */  
void initQueue(QUEUE * pQueue)  
{  
    //分配内存  数组大小为6 
    pQueue->pBase = (int *)malloc(sizeof(int) * 6);          //分配6个int型所占的空间  
    pQueue->front = 0;       //初始化时,front和rear值均为0  
    pQueue->rear = 0;  
    return;  
}  
/* 
 *入队函数的实现 
 */  
bool enQueue(QUEUE * pQueue, int value)  
{  
    if(isFull(pQueue))  
    {
    	printf("%d",pQueue->rear);
    	if(flag == 0){
    		pQueue->pBase[pQueue->rear] = value;
		}
        printf("队列已满,不能再插入元素了!\n");  
        flag = 1;
        return false;  
    }  
    else  
    {  
    	int temp = pQueue->rear;
        //向队列中添加新元素  每一次加在队尾 
        pQueue->pBase[pQueue->rear] = value;
        //将rear赋予新的合适的值  
        
        pQueue->rear = (pQueue->rear+1) % 6;  
        return true;  
    }  
}  
/* 
 *出队函数的实现 
 */  
bool outQueue(QUEUE * pQueue, int * pValue)  
{  
    //如果队列为空,则返回false  
    if(isEmpty(pQueue))  
    {  
        printf("队列为空,出队失败!\n");  
        return false;  
    }  
    else  
    {  
        *pValue = pQueue->pBase[pQueue->front];       //先进先出  
        pQueue->front = (pQueue->front+1) % 6;      //移到下一位置  
        return true;  
    }  
}  
/* 
 *遍历队列的函数实现 
 */  
void traverseQueue(QUEUE * pQueue)  
{  
    int i = pQueue->front;           //从头开始遍历  
    printf("遍历队列:\n");  
    while(i != pQueue->rear)     //如果没有到达rear位置,就循环  
    {  
        printf("%d  ", pQueue->pBase[i]);  
        i = (i+1) % 6;              //移到下一位置  
    }
    printf("%d\n",pQueue->pBase[i]);  
    return;  
}  
/* 
 *判断队列是否满的函数的实现 
 */  
bool isFull(QUEUE * pQueue)  
{  
    if((pQueue->rear+1) % 6 == pQueue->front)     //队列满  
        return true;  
    else  
        return false;  
}  
/* 
 *判断队列是否为空函数的实现 
 */  
bool isEmpty(QUEUE * pQueue)  
{
    if(pQueue->front == pQueue->rear)  
        return true;
    else  
        return false;  
}
void clearQueue(QUEUE * pQueue){
	///这个数组的话可能只好置为0值这样子 
	int i = pQueue->front;
	while(i != pQueue->rear)     //如果没有到达rear位置,就循环  
    {  
        pQueue->pBase[i] = 0;  
        i = (i+1) % 6;              //移到下一位置  
    }
    pQueue->pBase[i] = 0;
}
/*
	销毁队列 
*/
void destroyQueue(QUEUE * pQueue){
//	QUEUE * tempQ = &pQueue;
	if(pQueue!=NULL){
		free(pQueue->pBase);
	}
	if(pQueue->pBase[0]!= 0){
		printf("队列成功销毁!\n");
		pQueue = NULL;
		pQueue = NULL;
	}
	else{
		printf("%d\n",pQueue->pBase[0]);
	//	printf("队列销毁失败!\n");
	}
	
/*	if((pQueue->)){
		printf("销毁失败!\n");
		exit(0);
	}
	else{
		printf("队列成功销毁!\n");
		pQueue = NULL;
	}*/
	
} 
注:本人不是很清楚为什么会有双向循环队列这个东西,但是具体在某些方面肯定更加方便 比如可以反向遍历 像两个方向搜索等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值