简单链式队列

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct item{
	int data;
} Item;

//节点结构 
typedef struct node{
	Item item;
	struct node *nextNode;
}Node, *queue;

//队列的链表结构 
typedef struct {
	queue front;
	queue rear;
} linkQueue;

//初始化 
void initQueue(linkQueue *q);

//入队 
void enQueue(linkQueue *q, Node *n);

//出队 
void DeQueue(linkQueue *q); 

//取得队头元素
void GetHead(linkQueue *q, Node *n); 

//取得队列长队
int QueueLength(linkQueue *q); 

//置空队列
void ClearQueue(linkQueue *q); 

//销毁队列
void DestroyQueue(linkQueue *q); 

void initQueue(linkQueue *q){
	Node *node = (Node *)malloc( sizeof(Node) );
	if(!node){
		fprintf(stderr, "初始化错误.");
		exit(EXIT_FAILURE); 
	} 
	node->nextNode = NULL;
	q->front = node;
	q->rear = node;
}

void enQueue(linkQueue *q, Item *e){
	//创建插入元素 
	Node *n = (Node *)malloc( sizeof(Node) );
	if(!n){
		fprintf(stderr, "入队失败.");
		exit(EXIT_FAILURE); 
	} 
	n->item = *e;
	n->nextNode = NULL;
	//把新节点赋给队尾元素的后继 
	q->rear->nextNode = n;
	//把新节点赋给 队尾指针 
	q->rear = n;		
}

void DeQueue(linkQueue *q, Item *e){
	//判断队列是否为空 
	if(q->front == q->rear){
		fprintf(stderr, "出对错误,队列为空");
		exit(EXIT_FAILURE); 
	}
	//保存出队元素 
	Node *outNode = q->front->nextNode;
	//重新赋值头指针的nextnode 
	q->front->nextNode = outNode->nextNode;
	//保存出队节点 
	*e = outNode->item;
	//判断出队后的队头是否等于队尾 
	if(q->rear == outNode){
		q->front = q->rear; 
	}
	//释放队头指针 
	free(outNode);
}

void GetHead(linkQueue *q, Item *e){
	if(q->front == q->rear){
		fprintf(stderr, "取头指针错误,队列为空");
		exit(EXIT_FAILURE);
	}
	Node *node = q->front->nextNode;
	*e = node->item;
}

int QueueLength(linkQueue *q){
	int i = 0;
	Node *node = q->front;
	while(node != q->rear){
		node = node->nextNode;
		i++;
	}
	return i;
}

void ClearQueue(linkQueue *q){
	q->rear = q->front;
	Node *node = q->rear->nextNode;
	q->rear->nextNode = NULL;
	Node *n ;
	while(node){
		n = node;
		node = node->nextNode;
		free(n);
	} 	
}

void DestroyQueue(linkQueue *q){
	while(q->front){
		q->rear= q->front->nextNode;
		free(q->front);
		q->front = q->rear;
	} 
}

int main(void){
	linkQueue q;
	
	initQueue(&q); 
	
	Item e = {
		e.data = 1
	};
	
	Item e1 = {
		e1.data = 2
	};
	
	Item e2 = {
		e2.data = 3
	};
	
	Item e3 = {
		e3.data = 4
	};
	
	enQueue(&q,&e);
	enQueue(&q,&e1);
	enQueue(&q,&e2);
	enQueue(&q,&e3);
	
	printf("队列长度:%d.\n", QueueLength(&q));
	
	Item e4;
	GetHead(&q,&e4);
	printf("取队头元素:%d.\n",e4.data);
	
	Item e5;
	DeQueue(&q, &e5);
	printf("出队元素:%d.\n", e5.data);
	
	ClearQueue(&q);
	
	Item e6;
	DeQueue(&q, &e6);
	printf("出队元素:%d.\n", e6.data);

	DestroyQueue(&q);	
	
	return 0; 
} 

  

posted @ 2013-03-24 23:04  chapterlin  阅读(128)  评论(0)    收藏  举报