//基本与单链表相同,链式队列主要为头部删除,尾部插入,另外多了总指针指向队列的头和尾
#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct link_queue
{
datatype info;
struct link_queue *next;
}node;
typedef struct
{
node *front,*rear; //定义队列的头指针和尾指针
}queue;
queue *init() //定义一个队列的头结点,头结点两个指针域,一个指向队列的头,一个指向队列的尾部
{
queue *qu=(queue*)malloc(sizeof(queue));
qu->front=qu->rear=NULL; //初始时队列为空,头尾节点为空
return qu;
}
queue *create() //创建一个链式队列
{
int x;
queue *qu;
node *q;
qu=init(); //必须初始化,为队列的头分配内存,否则程序会崩溃
q=(node *)malloc(sizeof(node));
scanf("%d",&x);
if(x!=-1) //创建头结点
{
qu->front=qu->rear=q;//把q直接赋给头的头指针和尾指针
q->info=x;
qu->rear->next=NULL; //队列的尾部指向空
}
else
{
free(q); //队列为空,释放所申请的内存
return qu;
}
while(scanf("%d",&x)&x!=-1)
{
q=(node*)malloc(sizeof(node));
q->info=x;
qu->rear->next=q;//尾指针指向新入队的节点
qu->rear=qu->rear->next;//改变尾指针的位置
}
qu->rear->next=NULL; //尾部的指针指向为空
return qu;
}
void display(queue*qu) //打印队列的元素
{
node *p=qu->front;
if(!p)
{
printf("链是队列是空的\n");
return;
}
while(p)
{
printf("%-5d",p->info);
p=p->next;
}
printf("\n");
}
queue *insert(queue *qu,datatype x) //进行入对操作
{
node *q=(node*)malloc(sizeof(node));
q->info=x;
q->next=NULL;//入队的点在末尾,所以新插入的节点要指向空
if(!qu->front) //若原来队列为空
{
qu->front=qu->rear=q;
return qu;
}
qu->rear->next=q; //直接在尾部插入
qu->rear=qu->rear->next; //改变尾指针的位置
return qu;
}
queue *dele(queue *qu) //出队操作
{
node *p=qu->front;
if(!qu->front)
{
printf("链式队列是空的\n");
return qu;
}
qu->front=qu->front->next; //改变头结点指针的位置
free(p); //释放原头结点的内存
if(qu->front==NULL) qu->rear=NULL; //如果原来队列就一个元素,删除后队列为空,所以尾部指针指向为空
return qu;
}
datatype read(queue *qu) //出队,读取队列的第一个元素
{
if(qu->front==NULL)
{
printf("链式队列是空的\n");
return -1;
}
return qu->front->info;
}
int main()
{
int x;
queue *qu;
printf("创建一个链式队列:\n");
qu=create();
display(qu);
printf("输入要入队的值:");
scanf("%d",&x);
qu=insert(qu,x);
display(qu);
printf("出队:");
printf("%d\n",read(qu));
printf("出队后的队列:\n");
qu=dele(qu);
display(qu);
return 0;
}