数据结构篇——链队列

       队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表,链队列就是队列的链式存储。进行插入操作的端称为队尾,进行删除操作的端称为队头。

---------------------------------------------------我是分各线--------------------------------------------------------------

首先定义链队列的数据结构,节点和队列分开,方便理解。

typedef int ElementType;
typedef struct Node
{
    ElementType data;
    struct Node *next;
} QNode;
typedef struct
{
    QNode *front; //队首
    QNode *rear;  //队尾
} LinkQueue;

 创建一个不带头节点的队列

LinkQueue* createQueue(){
	LinkQueue *Q = (LinkQueue *)malloc(sizeof(LinkQueue));
	Q->front = NULL;
	Q->rear = NULL;
	return Q;
}

入队,即在队尾插入新的数据,若内存空间已满,则返回插入失败。

int push(LinkQueue *Q, ElementType x){
	QNode *n = (QNode *)malloc(sizeof(QNode));
	if (n == NULL)
		return 0;
	n->data = x;
	n->next = NULL;
	// 若此时的队列是空的则操作有所不同 
	if (Q->front == NULL) Q->front = n;
	else Q->rear->next = n;
	Q->rear = n;
	return 1;
}

判断队列是否为空

int empty(LinkQueue *Q){
	return Q->front == NULL ? 1 : 0;
}

出队,删除队头节点,将队头指针向后一位,若队列为空则无法出队,返回0

int pop(LinkQueue *Q){
	if (empty(Q))
		return 0;
	Q->front = Q->front->next;
	return 1;
}

获取队头元素

ElementType front(LinkQueue *Q){
	return Q->front->data;
}

清空队列和销毁队列

void clearQueue(LinkQueue *Q){
	while (Q->front != NULL){  // 将队列中的节点一个一个取出来释放掉 
		QNode *n = Q->front->next;
		free(Q->front);
		Q->front = n;
	}
	Q->rear = NULL;
}

void destroyQueue(LinkQueue *Q){
	while (Q->front != NULL){
		QNode *n = Q->front->next;
		free(Q->front);
		Q->front = n;
	}
	free(Q);
}

测试函数,用于对上述功能进行测试

void test(){
	LinkQueue *Q = createQueue();
	if (empty(Q))
		printf("this is an empty queue!\n");
	for (int i=0; i<=10; i++){
		push(Q, i);
		printf("%2d join the queue!\n", i);
	}
	ElementType x = front(Q);
	if (pop(Q))
		printf("%2d is out of the queue!\n", x);
	clearQueue(Q);
	if (empty(Q))
		printf("the queue is already clear!\n");
	destroyQueue(Q);
}

测试结果如下图所示

数据结构篇——链队列_第1张图片

 仅本人学习笔记,欢迎留言讨论。

你可能感兴趣的:(数据结构,c语言)