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

来源:互联网 发布:成都正规java培训机构 编辑:程序博客网 时间:2024/04/30 19:38

  • 链式存储队列的存储结构
    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