队列queue(2):链表实现队列

基本概念


 

  队列是只允许在一端进行插入操作,另一端进行删除操作的线性表。

   我们规定,允许删除的叫做队首“head”,允许插入的叫做队尾“tail”。

  

 

基本操作


 

 

  我们规定,一个结点包含数值域与指针域两部分,数值域存放链表所需要用到的非指针型数值,指针域用于存放数值以及指向下一个结点的next指针。

  

 

  /*定义链表队列*/

  struct Node{ int dota;struct Node *next}node;   //结构体存放结点

  struct linkqueue{struct Node *head;struct Node *tail}queue;  //存放队头指针和队尾指针,不存放在Node中是为了节省节点入队时占用的内存空间

  

   /* 初始化队列 */

  1.队头指针和队尾指针共同申请一个内存空间,我们假定申请到的内存地址是0X01

 

  2.结点下一结指向NULL

 

     注意:头结点的数据域为空

  PS:框框下头的&q、head、tail表示的是已串到0X01内存地址上的结点

  

 

 

   /* 入队操作 */

 

    1.申请新结点p,申请内存空间,我们规定申请到的内存空间地址为0X02

  2.输入的数据elem存放在新结点数据中

  3.新结点p的下一结指向NULL

  4.尾结点tail的下一结点指向新结点p,即把新结点p串到链表中

  5.队尾指针tail->next指向新结点,保证尾结点指针tail->next始终指向NULL

  

 

  

 

  

  /* 出队操作 */

  1.申请结点指针p,指向队头结点head,内存地址为0X01

  2.队头结点head传入下一结点,以免其被free();而失去了删除的这一端

  3.free();指针p指向的结点,原队头结点head所在的内存地址0X01

  4.p=NULL //避免野指针

  

 

  

  /* 打印操作 */

  1.若队头结点还位于内存地址0X01上,由于0X01内存地址上结点的数值域未写入,所以队头结点head应移入下一结点中,即head=head->next;

  2.申请一个结点p

  3.把结点p串入含有数值域的结点,即p=q->head->next,q是结构体queue类型的队列。

  4.遍历打印p=p->next,直到NULL。

  

 

源代码


 

  

/**********************************************************************
                实现一个queue
                输入: 7  6  8  6  6  7  0  4  1(队列)

                       9(出队的个数)
                输出:The queue is empty!
**********************************************************************/
#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
     int data;
     struct node *next;
}node;
/* 当链式队列的头尾节点指针定义成为一个单独的结构体,避免在新增节点时占用过多的空间 */
typedef struct list
{
        struct Node *head;
        struct Node *tail;
}queue;

void queue_init(queue *q);
void queue_in(queue *q,int elem);
void queue_out(queue *q);
void queue_print(queue *q);
void queue_empty(queue *q);

int main()
{
        queue q;
        queue_init(&q);
        int elem;
        printf("input:");
        while(scanf("%d",&elem)!=EOF)
        {
                getchar();
                queue_in(&q,elem);
        }
        queue_print(&q);
        queue_out(&q);
        queue_print(&q);
        queue_empty(&q);
        return 0;
}

void queue_init(queue *q)
{
        q->head=q->tail=(node*)malloc(sizeof(node));  //head,tail共同指向一个内存空间
        q->tail->next=NULL;  //队尾指针的next指针指向NULL,头结点head不变
        return;
}

void queue_in(queue *q,int elem)
{
        node *p;
        p=(node *)malloc(sizeof(node));
        p->data=elem;
        p->next=NULL;
        q->tail->next=p;
        q->tail=p;
        return;
}

void queue_out(queue *q)
{
        node *p;
        int i;  //i==出队的数据个数
        printf("The number of out queue:\n");
        scanf("%d",&i);
        while(i)
        {
                p=q->head;
                q->head=q->head->next;
                free(p);
                p=NULL; //防止野指针
                i--;
        }
        return;
}

void queue_print(queue *q)
{

        node *p;
        p=q->head->next;
        while(p!=NULL)
        {
                printf("%d",p->data);
                p=p->next;
        }
        return;
}

void queue_empty(queue *q)
{
        if(q->head->next==NULL)
        {
                printf("The queue is empty!\n");
        }
        return;
}

 

转载于:https://www.cnblogs.com/Bw98blogs/p/7190422.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值