数据结构 - 链式队列

1.链式队列

链式队列 : 用链表形式实现的队列。链表结点为队列数据存储区,链表结点包括两部分数据存储

区和指针存储区。

数据存储区 :存放真实有效数据的区域。

指针存储区 :存放下一个链表结点的地址。

2.创建链式队列

为链式队列申请内存,即为队首指针和队尾指针申请内存。

为链式队列头结点申请内存,头结点不存放有效数据,方便队列的操作。

将队首指针和队尾指针指向头结点,即队首指针和队尾指针相等。

链式队列头结点指针域为空,即为NULL;头结点数据域可不管,亦可为零,作为链式队列有效的

节点数,亦可作为创建队列成功标识等等,由开发者根据实际情况而定。

数据结构 - 链式队列_第1张图片
 

3.链式队列数据入队 

.为链式队列入队数据结点申请内存。

将新结点设置为最后个结点,新结点的指针域为空,数据域为入队数据。

更新队尾指针,将队尾指针指向新插入的结点。

数据结构 - 链式队列_第2张图片

4.链式队列数据出队 

.只有在链式队列非空时出队数据才有效。

若只有一个有效结点时,需将队尾指针指向头结点,头结点指针域为空。

头结点指针指向下下个有效结点。

结点数据出队。

释放出队结点数据内存。

数据结构 - 链式队列_第3张图片

5.代码示例

linkqueue.h

#ifndef __LINKQUEUE_H__
#define __LINKQUEUE_H__

#include 
#include 
#include 

typedef int datatype;
#define MAXSIZE 10

//定义链式队列的结点类型
typedef struct linkqueuende{
	datatype data;
	struct linkqueuende *next;
}linkpqueue_node,*linkpqueue_node;

//将front和read指针封装
typedef struct linkqueue{
     linkpqueue_pnode front,read;
}link_queue,*link_pqueue;

extern void init_linkqueue(link_queue *Q);
extern bool is_full_linkqueue(link_pqueue q);
extern bool in_linkqueue(datatype data,link_pqueue q);
extern bool out_linkqueue(link_pqueue q,datatype *D);
extern bool is_empty_linkqueue(link_pqueue q);
extern void show_linkqueue(link_pqueue q);

#endif

linkqueue.c

#include "seqqueue.h"

#if 0
seq_pqueue init_seqqueue(void)
{
	sepqueue q;
	
	q = (seq_pqueue)malloc(sizeof(seq_queue));
	if(NULL == q){
		perror("malloc");
		exit(-1);
	}
	q->front = q->rear = MAXSIZE-1;
	return q;
}
#else
void init_linkqueue(link_pqueue *Q)
{
	//申请fornt和rear的空间
	*Q = (link_pqueue)malloc(sizeof(link_queue));
	if(NULL == (*Q)){
		perror("malloc");
		exit(-1);
	}
	
	//申请头节点空间
	(*Q)->front = (linkpqueue_pnode)malloc(sizeof(linkqueue_node));
	if(NULL == (*Q)->front){
		perror("malloc");
		exit(-1);
	}
	
	(*Q)->front->next = NULL;;
	(*Q)->rear = (*Q)->front;
}
#endif



//入队
bool in_linkqueue(datatype data,link_pqueue q)
{
	linkqueue_pnode new;
	
	//申请数据节点空间
	new = (linkpqueue_pnode)malloc(sizeof(linkqueue_node));
    if(NULL == new){
		perror("入队失败!\n");
		return false;
	 }
	//将数据存储在申请的空间中
	new->data = data;
	//将new指向的结点插入到链式队列中
	new->next = q->rear->next;
	q->rear->next = new;
	
	//让rear指针指向新的队尾结点
	q->rear = q->rear->next;
	return true;
}

//判断队列是否为空
bool is_empty_linkqueue(link_pqueue q)
{
	if(q->read == q->front)
		return true;
	elae
	    return false;
}
//出队
bool out_linkqueue(link_pqueue q,datatype *D)
{
	linkpqueue_pnode t;
	if(is_empty_linkqueue(q)){
		printf("队列为空!\n");
		return false;
	}
	t = q->front;
	q->front = q->front->next;
	*D = q->front->data;
	free(t);
	return true;
}

//队列遍历算法
void show_linkqueue(link_pqueue q)
{
	linkqueue_pnode p;
	for(p = q->front->next; p != NULL; p = p->next)
		printf("%d\t",p->date);
	printf("\n");
}


#endif

 linkqueue_main.c

/*
用链式队列实现如下功能:用户从键盘输入整数,程序将其入队,用户输入字母
队头元素出队,并在每一次出队和入队之后打印队列元素。
*/

#include "seqqueue.h"

int main(void)
{
	seq_pqueue q; //定义指向顺序队列的指针
	datatype data,t;
	int ret;
	
	init_seqqueue(&q);  //顺序队列初始化
	
	while(1){
		printf("请输入一个整数:");
		ret = scanf("%d",&data);
		//输入整数时,入队
		if(ret == 1){
			if(insert_seqqueue(data,q))
				show_seqqueue(q);
		}else{
			//输入为字符出队
			if(out_seqqueue(q,&t)){
				printf("out : %d\n",t);
				show_seqqueue(q);
			}
			//清空输入缓冲区
			while(getchar()!='\n');
		}
	}
	return 0;
}

你可能感兴趣的:(数据结构,数据结构,链表,b树)