用循环单链表实现队列的基本操作

王朝c/c++·作者佚名  2006-01-06
窄屏简体版  字體: |||超大  

作者: 文竹         出自:  vczx.com

//用循环单链表实现队列的基本操作

//算法的实现:

#include

#include

#include

typedef int DateType;

struct Node;

typedef struct Node *PNode;

struct Node//结点结构

{

DateType info;

PNode link;

};

//函数声明

int isEmptyQueue_link(PNode &p);

void enQueue_link(PNode &p,DateType x);

void deQueue_link(PNode &p);

DateType frontQueue_link(PNode &p);

void scan_link(PNode &p);

//主函数

void main()

{

  PNode head=NULL;

  int i=1,x,y;

while(i)

{

printf("**********************************************************************\n");

printf("请选择:1 判断队列是否为空 2 进队列 3 出队列 4 取队列头部元素的值\n");

printf("        5 遍历队列 0 退出程序\n");

printf("**********************************************************************\n");

   scanf("%d",&i);

  switch(i)

    {case 1:y=isEmptyQueue_link(head);

            if(y==1)

       printf("队列为空!\n");

      else printf("队列非空!\n");

      break;

        case 2:printf("请你输入进队列的元素值: ");

      scanf("%d",&x);

      enQueue_link(head,x);

      break;

  case 3:deQueue_link(head);

      break;

  case 4:y=frontQueue_link(head);

      if(y!=65535)

      printf("队列头部元素的值为:%d\n",y);

      break;

  case 5:scan_link(head);

      break;

  

  default:if(i!=0)

       printf("选择有错!请你重新选择!\n");

  }        

}

}

int isEmptyQueue_link(PNode &p)//判断队列是否为空

{

return(p==NULL);

}

void enQueue_link(PNode &p,DateType x)//入队列

{

        PNode flag=NULL;//flag 始终指向第一个结点

        PNode q=NULL;

if(p==NULL)//创建第一个结点

{if((p=(PNode)malloc(sizeof(struct Node)))==NULL)

              printf("空间分配失败!\n");

  p->info=x;

  p->link=p;//头指针p 始终指向尾结点

  flag=p;

}

else //创建其他结点

               {   flag=p->link;//在改变头指针指向前使flag始终保持指向首结点

                  q=p;

      if((p=(PNode)malloc(sizeof(struct Node)))==NULL)

              printf("空间分配失败!\n");

        p->info=x;

          q->link=p;

          p->link=flag;}

}

void deQueue_link(PNode &p)//出队列

{

PNode q;

if(p==NULL)

  printf("队列为空的!\n");

else

   if(p->link==p)//只有一个结点的删除处理

   {free(p);

   p=NULL;}

   else //两个或者两个以上结点的时候的删除处理

   {    q=p->link;

        p->link=p->link->link;

        free(q);

                  

   }

}

DateType frontQueue_link(PNode &p)//取队列头部元素值

{

if(p==NULL)

{printf("队列是空的!\n");

  return 65535;//返回一个特殊值

}

else return(p->link->info);

}

void scan_link(PNode &p)//遍历队列

{

PNode q;

int i=1;

    if(p==NULL)

      printf("队列是空的!\n");  

else

{   for(q=p->link;q!=p;q=q->link)

  printf("第%d个元素是 %d\n",i++,q->info);

     printf("第%d个元素是 %d\n",i++,q->info);

}

}

//

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航