定义一个链式队列:
先定义一个链式队列结点(以链表结点形式实现)
再定义一个linkequeue结构体其中包含队头指针和队尾指针
///链式队列//
typedef struct qnode{//链式队列结点
int data;//队列元素
struct qnode *next;//指向下一个结点的指针
}qnode,*lqueue;
typedef struct linkqueue{//链式队列---可选,不写结构体,直接定义对头队尾指针也可
lqueue front,rear;//队头队尾指针,队首指针是链表头结点
}linkqueue;
初始化函数:
传入链式队列q的指针
先动态创建队首指针和队尾指针
再判断是否内存分配成功
如果分配成功后就让队首指针的下一个结点指向NULL(即头结点指向NULL)
//初始化
void initqueue(linkqueue *q)
{
q->front=q->rear=(lqueue)malloc(sizeof(qnode));
if(q->front==NULL)
{
printf("分配失败\n");
}
else{
q->front->next=NULL;
}
}
入队函数:
传入队列q的指针
再创建一个结点s将数据写入结点
再让s指向NULL
之后再让队尾指针指向结点s
之后再将结点的地址赋给队尾指针(即结点s变成了新的队尾)
//入队
void enqueue(linkqueue* q,int x)
{
lqueue s=(lqueue )malloc(sizeof(qnode));
s->data =x;
s->next =NULL;//新节点插入到链尾
q->rear->next=s;
q->rear =s;
}
出队函数:
传入队列q的指针
先创建x用来保存出队元素x
之后判空(即队首指针的头结点所指向的结点是否为空)
如果非空则
创建结点p并且将队首指针的头结点指向结点p
之后把首元结点的数据写入x
再打印x的数值
最后判断原队列是否只有一个结点(即判断队尾指针是否指向待删除的结点)
如果是则要让队尾指针指向队首指针所指向的头结点
最后删除结点p
//出队,队首指针是链表头结点 ,删除的是队首指针的下一个,即front->next
void dequeue(linkqueue* q)
{
int x;//保存出队元素
//先判空,不空才能出
if(q->front->next==NULL)
{
printf("空\n");//队空,报错
}
else{
lqueue p=q->front->next;
x=p->data;
q->front ->next=p->next ;
printf("%d\n",x);
//若原队列只有一个结点了,则删除边空,需要处理尾指针
if(q->rear =p)
q->rear =q->front;
free(p);
}
总代码:
#include<stdio.h>
#include<stdlib.h>
///链式队列//
typedef struct qnode{//链式队列结点
int data;//队列元素
struct qnode *next;//指向下一个结点的指针
}qnode,*lqueue;
typedef struct linkqueue{//链式队列---可选,不写结构体,直接定义对头队尾指针也可
lqueue front,rear;//队头队尾指针,队首指针是链表头结点
}linkqueue;
//初始化
void initqueue(linkqueue *q)
{
q->front=q->rear=(lqueue)malloc(sizeof(qnode));
if(q->front==NULL)
{
printf("分配失败\n");
}
else{
q->front->next=NULL;
}
}
//入队
void enqueue(linkqueue* q,int x)
{
lqueue s=(lqueue )malloc(sizeof(qnode));
s->data =x;
s->next =NULL;//新节点插入到链尾
q->rear->next=s;
q->rear =s;
}
//出队,队首指针是链表头结点 ,删除的是队首指针的下一个,即front->next
void dequeue(linkqueue* q)
{
int x;//保存出队元素
//先判空,不空才能出
if(q->front->next==NULL)
{
printf("空\n");//队空,报错
}
else{
lqueue p=q->front->next;
x=p->data;
q->front ->next=p->next ;
printf("%d\n",x);
//若原队列只有一个结点了,则删除边空,需要处理尾指针
if(q->rear =p)
q->rear =q->front;
free(p);
}
}
int main()
{
linkqueue* q;
q=(linkqueue*)malloc(sizeof(linkqueue));
initqueue(q);
enqueue(q,1);
enqueue(q,2);
enqueue(q,3);
dequeue(q);
dequeue(q);
dequeue(q);
dequeue(q);
enqueue(q,4);
dequeue(q);
dequeue(q);
return 0;
}