队列-链式

 def.h
#include "stdio.h"
#include "stdlib.h"
#define ERROR -1
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define  OK 1
typedef int Status;
typedef char ElemType;


1,h

//队列是一种限制的线性表。
//在队尾插入,就是入队,在队头删除,就是出队

typedef struct QNode {
	ElemType data;
	struct QNode *next;
}*QueuePtr;


typedef struct  {
	QueuePtr front;//队头指针
	QueuePtr tail;//队尾指针
}LinkQueue;

1.c

Status InitQueue (LinkQueue *queue) {
	queue->front = (QueuePtr)malloc (sizeof (struct QNode));//带有节点的
	if (!queue->front) {
		exit (OVERFLOW);
	}
	queue->tail = queue->front;
	queue->front->next = NULL;
	return OK;
}
//销毁队列
Status DestroyQueue (LinkQueue *queue) {
	while (queue->front) {
		queue->tail = queue->front->next;
		free (queue->front);
		queue->front = queue->tail;
	}//最后的结果是queue->front = queue->tail = NULL;
	return OK;
}
//置空队列
Status ClearQueue (LinkQueue *queue) {
	QueuePtr list = queue->front->next;
	while (list) {
		queue->tail = list->next;
		free (list);
		list  = queue->tail;
	}
	queue->front->next = NULL;
	queue->tail = queue->front;
	return OK;
}
//队列是否为空
Status QueueEmpty (LinkQueue *queue) {
	return queue->front == queue->tail?TRUE:FALSE;
}
//求出队列的长度
int QueueLength (LinkQueue *queue) {
	int count = 0;
	QueuePtr list = queue->front;
	while (list != queue->tail) {
			count++;
			list = list->next;
	}
	return count;
}
//得到队头的元素
Status GetHead (LinkQueue *queue,ElemType *e) {
	if (queue->front == queue->tail) {
		return ERROR;
	}else {
		*e = queue->front->next->data;
		return OK;
	}
}
//插入元素

Status EnQueue (LinkQueue *queue,ElemType e) {
	QueuePtr list = (QueuePtr)malloc(sizeof (struct QNode));
	if (!list) {
		exit (OVERFLOW);
	}
	list->data = e;
	list->next = NULL;
	queue->tail->next = list;
	queue->tail = list;
	return OK;
}

Status DeQueue (LinkQueue *queue,ElemType *e) {
	if (queue->front == queue->tail) {
		return ERROR;
	}else {
		QueuePtr list = queue->front->next;
		*e = list->data;
		queue->front->next = list->next;
		if (list == queue->tail) {
			queue->tail = queue->front;
		}
		free (list);
		return OK;
	}
}

Status QueuePrint (LinkQueue *queue,void (*vi)(ElemType)) {
	QueuePtr list = queue->front->next;
	while (list) {
		vi(list->data);
		list = list->next;
	}
	printf ("\n");
	return OK;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值