队列是一种线性结构,满足先进先出的特性(可以把此特性想象成排队一样)和栈正好相反
队列的应用是很广泛的,所以一定要熟练掌握
#include<stdio.h>
#include<stdlib.h>
typedef struct node { //队列节点的结构
int data;
struct node * next;
}Node;
typedef struct { //头、尾指针 (真正对队列起控制作用的指针)
Node * front;// 这里为队列指针域的数据类型
Node * rear;
}Queue;
void creat_Queue(Queue * head);// 创建队列
void print_Queue(Queue * head);//输出队列中的元素
int empty(Queue * head);//判断队列是否为空
void push(Queue * head, int x);// 在队尾压入一个元素
void pop(Queue * head);//队首出队
int front(Queue * head);//取队首元素的值
Node *s;
Node *p;
int main()
{
Queue * que = (Queue *)malloc(sizeof(Queue));
int x, cord,m;
do {
printf("\n 主菜单\n");
printf("\n 1.建立链表队列\n");
printf("\n 2.入队一个元素x\n");
printf("\n 3.队首元素出队\n");
printf("\n 4.结束程序运行\n");
printf("--------------------------------------\n");
printf("请输入您的选择(1, 2, 3, 4)");
scanf("%d", &cord);
switch(cord)
{
case 1:
creat_Queue(que);
printf("建立队列后所有元素为:\n");
print_Queue(que);
break;
case 2:
printf("\n入队元素x = ?");
scanf("%d", &x);
push(que, x);
print_Queue(que);
break;
case 3:
printf("该队队首元素为:%d\n", front(que));
pop(que);
printf("出队后队内的所有元素为:\n");
print_Queue(que);
break;
case 4:
exit(0);
}
}while( 1<=cord && cord<=4 );
return 0;
}
void creat_Queue(Queue * head)
{
int n,x;
head->front=(Node *)malloc(sizeof(Node));
head->front->next=NULL;
head->rear=head->front;
printf ("\n请输入你要入队的元素个数: ");
scanf ("%d",&n);
printf ("\n请输入你要入队N个元素的值: ");
while (n--)
{
scanf ("%d",&x);
s=(Node *)malloc(sizeof(Node));
s->data=x;
s->next=NULL;
head->rear->next=s;
head->rear=s;
}
}
void print_Queue(Queue * head)
{
s=head->front->next;
while (s!=NULL)
{
printf ("%d ",s->data);
s=s->next;
}
}
int empty(Queue * head)
{
if (head->front==head->rear)
return 1;
return 0;
}
void push(Queue * head, int x)
{
s=(Node*)malloc(sizeof(Node));
s->data=x;
s->next=NULL;
head->rear->next=s;
head->rear=s;
}
int front(Queue * head)
{
if (empty( head))
{
printf ("队列为空\n");
return -1;
}
p=head->front->next;
return p->data;
}
void pop(Queue * head)
{
if (empty( head))
{
printf ("队列为空\n");
}
else
{
p=head->front->next;
if (p->next==NULL)//如果要删除最后一个节点的话,尾节点一定要和头结点相等
//不然尾节点的就不知道指向哪里了。
head->rear=head->front;
head->front->next=p->next;
free(p); //释放节点
}
}