int Input(LinkList &L){ system("cls"); int x; int flag = 1; //尾插法 LNode *p; LNode *r=L;//存储链表当前的尾结点 LNode *head=(LNode *)malloc(sizeof(LNode)); p -> next=NULL; //建立表头结点head while(flag){ printf("请选择操作:\n0、退出 1、录入\n"); scanf("%d",&x); if(x=1){ p=(LNode *)malloc(sizeof(LNode)); printf("请输入要录入的学生信息:\n"); printf("姓名:"); scanf("%s", &p->data.name); printf("学号:"); scanf("%d", &p->data.num); printf("分数:"); scanf("%d", &p->data.score); getchar(); p->next=NULL; r->next=p; //将新建节点p插入链表当前尾结点r后 r=p; }else if(x=0) flag = 0; } return head; system("pause"); }
时间: 2024-03-27 13:38:11 浏览: 50
create_linklist_head.rar_Create_LinkList c++_head_头插法
这段代码中有几个问题:
1. 函数声明中的参数类型与实际使用的类型不匹配。函数声明中使用的是 LinkList &L,但实际上函数中使用的是 LNode *&L。建议将函数声明中的参数类型改为 LNode *&L。
2. 函数返回类型与实际返回值不匹配。函数声明中使用的是 int,但实际上函数中返回的是 head,一个指向 LNode 类型的指针。建议将函数返回类型改为 LNode*。
3. if 判断语句中使用了赋值操作符。if 判断语句应该使用相等比较运算符 ==,而不是赋值操作符 =。因此,if(x=1) 应该改为 if(x==1),同理,if(x=0) 应该改为 if(x==0)。
4. 在代码中使用了未初始化的指针 p。在第 8 行中声明了指针 p,但并没有对其进行初始化。在第 13 行中使用了 p->next,这会导致运行时错误。因此,需要在第 10 行中给指针 p 进行初始化,例如 p = (LNode *)malloc(sizeof(LNode))。
5. 在第 11 行中,将 p->next 设置为了 NULL,但是在第 25 行中,将 r->next 设置为了 p,这会导致链表中出现一个不合法的结点。因此,应该将第 11 行和第 12 行的代码交换位置,将 p->next 设置为 NULL 放在 r->next = p 的后面。
6. 在第 23 行和第 26 行之间有一条无用的 return 语句,代码执行到这里会直接返回,而不会执行后面的语句。
综上所述,修改后的代码如下所示:
```c++
LNode* Input(LNode *&L) {
system("cls");
int x;
int flag = 1;
//尾插法
LNode *p;
LNode *r = L; //存储链表当前的尾结点
LNode *head = (LNode *)malloc(sizeof(LNode));
head->next = NULL; //建立表头结点head
while (flag) {
printf("请选择操作:\n0、退出 1、录入\n");
scanf("%d", &x);
if (x == 1) {
p = (LNode *)malloc(sizeof(LNode));
printf("请输入要录入的学生信息:\n");
printf("姓名:");
scanf("%s", &p->data.name);
printf("学号:");
scanf("%d", &p->data.num);
printf("分数:");
scanf("%d", &p->data.score);
getchar();
p->next = NULL;
r->next = p; //将新建节点p插入链表当前尾结点r后
r = p;
}
else if (x == 0)
flag = 0;
}
return head;
}
```
阅读全文