1.链式队列
链式队列 : 用链表形式实现的队列。链表结点为队列数据存储区,链表结点包括两部分数据存储
区和指针存储区。
数据存储区 :存放真实有效数据的区域。
指针存储区 :存放下一个链表结点的地址。
2.创建链式队列
为链式队列申请内存,即为队首指针和队尾指针申请内存。
为链式队列头结点申请内存,头结点不存放有效数据,方便队列的操作。
将队首指针和队尾指针指向头结点,即队首指针和队尾指针相等。
链式队列头结点指针域为空,即为NULL;头结点数据域可不管,亦可为零,作为链式队列有效的
节点数,亦可作为创建队列成功标识等等,由开发者根据实际情况而定。
3.链式队列数据入队
.为链式队列入队数据结点申请内存。
将新结点设置为最后个结点,新结点的指针域为空,数据域为入队数据。
更新队尾指针,将队尾指针指向新插入的结点。
4.链式队列数据出队
.只有在链式队列非空时出队数据才有效。
若只有一个有效结点时,需将队尾指针指向头结点,头结点指针域为空。
头结点指针指向下下个有效结点。
结点数据出队。
释放出队结点数据内存。
5.代码示例
linkqueue.h
#ifndef __LINKQUEUE_H__
#define __LINKQUEUE_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
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;
}