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 Node{
    	ElemType data;
    	struct Node* next;
    }Node,*pNode;
    
    typedef struct LinkQueue{
    	pNode head;
    	pNode tail;
    	int  length;
    }LinkQueue,*pLinkQueue;

    3.队列链式实现

    LinkQueue.h代码实现如下:

    #ifndef LINKQUEUE_H
    #define LINKQUEUE_H
    
    #include "head.h"
    
    typedef struct Node{
    	ElemType data;
    	struct Node* next;
    }Node,*pNode;
    
    typedef struct LinkQueue{
    	pNode head;
    	pNode tail;
    	int  length;
    }LinkQueue,*pLinkQueue;
    
    //初始化队列
    Status InitQueue(pLinkQueue &Q){
    	Q=(pLinkQueue)malloc(sizeof(LinkQueue));
    	if(!Q) return OVERFLOW;
    	pNode p=(pNode)malloc(sizeof(Node));
    	if(!p) return OVERFLOW;
    	p->next=NULL;
    	Q->head=p;
    	Q->tail=p;
    	Q->length=0;
    	return OK;
    }
    
    //队列长度
    Status QueueLength(pLinkQueue Q){
    	if(Q==NULL) return ERROR;
    	return Q->length;
    }
    //队列是否为空
    Status QueueEmpty(pLinkQueue Q){
    	
    	return QueueLength(Q)==0;
    }
    
    
    
    //取得队头数据
    Status GetHead(pLinkQueue Q,ElemType &e){
    	if(QueueLength(Q)<1) return ERROR;
    	e=Q->head->next->data;
    	return true;
    }
    //从队尾插入数据
    Status InsertQueue(pLinkQueue &Q,ElemType e){
    	pNode q=Q->tail;
    	pNode p=(pNode)malloc(sizeof(Node));
    	p->data=e;
    	p->next=NULL;
    	Q->tail=p;
    	q->next=Q->tail;
    	Q->length++;
    	return true;
    }
    //从队头删除数据
    Status DeleteQueue(pLinkQueue &Q,ElemType &e){
    	if(QueueLength(Q)<1) return ERROR;
    	if(QueueLength(Q)==1){
    		e=Q->tail->data;
    	}else{
    		pNode p=Q->head;
    		Q->head=p->next;
    		e=Q->head->data;
    		free(p);
    	}
    	Q->length--;
    	return true;
    }
    //用(*visit)()遍历队列
    Status QueueTraverse(pLinkQueue &Q,Status (*visit)(ElemType)){
    	pNode p=Q->head;
    	do{
    		p=p->next;
    		(*visit)(p->data);
    	}while((p!=Q->tail));
    	return true;
    }
    Status print(ElemType e){
    	printf("%d<<",e);
    	return true;
    }
    //输出队列
    Status printQueue(pLinkQueue Q){
    	if(QueueLength(Q)<1) return ERROR;
    	printf("
    head<<");
    	QueueTraverse(Q,print);
    	printf("tail
    ");
    	return true;
    }
    //清空队列
    Status ClearQueue(pLinkQueue &Q){
    	while(!QueueEmpty(Q)){
    		ElemType e;
    		DeleteQueue(Q,e);
    	}
    	return OK;
    }
    //销毁队列
    Status DestroyQueue(pLinkQueue &Q){
    	ClearQueue(Q);
    	free(Q->head);
    	free(Q->tail);
    	free(Q);
    	Q=NULL;
    	return OK;
    }
    
    #endif
    4.测试队列

    #include "LinkQueue.h"
    void main(){
    	pLinkQueue Q;
    	InitQueue(Q);
    	for (int i=0;i<10;i++)
    	{
    		InsertQueue(Q,i);
    	}
    
    	 printQueue(Q);
    
    	 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.测试结果如下

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



  • 相关阅读:
    hdu 3507 Print Article —— 斜率优化DP
    bzoj 1096 仓库建设 —— 斜率优化DP
    ORDER BY 高级用法之CASE WHEN
    union和union all 的区别
    Ubuntu 链接ln的使用:创建和删除符号链接
    python中set和frozenset方法和区别
    python之sys模块详解
    odoo 8.0 多核启用
    Odoo 中的widget
    Odoo 在 Ubuntu 环境下性能调优
  • 原文地址:https://www.cnblogs.com/whzhaochao/p/5023507.html
Copyright © 2011-2022 走看看