这学期学数据结构,写链队列算法,遍历函数的时候有个问题,哪位解答下~

2025-01-01 13:42:11
推荐回答(1个)
回答1:

同学你好:我看了你的程序:出现你截图中的原因是,在你每次将数值入队后就跳出了程序:

这是我帮你修改了 的程序,希望你能采纳:

实验结果:

 

#include#include

#define OK 1

#define ERROR 0

#define OVERFLOW -2

 

typedef int Status;

typedef int QElemType;

 

typedef struct QNode

{

 QElemType data;

 QNode *next;

}*QueuePtr;

 

struct LinkQueue

{

 QueuePtr front;

 QueuePtr rear;

};

 

//新建一个空队列

void InitQueue(LinkQueue &Q)

{

 Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

 if(!Q.front)

  exit(OVERFLOW);

 Q.front->next=NULL;

}

 

//插入元素(因为是队列,只能在对尾插入)到队列----入队

void AddQueue(LinkQueue &Q)

{

 QueuePtr p;

 int x;

 printf("请输入元素的值(输入0结束):\n");

 scanf("%d",&x);

 while(x)

 {

  p=(QueuePtr)malloc(sizeof(QNode));

  if(!p)

   exit(OVERFLOW);

  p->data=x;

  p->next=NULL;

  Q.rear->next=p;//原来的队尾结点指向新结点

  Q.rear=p;

  scanf("%d",&x);

 }

}

 

//遍历链队列

void ShowQueue(LinkQueue Q)

{

 QueuePtr p;

// QElemType e;

 p=Q.front->next;

// e=p->data;

 while(p)

 {

//  printf("%d",e);

  printf("%d",p->data);

  printf("   ");

        p=p->next;

 }

 printf("\n");

}

 

//链队列对头元素出队

Status OutQueue(LinkQueue &Q,QElemType &e)

{

 QueuePtr p;

 if(Q.front==Q.rear)

  return ERROR;

 p=Q.front->next;

 e=p->data;

 Q.front->next=p->next;

 if(Q.rear==p)

  Q.rear=Q.front;

 free(p);

 return OK;

}

void main()

{

 LinkQueue Lq;

 QElemType x;

 int menu,flag;

 

 while(true)

 {

  printf("1 建立链队列(元素为整数)\n");

  printf("2 输入元素--入队\n");

  printf("3 对都元素--出队\n");

  printf("0 退出\n");

  printf("\n请输入所选菜单(0-3):");

  scanf("%d",&menu);

  switch(menu)

  {

   case 1: InitQueue(Lq);

     AddQueue(Lq);

     ShowQueue(Lq);

 

   case 2: AddQueue(Lq);

     ShowQueue(Lq);

 

   case 3: flag=OutQueue(Lq,x);

     if(flag==0)

     {

      printf("队头元素出队失败!\n");

      printf("队列为: ");

      ShowQueue(Lq);

     }else

     {

      printf("队头元素出队成功!\n");

      printf("队列为: ");

      ShowQueue(Lq);

     }

 

   case 0: exit(0);

 

  }

 }

}