采用链式存储法编程实现元素入队、出队以及将队列中的元素显示出来,要求整个过程以菜单选择的形式出现。队列的链式存储结构是通过节点构成的单链表实现的,此时只允许在单链表的表首进行删除,在表尾进行插入,以实现队列先进先出的特点,因此需要使用两个指针,用 front 指向队首节点存储位置,用 rear 指向队尾节点存储位置。
IDE:Code::Blocks 17.12
Compiler:GNU GCC Compiler
/*链队列的实现及测试*/
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
//定义链队列的结构体
typedef struct node{
ElemType data; //存放元素内容
struct node * next; //指向下一个节点
}quenode;
struct quefr{
quenode * front,*rear; //队首队尾指针
};
//初始化链队列
void creat(struct quefr * q){
quenode * h;
h=(quenode *)malloc(sizeof(quenode));
h->next=NULL;
q->front=h; //队首指针指向头节点
q->rear=h; //队尾指针指向头节点
}
//函数enque()实现元素x入队
void enque(struct quefr * q,ElemType x){
quenode * s;
s=(quenode *)malloc(sizeof(quenode));
s->data=x;
s->next=NULL;
q->rear->next=s;
q->rear=s; //队尾指向s节点
}
//函数deque()实现元素出队
ElemType deque(struct quefr * q){
quenode * p;
p=(quenode *)malloc(sizeof(quenode));
ElemType x;
if(q->front == q->rear){ //队列为空
printf("queue is NULL \n");
x=0;
}else{
p=q->front->next;
q->front->next=p->next; //取下队列首元素p
if(p->next==NULL){ //取下元素后队列中无元素
q->rear=q->front; //队首和队尾指针指向同一个地方,队列为空
}
x=p->data;
free(p);
}
return x;
}
//函数display()显示队列中的元素
void display(struct quefr dq){
quenode * p;
p=(quenode *)malloc(sizeof(quenode));
p=dq.front->next;
while(p!=NULL){
printf("data=%d \n",p->data);
p=p->next;
}
printf("------------------------------\n");
}
int main()
{
struct quefr * que;
int n,i,x,sel;
do{
printf("------------------------------\n");
printf(" 1 创建队列 \n");
printf(" 2 向队列中插入元素 \n");
printf(" 3 从队列中删除元素 \n");
printf(" 4 显示队列中的元素 \n");
printf(" 5 退出 \n");
printf("------------------------------\n");
printf("请选择(1,2,3,4,5):");
scanf("%d",&sel);
switch(sel){
case 1:
que=(struct quefr *)malloc(sizeof(struct quefr));
creat(que);
printf("请输入元素个数:");
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d",&x);
enque(que,x);
}
printf("创建成功!\n");
break;
case 2:
printf("输入您想插入队列的元素:");
scanf("%d",&x);
enque(que,x);
printf("插入队列成功!\n");
break;
case 3:
printf("出队元素为:");
printf("x=%d\n",deque(que));
printf("出队成功!\n");
break;
case 4:
display(*que);
break;
case 5:
exit(0);
}
}while(sel<=4);
return 0;
}
------一分耕耘,一分收获------