以下是我用c语言实现数据结构中的队列、
#pragma once #ifndef _ELEMTYPE_H #define _ELEMTYPE_H typedef int Elemtype; #endif #ifndef _FUNCTIONPOINT_H #define _FUNCTIONPOINT_H typedef void(* Function)(Elemtype e); #endif #ifndef _STDLIB_H #define _STDLIB_H #include#endif #ifndef _QUEUE_H #define _QUEUE_H typedef struct Node { Elemtype Data; struct Node * p_next; }Node,* QueuePtr; typedef struct { QueuePtr p_front; QueuePtr p_rear; }Queue; #endif
#include "stdafx.h" bool InitQueue(Queue &Q); bool DestoryQueue(Queue &Q); bool ClearQueue(Queue &Q); bool QueueEmpty(const Queue &Q); int QueueLength(const Queue &Q); bool GetHead(const Queue &Q,Elemtype &e); bool EnterQueue(Queue &Q,Elemtype e); bool QuitQueue(Queue &Q,Elemtype &e); bool QueueTraverse(Queue &Q,Function CallBack);
#include "Queue.h" bool InitQueue(Queue &Q) { Q.p_front=(QueuePtr)malloc(sizeof(Node)); if(Q.p_front==NULL) return false; Q.p_rear=Q.p_front; Q.p_front->p_next=NULL; return true; } bool DestoryQueue(Queue &Q) { while (Q.p_front->p_next!=NULL) { Q.p_rear=Q.p_front->p_next; free(Q.p_front); Q.p_front=Q.p_rear; } free(Q.p_front); return true; } bool ClearQueue(Queue &Q) { if(Q.p_front==Q.p_rear) return false; else { QueuePtr temp=Q.p_front->p_next; while(temp->p_next!=NULL) { Q.p_rear=temp->p_next; free(temp); temp=Q.p_rear; } free(temp); Q.p_rear=Q.p_front; return true; } } bool QueueEmpty(const Queue &Q) { if(Q.p_front==Q.p_rear) return true; else return false; } int QueueLength(const Queue &Q) { if(Q.p_front==Q.p_rear) return 0; else { int Length=1; QueuePtr temp=Q.p_front->p_next; while(temp->p_next!=NULL) { Length++; temp=temp->p_next; } return Length; } } bool GetHead(const Queue &Q,Elemtype &e) { if(Q.p_front==Q.p_rear) { e=NULL; return false; } else { e=Q.p_front->p_next->Data; return true; } } bool EnterQueue(Queue &Q,Elemtype e) { QueuePtr temp=(QueuePtr)malloc(sizeof(Node)); temp->Data=e; Q.p_rear->p_next=temp; temp->p_next=NULL; Q.p_rear=temp; return true; } bool QuitQueue(Queue &Q,Elemtype &e) { if(Q.p_front==Q.p_rear) { e=NULL; return false; } else { QueuePtr temp=Q.p_front->p_next; e=temp->Data; Q.p_front->p_next=temp->p_next; if(temp==Q.p_rear) Q.p_rear=Q.p_front; free(temp); return true; } } bool QueueTraverse(Queue &Q,Function CallBack) { if(Q.p_front==Q.p_rear) return false; else { QueuePtr temp=Q.p_front->p_next; if(temp==Q.p_rear) { CallBack(temp->Data); return true; } else { while(temp->p_next!=NULL) { CallBack(temp->Data); temp=temp->p_next; } CallBack(temp->Data); return true; } } }