数据结构-链队列代码实现

来源:互联网 发布:宠物店软件 编辑:程序博客网 时间:2024/06/05 09:13
#include<stdio.h>
#include<stdlib.h>
typedef struct Queue{ //队列节点
 int data;
 struct Queue * pNext;
}Queue,*pQueue;
typedef struct{ //头指针和尾指针
 pQueue front;
 pQueue rear;
}LinkedQueue;
int flag=0;//用来记录是否初始化
void show();
int InitQueue(LinkedQueue &Q);
int CreatQueue(LinkedQueue &Q);
int ShowQueue(LinkedQueue Q);
int DestroyQueue(LinkedQueue &Q);
int ClearQueue(LinkedQueue &Q);
int IsEmpy(LinkedQueue Q);
int QueueLength(LinkedQueue Q);
int GetHead(LinkedQueue Q);
int EnQueue(LinkedQueue &Q);
int DeQueue(LinkedQueue &Q);
int main()
{

 int i,num;
 LinkedQueue Q;
 show();
 printf("请选择:\n");
 do
 {
  
  scanf("%d",&i);
  switch(i)
  {
   case 1:{
    InitQueue(Q);
    printf("初始化成功!");
    break;
   }
   case 2:{
    if(flag)
    {
     DestroyQueue(Q);
    }
    else
    printf("请先初始化!\n");
    break;
   }
   case 3:{
    if(flag)
    {
     ClearQueue(Q);
    }
    else
    printf("请先初始化!\n");
    break;
   }
   case 4:{
    if(flag)
    {
     IsEmpy(Q);
    }
    else
    printf("请先初始化!\n");
    break;
   }
   case 5:{
    if(flag)
    {
     QueueLength(Q);
    }
    else
    printf("请先初始化!\n");
    break;
   }
   case 6:{
    if(flag)
    {
     GetHead(Q);
    }
    else
    printf("请先初始化!\n");
    break;
   }
   case 7:{
    if(flag)
    {
     EnQueue(Q);
    }
    else
    printf("请先初始化!\n");
    break;
   }
   case 8:{
    if(flag)
    {
     DeQueue(Q);
    }
    else
    printf("请先初始化!\n");
    break;
   }
   case 9:{
    num=InitQueue(Q);
    if(num==1)
    CreatQueue(Q);
    break;
   }
   case 10:{
    if(flag)
    {
     ShowQueue(Q);
    }
    else
    printf("请先初始化!\n");
    break;
   }
   case 11:{
    exit(0);
    break;
   }
   default:
    printf("输入不合法:\n");
    break;
  }
  printf("请继续:\n");
 } while(1);
 return 0;
}

void show()
{
 printf("***************************************************************\n");
 printf("******                1.初始化队列                        ******\n");
 printf("******                2.销毁队列                          ******\n");
 printf("******                3.清空队列                          ******\n");
 printf("******                4.判断队列是否为空                  ******\n");
 printf("******                5.返回队列中元素个数                ******\n");
 printf("******                6.返回队列队头元素                  ******\n");
 printf("******                7.插入新的队尾元素                  ******\n");
 printf("******                8.删除队头元素                      ******\n");
 printf("******                9.初始化并创建队列                  ******\n");
 printf("******                10.输出队列元素                     ******\n");
 printf("******                11.退出                             ******\n");
 printf("***************************************************************\n");
}

int InitQueue(LinkedQueue &Q)
{
 Q.front=Q.rear=(pQueue)malloc(sizeof(Queue));
 if(!Q.front)//相当于if(Q.front == NULL)
 {
  printf("初始化失败!\n");
  return 0;
 }
 Q.front->pNext=NULL;//说明该队列为空,头指针指向第一个有效元素的下一个元素
 flag=1;//设置为1说明初始化成功
 return 1;
 }

int QueueLength(LinkedQueue Q)
{
 int i=0;
 while(Q.front->pNext)//相当于while(Q.front->pNext != NULL)
 {
  i++;
  Q.front=Q.front->pNext;
 }
 printf("队列的长度是:%d\n",i);
 return 1;
}

int DeQueue(LinkedQueue &Q)
{
 if(!Q.front->pNext)
 {
  printf("队列为空!\n");
  return 0;
 }
 pQueue p;
 p=Q.front->pNext;//每次删除一个元素时记得把该元素先保存,方便以后释放空间,就像交换两个变量一样,先把其中一个变量保存
 Q.front->pNext=p->pNext;//前指针后移
 printf("删除成功!\n");
 free(p);
 return 1;
}
int EnQueue(LinkedQueue &Q)
{
 pQueue p;
 p=(pQueue)malloc(sizeof(Queue));//分配一个链表节点的内存空间
 if(!p)
 {
  printf("插入失败!\n");
  return 0;
 }
 printf("请输入一个整数:");
 scanf("%d",&p->data);
 p->pNext=NULL;
 Q.rear->pNext=p;//将尾指针链接到新节点上 ,因为尾指针指向最后一个有效元素
 Q.rear=p;//移动尾指针    这两个步骤就像登山一样,先把挂钩挂上,再移动身体
 return 1;
}
int GetHead(LinkedQueue Q)
{
 if(Q.front->pNext==NULL)
 {
  printf("队列为空!\n");
  return 0;
 }
 Q.front=Q.front->pNext;//因为头指针指向第一个有效元素的下一个元素
 printf("队头为:%d\n",Q.front->data);
 return 1;
}

int IsEmpy(LinkedQueue Q)
{
 if(Q.front->pNext==NULL){//对列为空的判断标志是没有第一个有效元素
  printf("队列为空!\n");
 }
 else {
  printf("队列非空!\n");
 }
 return 1;
}
int ClearQueue(LinkedQueue &Q)
{
 Q.front->pNext=Q.rear->pNext=NULL;
 return 1;
}
int DestroyQueue(LinkedQueue &Q)
{
 pQueue p,q;
 p=Q.front->pNext;
 while(p)
 {
  q=p;//用p保存第一个有效元素
  p=p->pNext;//移动指针
  free(q);//释放q
 }
 Q.front=Q.rear=NULL;//先释放链表节点内存,再将两个指针变量设置尾空
 free(Q.front);
 free(Q.rear);
 printf("队列已销毁!\n");
 flag=0;
 return 1;
}
int ShowQueue(LinkedQueue Q)
{
 if(Q.front->pNext==NULL){
  printf("队列为空!");
  return 0;
 }
 pQueue p;
 p=Q.front->pNext;//将p指向第一个有效元素
 printf("队列元素是:\n");
 while(p)//相当于while(p!=NULL)
 {
  printf("%d\t",p->data);
  p=p->pNext;
 }
 printf("\n");
 return 1;
}
int CreatQueue(LinkedQueue &Q)
{
 int n,i;
 printf("请输入队列长度:\n");
 scanf("%d",&n);
 pQueue p;
 for(i=0;i<n;i++)
 {
  p=(pQueue)malloc(sizeof(Queue));//循环一次分配一个节点内存空间
  if(!p)
  {
   printf("创建失败!\n");
   flag=0;
   return 0;
  }
  printf("请输入第%d个元素:",i+1);
  scanf("%d",&(p->data));
  p->pNext=NULL;
  Q.rear->pNext=p;
  Q.rear=p;
 }
 return 1;
}
 


原创粉丝点击