头文件
#include <stdio.h>
#include <stdlib.h>
定义结构体
typedef int Elemtype;
typedef struct Qnode
{
Elemtype date;
struct Qnode* next;
}QNode;
typedef struct
{
QNode *rear,*front;
}qqueue;
初始化
void chushihua(qqueue* q)
{
//创建头结点
QNode* p;
p = (QNode*)malloc(sizeof(QNode));
if (!p)
printf("\n分配内存失败!\n");
p->next = NULL;
//使头结点和尾结点在初始情况下均指向头结点
q->front=q->rear=p;
}
入队
void rudui(qqueue* q, Elemtype e)
{
//为新入队的结点分配内存空间
QNode* p;
p = (QNode*)malloc(sizeof(QNode));
if (!p)
printf("\n为新入队的结点分配内存失败!\n");
//将结点插入链队列中
p->next = NULL;
p->date = e;
q->rear->next = p;
q->rear = p;
}
出队
void chudui(qqueue* q)
{
QNode* p;
//q->front指向头结点 q->front->next指向队首
p= q->front->next;
int x;
x = p->date;
printf("\n出队的元素的值为:%d\n", x);
q->front->next=p->next;
if (p == q->rear)
q->rear = q->front;
free(p);
}
取队列两端的元素值
void yuansuzhi(qqueue* q)
{
printf("\n队首元素的值为:%d\n", q->front->next->date);
printf("\n队尾元素的值为:%d\n", q->rear->date);
}
删除链队列
void shanchu(qqueue* q)
{
while (q->front != NULL)
{
q->rear = q->front->next;
free(q->front);
q->front = q->rear;
}
}
输出队列中各元素的值
void bianli(qqueue* q)
{
QNode* p;
p = q->front->next;
printf("\n队列中元素为:\n");
while (p != NULL)
{
printf("%d\t", p->date);
p = p->next;
}
}
主函数
int main()
{
Elemtype x, y;
do
{
printf("\n\n\t\t链式队列的基本操作\n\n");
printf("\t\t请选择要进行的操作\n\n");
printf("\t\t1.初始化链队列\n\n");
printf("\t\t2.入队\n\n");
printf("\t\t3.出队\n\n");
printf("\t\t4.取队列两端的元素的值\n\n");
printf("\t\t5.删除队列\n\n");
printf("\t\t6.退出操作\n\n");
scanf("%d", &x);
switch (x)
{
case 1:
qqueue* q;
q = (qqueue*)malloc(sizeof(qqueue));
chushihua(q);
break;
case 2:
printf("\n请输入要入队的元素\n");
scanf("%d", &y);
rudui(q, y);
bianli(q);
break;
case 3:
chudui(q);
bianli(q);
break;
case 4:
yuansuzhi(q);
break;
case 5:
shanchu(q);
break;
default:
break;
}
} while (x < 6);
}
运行结果