队列就是一个先进先出的限制性结构,用c语言的链表去实现,用两个指针(一个头指针,一个尾指针)实现,队列概念比较简单,实现的链队列的关键是理解其中的指针。(必要时画图可更好理解)
代码如下:(链队列初始化,元素入队,出队,清空队列,返回队首元素,队列长度,判断队列是否为空)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define OVERflow -1
#define Error 0
#define OK 1
typedef struct elem//创建链队列元素结构体:1.值;2.指针域:连接下一个元素;
{
int data;
struct elem *next;
}element;
typedef struct{//链队列结构体:包括一个头指针和一个尾指针;
element *head;
element *tail;
}link_queue;
int init_queue(link_queue *que)
{
que->head=(element *)malloc(sizeof(element));
if(que->head==NULL)//内存分配失败;
{
return OVERflow;
}
que->tail=que->head;//头指针的指向空间不含元素值,仅用其指针域;
que->head->next=NULL;//还未开下一节点,将指针指向空;
return OK;
}
int destroy_queue(link_queue *que)//清空链队元素;
{
while(que->head)
{
que->tail=que->head->next;
free(que->head);//每次移动要free掉之前的,防止出现野指针;
que->head=que->tail;
}
return OK;
}
int enter_queue(link_queue *que,int e)
{
element *p=(element *)malloc(sizeof(element));
if(p==NULL)
{
return OVERflow;
}
p->data=e;//用新指针暂存元素;
p->next=NULL;
que->tail->next=p;
que->tail=p;//移动尾指针;
return OK;
}
int quit_queue(link_queue *que)
{
if(que->head==que->tail)//如果队列已经是空的就不存在出队了;
{
return Error;
}
element *p=(element *)malloc(sizeof(element));
p=que->head->next;
que->head->next=p->next;
if(que->head->next==NULL)//如果只有一个元素;
{
que->tail=que->head;
}
free(p);//及时清除不用的指针;
return OK;
}
bool is_empty(link_queue que)//判断队列是否空;
{
return que.head==que.tail? true: false;
}
int getfront(link_queue que)//获取队首元素;
{
int front;
if(que.head->next==NULL)
{
return Error;
}
return que.head->next->data;
}
int queue_length(link_queue que)//获取队列长度;
{
int l=0;
element *p;
p=que.head->next;
while(p) {
l++;
p=p->next;
}
return l;
}
void get_element(link_queue que)//遍历队列;
{
element *p;
p=que.head->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
link_queue que;
printf("创建空队列:\n");
init_queue(&que);
printf("队列长度:%d\n",queue_length(que));
printf("队列是否为空?(1.是;0.否)\n%d\n\n",is_empty(que));
printf("元素1入队:\n");
enter_queue(&que,1);
printf("队列长度:%d\n",queue_length(que));
printf("队首元素:%d\n",getfront(que));
printf("队列是否为空?(1.是;0.否)\n%d\n\n",is_empty(que));
printf("元素2入队:\n");
enter_queue(&que,2);
printf("队列长度:%d\n",queue_length(que));
printf("队首元素:%d\n",getfront(que));
printf("队列是否为空?(1.是;0.否)\n%d\n",is_empty(que));
printf("队列所有元素:\n");
get_element(que);
printf("\n");
printf("元素3入队:\n");
enter_queue(&que,3);
printf("队列长度:%d\n",queue_length(que));
printf("队首元素:%d\n",getfront(que));
printf("队列是否为空?(1.是;0.否)\n%d\n",is_empty(que));
printf("队列所有元素:\n");
get_element(que);
printf("\n");
printf("队首元素(1)出队:\n");
quit_queue(&que);
printf("队列长度:%d\n",queue_length(que));
printf("队首元素:%d\n",getfront(que));
printf("队列是否为空?(1.是;0.否)\n%d\n",is_empty(que));
printf("队列所有元素:\n");
get_element(que);
printf("\n");
return 0;
}