这学期学数据结构,写链队列算法,遍历函数的时候有个问题,哪位解答下~
#include<stdio.h>#include<stdlib.h>
#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);
break;
case 2: AddQueue(Lq); ShowQueue(Lq);
break;
case 3: flag=OutQueue(Lq,x); if(flag==0)
{
printf("队头元素出队失败!\n");
printf("队列为: ");
ShowQueue(Lq);
break;
}else
{
printf("队头元素出队成功!\n");
printf("队列为: ");
ShowQueue(Lq);
break;
}
case 0: exit(0);
}
}
} 展开
同学你好:我看了你的程序:出现你截图中的原因是,在你每次将数值入队后就跳出了程序:
这是我帮你修改了 的程序,希望你能采纳:
实验结果:
#include<stdio.h>#include<stdlib.h>
#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);
}
}
}
2023-08-15 广告
void ShowQueue(LinkQueue Q)
{
QueuePtr p;
QElemType e;
p=Q.front->next;
while(p)
{
e=p->data;
printf("%d",e);
//printf("%d",p->data);
printf(" "迹拍槐);
p=p->next;
}
printf("\姿友n"贺神);
}
2012-11-09