上一篇文章写了什么是栈,用C语言实现了栈,既然说了栈,不说队列,感觉总是少了点什么,所以就顺手写一个队列,而且最近做项目也用到这个队列的代码。
栈的特点是先进后出,队列的特点是先进先出,从这个特点可以知道,队列是比较友好的,不像栈那样最开始进去排队的人,竟然是最后一个出来的。

因为我这个例程是使用链表实现队列的,所以新建一个队列,实际上就是开辟一个内存空间,用来存储队列的头部。跟栈一样,我们理解了建立一个队列就是需要建立一个头,开辟的这个空间,代表的是这个队列,就好比,你老爸就可以代表你们家庭,不管你家有多少人,有多少个小孩,你老爸始终都是这个家庭的户主。

/*创建队列,外部释放内存*/
QueueInfo_st *createQueue(void)
{
QueueInfo_st *queue = (QueueInfo_st *)malloc(sizeof(QueueInfo_st));
if(NULL == queue)
{
printf("malloc failed\n");
return NULL;
}
queue->next = NULL;
return queue;
}向队列插入数据,我做的有点麻烦,先是遍历链表,找到这个链表的尾部,然后再在链表的尾部插入数据,看文章的大神,有好的方法可以指出来,我觉得应该有更加优秀的方法的。
/*入队列,0表示成,非0表示出错*/
int queue_push(QueueInfo_st *s,ElementType value)
{
/*用来保存尾部指针*/
QueueInfo_st *temp = (QueueInfo_st *)malloc(sizeof(QueueInfo_st));
if(NULL == temp)
{
printf("malloc failed\n");
return FAILURE;
}
/*找到链表的尾部*/
while(s->next != NULL)
{
s = s->next;
}
temp->value = value;
temp->next = s->next;
s->next = temp;
return SUCCESS;
}取出队列的数据,也就是把头部指向的下一个链表里面的数据给取出来,取出来要记得释放内存哈,这一步尤其重要。

/*出队列*/
int queue_pop(QueueInfo_st *s,ElementType *value)
{
/*首先判断队列是否为空*/
if(queue_is_empty(s))
return FAILURE;
/*找出队列顶元素*/
*value = s->next->value;
/*保存等下需要free的指针*/
QueueInfo_st *temp = s->next;
/*更换队列顶的位置*/
s->next = s->next->next;
/*释放队列顶节点内存*/
if(temp!=NULL)/*先判断指针是否为空*/
free(temp);
temp = NULL;
return SUCCESS;
}
原文作者:;如有侵权,请联系管理员删除。