(链式队列)编程实现功能:输入数字时将数据入队,输入字母时将数据出队。

更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢!

链式队列头文件:

//  描述: 通用型的链式队列
#ifndef LINKQUEUE_H
#define LINKQUEUE_H

#include 
#include 
#include 

#ifndef LINKQUEUE_NODE
#define LINKQUEUE_NODE int
#endif
// 链式队列存储的元素类型,默认是int
typedef LINKQUEUE_NODE datatype;

// 链式队列节点
struct node
{
	datatype data;
	struct node *next;
};

// 链式队列的管理结构体
typedef struct
{
	struct node *front;//队首
	struct node *rear;//队尾
	int size;//队列大小
}linkqueue;


// 队列初始化
static linkqueue *init_queue()
{
	linkqueue *q = malloc(sizeof(linkqueue));

	if(q != NULL)
	{
		q->front = NULL;
		q->rear  = NULL;
		q->size  = 0;
	}
	return q;
}

// 判断队列是否为空
static bool empty(linkqueue *q)
{
	return q->size == 0;
}

// 入队(紧随尾后)
static void en_queue(linkqueue *q, datatype data)
{
	struct node *new = malloc(sizeof(struct node));
	if(new != NULL)
	{
		new->next = NULL;
		new->data = data;
	}

	if(empty(q))//队列空
	{
		q->front = new;//队首就是刚创建的节点new
	}

	else//队列不空
	{
		q->rear->next = new;//队尾的下一个指向new
	}	
	
	q->rear = new;//此时将队尾指向new
	q->size++;//队列大小 +1
}

// 出队(从队头出发)
static struct node *out_queue(linkqueue *q)
{
	if(empty(q))//判断队列是否为空
	{	
		return NULL;	
	}
	else if(q->size == 1)//队列只有一个元素
	{
		q->rear = NULL;
	}
	else
	{
		struct node *p = q->front;//定义节点指向队头
		q->front = q->front->next;//队头指向队头的下一个元素(新队头)
		q->size--;//队列大小 -1

		p->next = NULL;//节点指向NULL(原队头消失)
		return p;//返回出队后的新队列
	}
}

// 取队头元素(不出队)
struct node *front(linkqueue *q)
{

	if(!empty(q))
	{
		return NULL;
	}
	
	else
	{
		return q->front;
	}
}


// 获取当前队列元素总数
static int size(linkqueue *q)
{
	return q->size;
}


// 销毁队列(回归初始化状态)
static void destroy(linkqueue *q)
{
	if(empty(q))
	{
		return;
	}
	struct node *p = q->front;//定义节点p 指向队头
	while(p!=NULL)
	{
		struct node *next = p->next;//定义节点next 指向节点p的下一位
		free(p);//释放掉节点P
		p = next;//将节点p指向next(后移一位)
	}
	q->front = NULL;//(初始状态)
	q->rear  = NULL;
	q->size  = 0;
}


// 遍历
static void travel(linkqueue *q, void (*handler)(datatype data))
{
	if(empty(q))
	{
		return;
	}

	struct node *p = q->front;//定义节点p 指向队头
	while(p != NULL)
	{
		// 访问节点数据
		handler(p->data);

		// 指向下一个节点(后移一位)
		p = p->next;
	}
}

#endif

main函数:

#include 
//#define LINKQUEUE_NODE char
#include "linkqueue.h"

void show(int data)
{
	printf("%d\t", data);
}

int main(int argc, char **argv)
{
	// 初始化一个空队列
	linkqueue *q = init_queue();
	printf("请输入输入数据\n");

	// 不断输入数据
	int n;
	while(1)
	{
		// 用户输入数字
		if(scanf("%d", &n) == 1)
		{
			printf("入队:");
			//将新节点入队
			en_queue(q, n);
		}

		// 用户输入非数字
		else
		{
			// 清空缓冲区中所有的非数字字符
			while(getchar()!='\n');

			// 出队
			struct node *tmp =  out_queue(q);
			if(!tmp)
				printf("出队失败\n");
			else
				printf("出队:%d\n",tmp->data);
		}
		
		travel(q, show);//遍历并显示元素值
	}
	return 0;
}

更多资料请点击:我的目录

你可能感兴趣的:(数据结构)