队列(三):链式存储队列

本文介绍了链式存储队列的结构定义,并详细展示了包括建立、判断空队列、输出队列、读取队首元素、插入元素和删除队首元素等基本运算的实现。还提供了一个简单的测试主函数来演示这些操作。
摘要由CSDN通过智能技术生成

  • 链式存储队列的存储结构
    typedef int datatype;
    typedef struct link_node{
    	datatype info;
    	struct link_node *next;
    }node;
    typedef struct{
    	node *front, *rear;
    }queue;
  • 基本运算实现
    queue *init();	//建立一个空的链式队列
    int empty(queue qu);	//判断链式队列是否为空
    void display(queue *qu);	//输出链式队列中各个结点的值
    datatype read(queue qu);	//取得链式队列的队首结点值
    queue *insert(queue *qu, datatype x);	//向链式队列中插入一个值为x的结点
    queue *dele(queue *qu);		//删除链式队列中的队首结点
    具体函数
    #include "lnkqueue.h"
    #include <stdio.h>
    #include <stdlib.h>
    /************************************************************************/
    /* 函数功能: 建立一个空的链式队列  */
    /* 函数参数:   无*/
    /* 函数返回值:  指向queue类型变量的指针 */
    /* 文件名: lnkqueue.c ,函数名: init()*/
    /************************************************************************/
    queue *init()
    {
    	queue *qu;
    	qu=(queue*)malloc(sizeof(queue));
    	qu->front=NULL;
    	qu->rear=NULL;
    	return qu;
    }
    /************************************************************************/
    /* 函数功能: 判断链式队列是否为空  */
    /* 函数参数:   queue类型变量qu*/
    /* 函数返回值:   int类型*/
    /* 文件名:  lnkqueue.c,函数名: empty()*/
    /************************************************************************/
    int empty(queue *qu)
    {
    	return (qu->front?0:1);	//队列空返回1,队列非空返回0
    }
    /************************************************************************/
    /* 函数功能:  输出链式队列中各个结点的值 */
    /* 函数参数:   指向queue类型变量的指针qu*/
    /* 函数返回值:   空*/
    /* 文件名: lnkqueue.c ,函数名:diaplay() */
    /************************************************************************/
    void display(queue *qu)
    {
    	node *p;
    	p=qu->front;
    	if (!p)
    	{
    		printf("\n链式队列为空!");
    	}
    	while (p)
    	{
    		printf("%5d",p->info);
    		p=p->next;
    	}
    	printf("\n");
    }
    /************************************************************************/
    /* 函数功能:  取得链式队列的队首结点值 */
    /* 函数参数:   queue类型变量qu*/
    /* 函数返回值:   datatype类型*/
    /* 文件名: lnkqueue.c ,函数名: read()*/
    /************************************************************************/
    datatype read(queue *qu)
    {
    	if (!qu->front)
    	{
    		printf("\n链式队列为空!");
    		exit(1);
    	}
    	return ((qu->front)->info);
    }
    /************************************************************************/
    /* 函数功能:  向链式队列中插入一个值为x的结点 */
    /* 函数参数:   指向queue类型变量的指针qu,datatype类型变量x*/
    /* 函数返回值:   指向queue类型变量的指针*/
    /* 文件名:  lnkqueue.c,函数名:insert() */
    /************************************************************************/
    queue *insert(queue *qu, datatype x)
    {
    	node *p;
    	p=(node*)malloc(sizeof(node));
    	p->info=x;
    	p->next=NULL;
    	if (qu->front==NULL)
    	{
    		qu->front=p;
    		qu->rear=p;
    	}
    	else
    	{
    		qu->rear->next=p;
    		qu->rear=p;
    	}
    	return qu;
    }
    /************************************************************************/
    /* 函数功能: 删除链式队列中的队首结点 */
    /* 函数参数:  指向queue类型变量的指针qu */
    /* 函数返回值:  指向queue类型变量指针 */
    /* 文件名: lnkqueue.c ,函数名: dele()*/
    /************************************************************************/
    queue *dele(queue *qu)
    {
    	node *q;
    	if(!qu->front)
    	{
    		printf("\n链式队列为空,无法进行删除操作!");
    		return qu;
    	}
    	q= qu->front;
    	qu->front=q->next;
    	free(q);
    	if (qu->front==NULL)
    	{
    		qu->rear=NULL;	//队列最后一个结点被删除后,队列变为空
    	}
    	return qu;
    }
  • main测试函数
    #include <stdlib.h>
    #include <stdio.h>
    #include "lnkqueue.h"
    
    void main(void)
    {
    	queue lnkqueue, *p_lnkqueue;
    	p_lnkqueue = &lnkqueue;
    	//初始化顺序栈
    	p_lnkqueue = init();
    
    	int choosecase = 0;
    	int x;
    	puts("进队请输入0,出队请输入1");
    	while((scanf("%d", &choosecase)) == 1)
    	{
    		switch (choosecase)
    		{
    		case 0:
    			puts("输入进队元素x");
    			scanf("%d", &x);
    			insert(p_lnkqueue, x);
    			display(p_lnkqueue);
    			break;
    		case 1:
    			printf("出队的元素为%d\n",read(p_lnkqueue));
    			dele(p_lnkqueue);
    			display(p_lnkqueue);
    			break;
    		default:
    			break;
    		}
    		puts("进队请输入0,出队请输入1");
    	}
    	system("pause");
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值