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

发表于:2007-07-01来源:作者:点击数: 标签:
//用循环单链表实现队列的基本操作 //算法的实现: #include #include #include typedef int DateType; struct Node; typedef struct Node *PNode; struct Node//结点结构 { DateType info; PNode link; }; //函数声明 int isEmptyQueue_link(PNode void enQ


//用循环单链表实现队列的基本操作
//算法的实现:
#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);
 }
}
//


原文转自:http://www.ltesting.net