6、数据结构笔记之六链队列实现

6、数据结构笔记之六链队列实现

  “人生天地之间,若白驹之过隙,忽然而已。”。

1.  定义

如下图所示,和链栈基本一致。

#defineIS_EMPTY(ptr)(!(ptr))

#defineIS_FULL(ptr)  (!(ptr))

 

typedefstructelement{

           intkey;

           /*otherfields */

}element;

 

typedefstructqueue *queue_pointer;

typedefstructqueue {

                     elementitem;

                     queue_pointerlink;

}queue;

queue_pointer front=NULL,rear=NULL;

 

2.  增加节点函数

函数如下,增加的节点放在rear中。:

void addq(queue_pointer *front, queue_pointer *rear,elementitem)

{

           queue_pointertemp = (queue_pointer ) malloc(sizeof(queue));

           if(IS_FULL(temp)){

                     fprintf(stderr,"Thememory is full\n");

                     exit(1);

           }

           temp->item= item;

           temp->link=NULL;

           if(*front)(*rear)->link= temp;

           else *front =temp;

           *rear =temp;

}

3.  删除节点函数

删除节点是从front出删除节点,先进先出。增加的都放在了rear,所以出去的都从rear开始。。

element deleteq(queue_pointer *front)

{

           queue_pointertemp = * front;

           elementitem;

           if(IS_EMPTY(*front)){

                     fprintf(stderr,"Thequeue is empty\n");

                     exit(1);

           }

           item= temp->item;

           *front =temp->link;

           free(temp);

           returnitem;

}

 

4.  Main函数

Main函数调用addq和deleteq函数,

void main()

{

           inti;

           elementtemp ;

 

           //add10 nodes to queue

           for(i=0;i<20;i++)

           {

                     temp.key=i;

                     addq(&front,&rear,temp);

 

           }

           printf("afteradd 10nodes to queue\n");

           print_node(front);

           printf("\n");

 

           for(i=0;i<10;i++)

           {

                    

                     temp=deleteq(&front);

                     printf("thedelete node's key is %d\n",temp.key);

 

           }

           printf("afterdelete 10 nodes \n");

           print_node(front);

           printf("\n");

 

           for(i=0;i<1;i++)

           {

                     temp.key=i;

                     addq(&front,&rear,temp);

 

           }

           printf("afteradd one  nodes to queue\n");

           print_node(front);

           printf("\n");

 

           for(i=0;i<11;i++)

           {

                     temp=deleteq(&front);

                     printf("thedelete node's key is %d\n",temp.key);

 

           }

           printf("afterdelete left 10 nodes \n");

           //print_node(front);

           printf("\n");

          

           for(i=0;i<3;i++)

           {

                     temp.key=i;

                     addq(&front,&rear,temp);

 

           }

           printf("afteradd another 3 nodes to queue\n");

           print_node(front);

           printf("\n");

 

 

}

 

 5.  源码

#include"stdio.h"

#include"stdlib.h"

#defineIS_EMPTY(ptr)(!(ptr))

#defineIS_FULL(ptr)  (!(ptr))

 

typedefstructelement{

           intkey;

           /*otherfields */

}element;

 

typedefstructqueue *queue_pointer;

typedefstructqueue {

                     elementitem;

                     queue_pointerlink;

}queue;

queue_pointer front=NULL,rear=NULL;

 

 

void addq(queue_pointer *front, queue_pointer *rear,elementitem)

{

           queue_pointertemp = (queue_pointer ) malloc(sizeof(queue));

           if(IS_FULL(temp)){

                     fprintf(stderr,"Thememory is full\n");

                     exit(1);

           }

           temp->item= item;

           temp->link=NULL;

           if(*front)(*rear)->link= temp;

           else *front =temp;

           *rear =temp;

}

element deleteq(queue_pointer *front)

{

           queue_pointertemp = * front;

           elementitem;

           if(IS_EMPTY(*front)){

                     fprintf(stderr,"Thequeue is empty\n");

                     exit(1);

           }

           item= temp->item;

           *front =temp->link;

           free(temp);

           returnitem;

}

 

void print_node( queue_pointertop){

           if (IS_EMPTY(top)){

                     fprintf(stderr,"Thestack is empty\n");

                     return;

           }

           for(top;top;top=top->link)

           {

                     printf("%d   ",top->item);

           }

          

}

void main()

{

           inti;

           elementtemp ;

 

           //add10 nodes to queue

           for(i=0;i<20;i++)

           {

                     temp.key=i;

                     addq(&front,&rear,temp);

 

           }

           printf("afteradd 10nodes to queue\n");

           print_node(front);

           printf("\n");

 

           for(i=0;i<10;i++)

           {

                    

                     temp=deleteq(&front);

                     printf("thedelete node's key is %d\n",temp.key);

 

           }

           printf("afterdelete 10 nodes \n");

           print_node(front);

           printf("\n");

 

           for(i=0;i<1;i++)

           {

                     temp.key=i;

                     addq(&front,&rear,temp);

 

           }

           printf("afteradd one  nodes to queue\n");

           print_node(front);

           printf("\n");

 

           for(i=0;i<11;i++)

           {

                     temp=deleteq(&front);

                     printf("thedelete node's key is %d\n",temp.key);

 

           }

           printf("afterdelete left 10 nodes \n");

           //print_node(front);

           printf("\n");

          

           for(i=0;i<3;i++)

           {

                     temp.key=i;

                     addq(&front,&rear,temp);

 

           }

           printf("afteradd another 3 nodes to queue\n");

           print_node(front);

           printf("\n");

 

 

}

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值