数据结构之队列(链表实现)

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
// 队列的节点 
struct Node
{
        int data;
        struct Node* next;
};
// 队首队尾指针 
struct Queue
{
        struct Node* front;
        struct Node* rear;
        int size;
};
//初始化 
void QueueInit(struct Queue* queue)
{
        queue->front = NULL;
        queue->rear = NULL;
        queue->size = 0;
}
//队空判断 
int QueueEmpty(struct Queue* queue)
{
        return (queue->size == 0);
}
//入队 
void QueuePush(struct Queue* queue, const int data)
{
        struct Node* node;
        node = (struct Node*)malloc(sizeof(struct Node));
        assert(node != NULL);
        
        node->data = data;
        node->next = NULL;
        
        if(QueueEmpty(queue))
        {
            queue->front = node;
            queue->rear = node;
        }
        else
        {            
            queue->rear->next = node;
            queue->rear = node;
        }
        ++queue->size;
}
//出队 
int QueuePop(struct Queue* queue, int* data)
{
        if (QueueEmpty(queue))
        {
                return 0;
        }
        struct Node* tmp = queue->front;
        *data = queue->front->data;//保存出队元素 
        queue->front = queue->front->next;
        free(tmp);
        --queue->size;
        return *data;
}
//清空
void ClearQueue(struct Queue* queue){
	struct Node* tmp;
	while(queue->front!=queue->rear)
	{
		tmp = queue->front;
		queue->front = queue->front->next;
		queue->size--;
		free(tmp);
	}
	queue->front=queue->rear=NULL;
}
//销毁 
void QueueDestroy(struct Queue* queue)
{
     struct Node* tmp;
     while(queue->front)
     {
         tmp = queue->front;
         queue->front = queue->front->next;
         queue->size--;
         free(tmp);
     }
}
//得到队头元素 
void GetHead(struct Queue* queue){
	struct Node* p=queue->front;
	printf("队头元素为:%d\n",p->data); 
}
//获取队列长度 
int GetLen(struct Queue* queue){
	return queue->size;
}
//遍历输出 
void print(struct Queue* queue){
	int len = GetLen(queue)+1;
    struct Node* p=queue->front;
    printf("此时队列中元素为:");
    while (len)
    {
            printf("%d ", p->data);
            p=p->next;
            len--;
    }
    printf("\n");
}
//菜单 
void menu(){
	printf("-----------------------------\n");
	printf("-1.清空队列       2.销毁队列-\n");
	printf("-3.入队           4.出队-----\n");
	printf("-5.获取队头元素   6.遍历输出-\n");
	printf("-7.获取队列长度   8.正常退出-\n");
	printf("-----------------------------\n");
}
int main(void)
{
        struct Queue queue;
        QueueInit(&queue);
 		while(1){
 			menu();
 			printf("请输入选项:\n");
	 		int option;
	 		scanf("%d",&option);
	 		if(option==8) break;
	 		switch(option){
	 			case 1:ClearQueue(&queue);break;
	 			case 2:QueueDestroy(&queue);break;
	 			case 3:
			        int n;
			        printf("请输入要存入数字的个数及数字:\n");
			        scanf("%d",&n);
			        for(int i=0;i<n;i++){
			        	int j;
			        	scanf("%d",&j);
			        	QueuePush(&queue, j);
					}
					break;
	 			case 4:
	 				int i;
					QueuePop(&queue,&i);
					break;
	 			case 5:GetHead(&queue);break;
	 			case 6:print(&queue);break;
	 			case 7:
	 				int len = GetLen(&queue);
        			printf("队列长度为:%d\n",len);
					break;
			 }
		}
        return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值