队将求先进先出,本文带来的是最基本的队,熟悉此文章对以后面对更复杂的队有帮助
第一种顺序队列,用到二重地址,记住在这个二重地址**a的函数下,*a代表的是a的地址
#include<stdio.h>
#include<stdlib.h>
typedef struct queue1
{
int data;
struct queue1 *link;
}queue;
void enqueue(queue **head,queue **tail,int x)
{
queue *p;
p=(queue *)malloc(sizeof(queue));
p->data=x;
p->link=nullptr;
if(*head==nullptr)
*head=*tail=p;
else
{
(*tail)->link=p;
*tail=p;
}
}
int dequeue(queue **head,queue **tail,int *cp)
{
queue *p;
p=*head;
if(*head==nullptr)
return 1;
*cp=(*head)->data;
*head=(*head)->link;
if(*head==nullptr)
*tail=nullptr;
free(p);
return 0;
}
void outputqueue(queue *head)//注意这里不需要用二重指针,因为这个head不需要传回去
{
while(head!=nullptr)
{
printf("%d",head->data);
head=head->link;
}
printf("\n");
}
int main()
{
queue *head,*tail;
int op,i;
head=tail=nullptr;
while(1)
{
printf("请选择操作,1:进队 2:出队 0:退出");
fflush(stdin);
scanf("%d",&op);
switch(op)
{
case 0:
return 0;
case 1:
printf("请输入进队元素:");
scanf("%d",&i);
enqueue( &head,&tail,i);
printf("队内元素为:\n");
outputqueue(head);
break;
case 2:
if(dequeue(&head,&tail,&i)!=1)
{
printf("出队元素为:[%d],队内元素为:\n",i);
outputqueue(head);
}
else
printf("队空\n");
break;
}
}
}
第二种循环队列,这种队列运用了,放弃一个空间即将tail后面的一个位置不用的方法来判断是满还是空具体体现在:满用(*tail+1)%maxn==*head,空用*tail==*head判断,这种方法非常的巧妙,在这种队列中也无需用到二重地址,更容易理解。
#include<stdio.h>
#include<stdlib.h>
#define max 4
typedef struct queue1
{
int data;
struct queue1 *link;
}queue;
int enqueue(int *queue,int maxn,int *head,int *tail,int x)
{
if((*tail+1)%maxn==*head)
return 1;
*tail=(*tail+1)%maxn;
queue[*tail]=x;
return 0;
}
int dequeue(int *queue,int maxn,int *head,int *tail,int *cp)
{
if(*head==*tail)
return 1;
*head=(*head+1)%maxn;
*cp=queue[*head];
return 0;
}
void outputqueue(int *queue,int maxn,int h,int t)
{
while(t!=h)
{
h=(h+1)%maxn;
printf("%d",queue[h]);
}
printf("\n");
}
int main()
{
int q[max];
int q_h=0,q_t=0;
int op,i;
while(1)
{
printf("请选择操作,1:进队 2:出队 0:退出");
fflush(stdin);
scanf("%d",&op);
switch(op)
{
case 0:
return 0;
case 1:
printf("请输入进队元素:");
scanf("%d",&i);
if(enqueue(q,max,&q_h,&q_t,i)!=0)
printf("队列满\n");
else
{
printf("入队成功,队列元素为:\n");
outputqueue(q,max,q_h,q_t);
}
break;
case 2:
if(dequeue(q,max,&q_h,&q_t,&i)==0)
{
printf("出队元素为:[%d],队内元素为:\n",i);
outputqueue(q,max,q_h,q_t);
}
else
printf("队空\n");
break;
}
}
}
遇到这一类链表问题时经常对它的值域和地址域搞混乱,可以通过画图的方式明确,就像这样:
触控板绘制比较抽象,如果对我这个画图的方法想更加了解的话,欢迎评论区留言
作者只是一个小白,分享一下自己学C语言过程中的见解,如有问题,欢迎大家评论区指出,谢谢大家!