基于 Linux 的链表队列实现代码

/*************************************************************************
  > File Name: linkqueue.c
  > Author: Wenfei6316
  > Mail: [email protected] 
  > Created Time: 2018年06月19日 星期二 08时01分25秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef enum{false, true} bool;
typedef int data_t;
typedef struct LinkNode
{
	data_t data;
	struct LinkNode *next;
}LinkNode, *LinkQueue;

typedef struct
{
	LinkQueue front, rear;
}HeadQueue;

HeadQueue *CreateEmptyQueue(void);
bool EmptyLinkQueue(HeadQueue *queue);
void EnQueue(HeadQueue *queue, data_t value);
void DeQueue(HeadQueue *queue, data_t *value);
void PrintQueue(HeadQueue *queue);
bool ClearLinkQueue(HeadQueue *queue);
bool DestroyLinkQueue(HeadQueue *queue);

int main(int argc, const char *argv[])
{
	data_t data;
	int i;
	HeadQueue *queue;
	queue = CreateEmptyQueue();

	EnQueue(queue, 20);
	EnQueue(queue, 30);

	DeQueue(queue, &data);
	printf("data is %d\n", data);
	DeQueue(queue, &data);
	printf("data is %d\n", data);
	DeQueue(queue, &data);
	printf("data is %d\n", data);

	for (i=0; i<20; i++)
		EnQueue(queue, i);
	PrintQueue(queue);
	for (i=0; i<25; i++)
	{
		DeQueue(queue, &data);
		printf("data is %d\n", data);
	}

	if (DestroyLinkQueue(queue))
		printf("DestroyLinkQueue success!\n");
	return 0;
}

//创建空链表队列
HeadQueue *CreateEmptyQueue(void)
{
	HeadQueue *queue;
	queue = (HeadQueue *)malloc(sizeof(HeadQueue));
	if (queue == NULL)
	{
		perror("Create empty queue failed");
		exit(EXIT_FAILURE);
	}
	queue->rear = queue->front = NULL;

	return queue;
}

//判断是否为空链表队列
bool EmptyLinkQueue(HeadQueue *queue)
{
	if (queue == NULL)
	{
		printf("Empty link queue error!\n");
		exit(EXIT_FAILURE);
	}
	return queue->front == NULL ? true : false;
}

//增加队列元素
void EnQueue(HeadQueue *queue, data_t value)
{
	LinkQueue new;
	if (queue == NULL)
	{
		printf("EnQueue Error!\n");
		return ;
	}
	new = (LinkQueue)malloc(sizeof(LinkNode));
	if (new == NULL)
	{
		perror("Insert value failed");
		return ;
	}
	new->data = value;
	new->next = NULL;

	if (EmptyLinkQueue(queue))
		queue->front = queue->rear = new;
	else
	{
		queue->rear->next = new;
		queue->rear = new;
	}

	return ;
}

//删除队列元素
void DeQueue(HeadQueue *queue, data_t *value)
{
	*value = 0;
	LinkQueue remove;
	if (queue == NULL)
	{
		printf("DeQueue error!\n");
		return ;
	}

	if (EmptyLinkQueue(queue))
	{
		printf("queue is empty!\n");
		return ;
	}
	remove = queue->front;
	queue->front = remove->next;

	if (queue->front == NULL)
		queue->rear = NULL;

	*value = remove->data;
	free(remove);

	return ;
}

//遍历队列元素
void PrintQueue(HeadQueue *queue)
{
	LinkQueue node;
	printf("queue = {");
	node = queue->front;
	if (node == NULL)
	{
		printf("}\n");
		return ;
	}
	while (node != NULL)
	{
		printf("%d,", node->data);
		node = node->next;
	}
	printf("\b}\n");

	return ;

}

//清空队列元素
bool ClearLinkQueue(HeadQueue *queue)
{
	LinkQueue remove;
	remove = queue->front;
	while (remove != NULL)
	{
		queue->front = queue->front->next;
		free(remove);
		remove = queue->front;
	}
	queue->front = NULL;
	queue->rear = NULL;

	return true;
}

//销毁队列
bool DestroyLinkQueue(HeadQueue *queue)
{
	if (queue != NULL)
	{
		ClearLinkQueue(queue);
		free(queue);
		return true;
	}
	else
	{
		printf("DestroyLinkQueue error!\n");
		return false;
	}
}

猜你喜欢

转载自blog.csdn.net/wenfei11471/article/details/80729214
今日推荐