求改错,题目如下
试设计一个算法,建立一个学生成绩栈或队列。要求从键盘上输入 N 个整数,按照下列要求分别进入不同栈或队列,并分别输出每个栈或队列的内容。
(1) 若输入的整数 x 小于 60 ,则进入第一个栈或队列;
(2) 若输入的整数 x 大于等于 60 ,小于 100 ,则进入第二个栈或队列;
(3) 若输入的整数 x 大于等于 100 ,则进入第三个栈或队列;
我的程序
#include
#include
# define OK 1
# define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q){
//构造新的队列
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front) exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
Status EnQueue(LinkQueue &Q,QElemType e){
//插入元素e为Q的新的队尾元素
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->next=NULL;
p->data=e;
Q.rear->next=p;
Q.rear=p;
return OK;
}
Status DeQueue(LinkQueue &Q,QElemType &e){
//若队不空,删除Q的队头元素,并用e返回其值
QueuePtr p;
if(Q.front==Q.rear) return ERROR;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return OK;
}
int main(){
int n,a,i;
char c;
int m1,m2,m3;
LinkQueue Q1, Q2,Q3;
InitQueue(&Q1);
InitQueue(&Q2);
InitQueue(&Q3);
scanf("%d",&n);
for(i=0;iwhile(scanf("%d%c",&a,&c)==2&&c!='\n'){
if(a<60) EnQueue(&Q1,a);
if(a>=60&&a<100) EnQueue(&Q2,a);
if(a==100) EnQueue(&Q3,a);
}
}
DeQueue(&Q1,&m1);
DeQueue(&Q2,&m2);
DeQueue(&Q3,&m3);
printf("60>x:");
printf("%d ",m1);
printf("\n");
printf("60<=x<100");
printf("%d ",m2);
printf("\n");
printf("x>=100");
printf("%d ",m3);
printf("\n");
return 0;
}
参考GPT和自己的思路:
首先需要注意的是,在函数调用时需要传递指针类型的参数,而不是具体的结构体变量。因此,在第16行和第51行需要将变量名改为地址符号加上结构体类型,即改为“&Q1”、“&Q2”、“&Q3”。
其次,在第38行-44行,实际上并不需要重新分配内存,而是直接使用已经存在的队列指针来进行删除操作。因此可以将第38-39行改为“p=Q.front->next;”、“if(Q.rear==p) Q.rear=Q.front->next;”,并将第44行删除。
最后,在输出每个队列的内容时,需要对队列中的所有元素进行输出,因此需要在DeQueue函数的调用处使用循环语句对所有元素进行取出和输出。具体修改如下:
1. #include<stdio.h>
2. #include<stdlib.h>
3. # define OK 1
4. # define ERROR 0
5. #define OVERFLOW -2
6. typedef int Status;
7. typedef int QElemType;
8. typedef struct QNode{
9. QElemType data;
10. struct QNode \*next;
11. }QNode,\*QueuePtr;
12. typedef struct{
13. QueuePtr front;
14. QueuePtr rear;
15. }LinkQueue;
16. Status InitQueue(LinkQueue *Q){
17. //构造新的队列
18. Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
19. if(!Q->front) exit(OVERFLOW);
20. Q->front->next=NULL;
21. return OK;
22. }
23. Status EnQueue(LinkQueue *Q,QElemType e){
24. //插入元素e为Q的新的队尾元素
25. QueuePtr p;
26. p=(QueuePtr)malloc(sizeof(QNode));
27. if(!p) exit(OVERFLOW);
28. p->next=NULL;
29. p->data=e;
30. Q->rear->next=p;
31. Q->rear=p;
32. return OK;
33. }
34. Status DeQueue(LinkQueue *Q,QElemType *e){
35. //若队不空,删除Q的队头元素,并用e返回其值
36. QueuePtr p;
37. if(Q->front==Q->rear) return ERROR;
38. p=Q->front->next;
39. *e=p->data;
40. Q->front->next=p->next;
41. if(Q->rear==p) Q->rear=Q->front;
42. free(p);
43. return OK;
44. }
45. int main(){
46. int n,a,i;
47. char c;
48. int m1=0,m2=0,m3=0; //需要初始化
49. LinkQueue Q1, Q2,Q3;
50. InitQueue(&Q1);
51. InitQueue(&Q2);
52. InitQueue(&Q3);
53. scanf("%d",&n);
54. for(i=0;i<n;i++){
55. while(scanf("%d%c",&a,&c)==2&&c!='\n'){
56. if(a<60) EnQueue(&Q1,a);
57. if(a>=60&&a<100) EnQueue(&Q2,a);
58. if(a>=100) EnQueue(&Q3,a); //修改条件
59. }
60. }
61. printf("60>x:");
62. while(DeQueue(&Q1,&m1)==OK){
63. printf("%d ",m1);
64. }
65. printf("\n");
66. printf("60<=x<100:");
67. while(DeQueue(&Q2,&m2)==OK){
68. printf("%d ",m2);
69. }
70. printf("\n");
71. printf("x>=100:");
72. while(DeQueue(&Q3,&m3)==OK){
73. printf("%d ",m3);
74. }
75. printf("\n");
76. return 0;
77. }
参考GPT和自己的思路:
首先,在函数参数中,定义指针时不需要加上&,所以需要将InitQueue、EnQueue和DeQueue函数中的传参方式改为InitQueue(Q1)、EnQueue(Q1,a)、DeQueue(Q1,&m1)等形式。
另外,在输入数据的for循环中,需要在每一次循环中用InitQueue函数初始化三个队列。
最后,输出部分需要放在循环之外,因为需要输出每个队列的内容,所以需要使用while循环和DeQueue函数输出队列中的所有元素。
修改后的完整代码如下:
#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;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q){
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q.front) exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
Status EnQueue(LinkQueue &Q, QElemType e){
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
Status DeQueue(LinkQueue &Q, QElemType &e){
if(Q.front == Q.rear) return ERROR;
QueuePtr p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p) Q.rear = Q.front;
free(p);
return OK;
}
int main(){
int n, a, i;
char c;
int m1, m2, m3;
LinkQueue Q1, Q2, Q3;
scanf("%d", &n);
for(i = 0; i < n; i++){
InitQueue(Q1);
InitQueue(Q2);
InitQueue(Q3);
while(scanf("%d%c", &a, &c) == 2 && c != '\n'){
if(a < 60) EnQueue(Q1, a);
if(a >= 60 && a < 100) EnQueue(Q2, a);
if(a >= 100) EnQueue(Q3, a);
}
printf("60>x:");
while(!DeQueue(Q1, m1)){
printf(" %d", m1);
}
printf("\n");
printf("60<=x<100:");
while(!DeQueue(Q2, m2)){
printf(" %d", m2);
}
printf("\n");
printf("x>=100:");
while(!DeQueue(Q3, m3)){
printf(" %d", m3);
}
printf("\n");
}
return 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;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue *Q){
//构造新的队列
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q->front) exit(OVERFLOW);
Q->front->next=NULL;
return OK;
}
Status EnQueue(LinkQueue *Q,QElemType e){
//插入元素e为Q的新的队尾元素
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->next=NULL;
p->data=e;
Q->rear->next=p;
Q->rear=p;
return OK;
}
Status DeQueue(LinkQueue *Q,QElemType *e){
//若队不空,删除Q的队头元素,并用e返回其值
QueuePtr p;
if(Q->front==Q->rear) return ERROR;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p=Q->front->next;
*e=p->data;
Q->front->next=p->next;
if(Q->rear==p) Q->rear=Q->front;
free(p);
return OK;
}
int main(){
int n,a,i;
char c;
int m1=0,m2=0,m3=0;
LinkQueue Q1, Q2,Q3;
InitQueue(&Q1);
InitQueue(&Q2);
InitQueue(&Q3);
scanf("%d",&n);
for(i=0;i<n;i++){
while(scanf("%d%c",&a,&c)==2&&c!='\n'){
if(a<60) EnQueue(&Q1,a);
if(a>=60&&a<100) EnQueue(&Q2,a);
if(a>=100) EnQueue(&Q3,a);
}
}
DeQueue(&Q1,&m1);
DeQueue(&Q2,&m2);
DeQueue(&Q3,&m3);
printf("60>x:");
while(DeQueue(Q1, m1)==OK){
printf(" %d", m1);
}
printf("\n");
printf("60<=x<100:");
while(DeQueue(Q2, m2)==OK){
printf(" %d", m2);
}
printf("\n");
printf("x>=100:");
while(DeQueue(Q3, m3)==OK){
printf(" %d", m3);
}
printf("\n");
return 0;
}
错误
67 29 C:\Users\DELL\Desktop\学习\C描述\输出学生成绩.cpp [Error] cannot convert 'LinkQueue' to 'LinkQueue*' for argument '1' to 'Status DeQueue(LinkQueue*, QElemType*)'
72 29 C:\Users\DELL\Desktop\学习\C描述\输出学生成绩.cpp [Error] cannot convert 'LinkQueue' to 'LinkQueue*' for argument '1' to 'Status DeQueue(LinkQueue*, QElemType*)'
77 29 C:\Users\DELL\Desktop\学习\C描述\输出学生成绩.cpp [Error] cannot convert 'LinkQueue' to 'LinkQueue*' for argument '1' to 'Status DeQueue(LinkQueue*, QElemType*)'
不知道你这个问题是否已经解决, 如果还没有解决的话: