数据结构:链队列及其相关操作(c语言实现)

队列就是一个先进先出的限制性结构,用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;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值