数据结构之链队(队列)

时间:2021-05-14 10:24:33

2018/3/20

数据结构

1.队列

队列是一种特殊的线性表,相较于栈来说,队列是后进先出的,而栈是后进后出的,队列的特点

是多了两个指针,一个是指向队头,一个指向队尾

2.对于队列相关操作的介绍和认识

part1:新建队列

实现队列的新建,只要把队列的队头指针和队尾指针都指向空

part2:判断队列是否为空

判断队头指针和队尾指针是否都为空,如果都为空,说明队列为空

part3:实现取得队首元素

前提条件:队列不为空,然后实现取得队头所在指针的数据域

part4:展示队列

遍历队列,将一个所创建的结点放在队首,遍历取数

part5:插入数字

前提条件:判断队列是否为空,判断队列如果只有一个元素的情况,将某个结点放在队尾处

(尾插法:将尾结点的后继给予,然后移动尾指针)

part6:出队

前提条件:判断队列是否为空·,判断队列只有一个元素的情况,然后将队首指针后移

释放待删除结点

//链队列的简单使用
//使用队首队尾指针的指向来表示队首元素和队尾元素

//头文件
struct Qnode//创建结点
{
	int data;//数据域
	struct Qnode* next;//指针域
};
struct Queue//创建前后指针
{
	struct Qnode*front;
	struct Qnode*rear;
};
//1.新建队列
struct Queue *init_queue(struct Queue *q)//使用指针进行操作
{
	//q = (struct Queue *)malloc(sizeof(struct Queue));
	q->front = NULL;
	q->rear = NULL;
	return q;
}
//2.判断是否为空,采用返回值1 0来判断
int IsNotEmpty(struct Queue *q)
{
	if ((q->front == NULL)&&(q->rear==NULL))
	{
		return 0;//为空
	}
	else
	{
		return 1;
	}
}
//3.取得队首元素

struct Queue*catch_Queue(struct Queue *q)
{
		if (IsNotEmpty(q)==0)
	{
			printf("取数错误");
	}
		else
	{
			printf("该队首元素为%2d", q->front->data);
	}
		return q;
}
//展示队列
int disp_queue(struct Queue *q)
{
	struct Qnode *p;
	p = q->front;//p为队首元素,被队首指针所指
	printf("\n[队列头]");
	//开始遍历
	while (p!= NULL)
	{
		printf("(%d)-->", p->data);
		p = p->next;
	}
	printf("[队列尾]\n");
	return 1;
}
//插入数操作
struct Queue *append_queue(struct Queue *q, int num)
{
	struct Qnode* p;//插入结点
	p = (struct Qnode*)malloc(sizeof(struct Qnode));
	p->data = num;
	p->next = NULL;
	//判断是否为一个结点的情况
	if (q->front==NULL)
	{
		q->front =p;
		q->rear = p;
	}
	//正常情况
	else
	{
		q->rear->next = p;//将尾指针的后继给了p(尾插法)
		q->rear = p;//移动尾指针
	}
	return q;
}
//出队操作
struct Queue* delete_queue(struct Queue *q)
{
	struct Qnode* p;
	//判断是否为空
	if (IsNotEmpty(q) == 0)
	{
		printf("队列为空\n");
		return q;
	}
	else
	{
		p = q->front;//将p放在队首的位置
		if (q->front == q->rear)//头指针等于尾指针,说明只有一个结点
		{
			q->front = NULL;
			q->rear = NULL;
		}
		else
		{
			q->front = p->next;//将头指针移动位置到队首
			
		}
		free(p);
		return q;
	}

}
//链队列的简单使用
//使用队首队尾指针的指向来表示队首元素和队尾元素

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct Qnode//创建结点
{
	int data;//数据域
	struct Qnode* next;//指针域
};
struct Queue//创建前后指针
{
	struct Qnode*front;
	struct Qnode*rear;
};
//1.新建队列
struct Queue *init_queue(struct Queue *q)//使用指针进行操作
{
	//q = (struct Queue *)malloc(sizeof(struct Queue));
	q->front = NULL;
	q->rear = NULL;
	return q;
}
//2.判断是否为空,采用返回值1 0来判断
int IsNotEmpty(struct Queue *q)
{
	if ((q->front == NULL)&&(q->rear==NULL))
	{
		return 0;//为空
	}
	else
	{
		return 1;
	}
}
//3.取得队首元素

struct Queue*catch_Queue(struct Queue *q)
{
		if (IsNotEmpty(q)==0)
	{
			printf("取数错误");
	}
		else
	{
			printf("该队首元素为%2d", q->front->data);
	}
		return q;
}
//展示队列
int disp_queue(struct Queue *q)
{
	struct Qnode *p;
	p = q->front;//p为队首元素,被队首指针所指
	printf("\n[队列头]");
	//开始遍历
	while (p!= NULL)
	{
		printf("(%d)-->", p->data);
		p = p->next;
	}
	printf("[队列尾]\n");
	return 1;
}
//插入数操作
struct Queue *append_queue(struct Queue *q, int num)
{
	struct Qnode* p;//插入结点
	p = (struct Qnode*)malloc(sizeof(struct Qnode));
	p->data = num;
	p->next = NULL;
	//判断是否为一个结点的情况
	if (q->front==NULL)
	{
		q->front =p;
		q->rear = p;
	}
	//正常情况
	else
	{
		q->rear->next = p;//将尾指针的后继给了p(尾插法)
		q->rear = p;//移动尾指针
	}
	return q;
}
//出队操作
struct Queue* delete_queue(struct Queue *q)
{
	struct Qnode* p;
	//判断是否为空
	if (IsNotEmpty(q) == 0)
	{
		printf("队列为空\n");
		return q;
	}
	else
	{
		p = q->front;//将p放在队首的位置
		if (q->front == q->rear)//头指针等于尾指针,说明只有一个结点
		{
			q->front = NULL;
			q->rear = NULL;
		}
		else
		{
			q->front = p->next;//将头指针移动位置到队首
			
		}
		free(p);
		return q;
	}

}