链式队列 字符型

/*武汉大学,物理科学与技术学院,材料物理,盛华平*/

 

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef char ElemType;

typedef struct queueNode/*链式队列结点的类型定义*/
{
 ElemType data;  /*数据域*/
 struct queueNode *next;  /*指针域*/
}QueueNode;

typedef struct      //链式队列的类型定义
{
 QueueNode  *front;    //队头指针
 QueueNode  *rear;     //队尾指针
}LinkQueue;

//链式队列的初始化
void QueueInitial(LinkQueue  *pQ)
{//指针pQ所指向的链式队列初始化为有表头结点链表
 pQ->front=(QueueNode *)malloc(sizeof(QueueNode));
 if(pQ->front==NULL)
 {
  printf("内存分配失败!/n");
  exit(1);
 }
 pQ->rear=pQ->front;
 pQ->front->next=NULL;    //头结点指针域置空
}

//链式队列判空
int IsEmpty(LinkQueue  *pQ)
{//链队为空时返回1,否则返回0
 return pQ->front==pQ->rear;
}

//元素进队
void EnQueue(LinkQueue *pQ,ElemType e)
{//将元素e插入到队尾
 QueueNode  *p;
 p=(QueueNode *)malloc(sizeof(QueueNode));
 if(p==NULL)    //内存分配失败
 {
  printf("内存分配失败!/n");
  exit(1);
 }
 p->data=e;
 p->next=NULL;   //设置为尾结点
 pQ->rear->next=p;   //尾部插入
 pQ->rear=p;   //尾指针后移
}

//元素出队
ElemType DeQueue(LinkQueue *pQ)
{//若队列元素不为空,则删除队头元素,并返回它的值
 QueueNode  *first;
 ElemType temp;
 if(IsEmpty(pQ))       //队列为空,退出
 {
  printf("空对!/n");
  exit(1);
 }
 first=pQ->front->next;  //first指向队列头结点
 temp=first->data;      //暂存队头元素值
 pQ->front->next=first->next;    // 摘下队头结点
 if(pQ->rear==first)        //只有一个结点时,修改尾指针
  pQ->rear=pQ->front;
 free(first);
 return temp;
}

//取队头元素值
ElemType GetFront(LinkQueue  *pQ)
{//若队列不为空,则返回队头元素的值
 QueueNode *first;
 if(IsEmpty(pQ))
 {
  printf("空对!/n");
  exit(1);
 }
 first=pQ->front->next;//first指向队头元素
 return first->data;//返回队头元素值
}

//队列置空
void MakeEmpty(LinkQueue *pQ)
{//清楚队列中所有元素,仅保留头结点
 QueueNode *p,*q;//p为当前结点指针
 p=pQ->front->next;//p指向第一个元素结点
 while(p!=NULL)  //当没有到达队尾时
 {
  q=p;
  p=p->next;  //当前节点指针后移
  free(q);
 }
 pQ->front->next=NULL;  //头结点指针域置空
 pQ->rear=pQ->front;  //队头与队尾指针指向头结点
}

//销毁队列
void Destroy(LinkQueue *pQ)
{//销毁链队所有结点的存储空间
 QueueNode *p,*q;//p为当前结点指针
 p=pQ->front;//p指向表头结点
 while(p!=NULL)
 {
  q=p;
  p=p->next;//当前结点指针后移
  free(q);
 }
 pQ->rear=pQ->front=NULL;//对头与队尾指针置空
}

void main()
{
 int m,n,i,j;char e,f;
 printf("链式队列的实现/n/n");
    LinkQueue Q;
    LinkQueue *pQ=&Q;
 pQ->front=pQ->rear=NULL;
   
 for(;;)
 {
  printf("/n/n");
  printf("请选择您要执行的操作1~9:/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");
         
  scanf("%d",&m);
                while(m<1||m>9)
  {
   printf("输入有误,请输入1~9之间的数字!/n");
   scanf("%d",&m);
  }
  switch(m)
  {
  case 1:  QueueInitial(pQ);
        printf("初始化成功! ");break;
  case 2:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n"); break; }
        if(IsEmpty(pQ))
      printf("队列为空!");
        else
      printf("队列非空!");
     break;
  case 3:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n");break; }
        printf("请输入要进队的元素个数:");
     scanf("%d",&i);
        for(j=0;j<i;j++)
     {
      printf("请输入第%d个元素:/n",j+1);
      //f=getchar();
      e=getchar();
      while(e>'z'||e<'a')
       e=getchar();
      //scanf("%c",&e);
      EnQueue(pQ,e);
     }
     break;
  case 4:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n"); break; }
        printf("出队元素为:%c",DeQueue(pQ));
        break;
  case 5:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n");
      break; }
        printf("出队序列为:/n");
        while(pQ->rear!=pQ->front)
      printf("%c/t",DeQueue(pQ));
     break;
  case 6:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n");
        break; }
        printf("队头元素为:%c",GetFront(pQ));
        break;
  case 7:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n");break; }
        MakeEmpty(pQ);
     break;
  case 8:  if(pQ->front==NULL)
     {  printf("请先初始化队列!/n"); break; }
        Destroy(pQ);
        break;
  case 9: return;
  }
 }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值