zoukankan      html  css  js  c++  java
  • (C语言队列的顺序实现(数据结构十)

    1.数据类型定义

    在代码中为了清楚的表示一些错误和函数运行状态,我们预先定义一些变量来表示这些状态。在head.h头文件中有如下定义:

    //定义数据结构中要用到的一些变量和类型
    #ifndef HEAD_H
    #define HEAD_H
    
    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    
    #define TRUE  1
    #define FALSE 0
    #define OK    1
    #define ERROR  0
    #define INFEASIBLE -1
    #define OVERFLOW   -2    //分配内存出错
    
    typedef int  Status;     //函数返回值类型
    typedef int  ElemType;   //用户定义的数据类型
    
    #endif

    2.数据结构定义

    typedef struct Queue{
    	ElemType *data;
    	int      head;
    	int      tail;
    	int      capacity;
    }Queue,*pQueue;

    3.队列顺序实现

    LinerQueue.h中实现代码如下:

    #ifndef LINARQUEUE_H
    #define LINARQUEUE_H
    
    #include "head.h"
    
    #define  INIT_QUEUE_CAPACITY 100
    #define  QUEUE_ICREMENT_SIZE 10
    
    typedef struct Queue{
    	ElemType *data;
    	int      head;
    	int      tail;
    	int      capacity;
    }Queue,*pQueue;
    
    
    //初始化队列
    Status InitQueue(pQueue &Q){
    	Q=(pQueue)malloc(sizeof(Queue));
    	if(!Q) return OVERFLOW;
    	Q->data=(ElemType*)malloc(INIT_QUEUE_CAPACITY*sizeof(ElemType));
    	if(!Q->data) return OVERFLOW;
    	Q->head=0;
    	Q->tail=0;
    	Q->capacity=INIT_QUEUE_CAPACITY;
    	return OK;
    }
    //销毁队列
    Status DestroyQueue(pQueue &Q){
    	free(Q->data);
    	Q->head=0;
    	Q->tail=0;
    	Q->capacity=0;
    	free(Q);
    	Q=NULL;
    	return OK;
    }
    //清空队列
    Status ClearQueue(pQueue &Q){
    	if(Q==NULL) return ERROR;
    	Q->head=0;
    	Q->tail=0;
    	Q->capacity=INIT_QUEUE_CAPACITY;
    	return OK;
    }
    //队列是否为空
    Status QueueEmpty(pQueue Q){
    	if(Q==NULL) return ERROR;
    	return Q->head==Q->tail;
    }
    //队列长度
    Status QueueLength(pQueue Q){
    	if(Q==NULL) return ERROR;
    	return Q->tail-Q->head;
    }
    //取得队头数据
    Status GetHead(pQueue Q,ElemType &e){
    	if(QueueLength(Q)==0) return ERROR;
    	e=Q->data[Q->head];
    	return OK;
    }
    //从队尾插入数据
    Status InsertQueue(pQueue &Q,ElemType e){
    	if(QueueLength(Q)>=Q->capacity){
    		Q->data=(ElemType*)realloc(Q->data,(Q->capacity+QUEUE_ICREMENT_SIZE)*sizeof(ElemType));
    		if(!Q->data) return OVERFLOW;
    		Q->capacity+=QUEUE_ICREMENT_SIZE;
    	}
    	Q->data[Q->tail++]=e;
    	return OK;
    }
    //从队头删除数据
    Status DeleteQueue(pQueue &Q,ElemType &e){
    	if(Q==NULL) return ERROR;
    	GetHead(Q,e);
    	for (int i=Q->head+1;i<=Q->tail;i++)
    	{
    		Q->data[i-1]=Q->data[i];
    	}
    	Q->tail--;
    	return OK;
    }
    //用(*visit)()遍历队列
    Status QueueTraverse(pQueue &Q,Status (*visit)(ElemType)){
    	for (int i=Q->tail-1;i>=Q->head;i--)
    	{
    		(*visit)(Q->data[i]);
    	}
    	return OK;
    }
    Status print(ElemType e){
    	printf("%d->",e);
    	return true;
    }
    //输出队列
    Status printQueue(pQueue Q){
    	if(Q==NULL) return ERROR;
    	printf("
    tail->");
    	QueueTraverse(Q,print);
    	printf("head
    ");
    	return true;
    }
    
    #endif
    
    
    4.测试栈

    #include "LinerQueue.h"
    void main(){
    	pQueue Q;
    	InitQueue(Q);
    	for (int i=0;i<10;i++)
    	{
    		InsertQueue(Q,i);
    	}
    
    	ElemType e2;
    	DeleteQueue(Q,e2);
    	printf("
    删除队列头:%d",e2);
    
    
    	printQueue(Q);
    
    	printf("
    队列长度:%d",QueueLength(Q));
    	ElemType e;
    	GetHead(Q,e);
    	printf("
    队列头:%d",e);
    
    
    	ClearQueue(Q);
    	DestroyQueue(Q);
    	
    
    }
    
    
    
    5.测试结果

    删除队列头:0
    tail->9->8->7->6->5->4->3->2->1->head
    
    队列长度:9
    队列头:1
    
    






  • 相关阅读:
    EF性能优化-有人说EF性能低,我想说:EF确实不如ADO.NET
    MiniProfiler工具介绍(监控EF生成的SQL语句)--EF,迷你监控器,哈哈哈
    C# 数据库并发的解决方案(通用版、EF版)
    锁、C#中Monitor和Lock以及区别
    LINQ 如何动态创建 Where 子查询
    C# Npoi 实现Excel与数据库相互导入
    MVC ActionResult派生类关系图
    如何构造树状 JSON 数据 JSON-Tree
    如何构造分层次的 Json 数据
    如何使用 GroupBy 计数-Count()
  • 原文地址:https://www.cnblogs.com/whzhaochao/p/5023508.html
Copyright © 2011-2022 走看看