请你说出void add(Student* head) { Student* p = head; while (p->next != NULL) { p = p->next; } Student* newStudent = new Student; cout << "请输入学生信息:\n"; cout << "学号:"; cin >> newStudent->id; cout << "姓名:"; cin >> newStudent->name; cout << "年龄:"; cin >> newStudent->age; cout << "性别:"; cin >> newStudent->gender; cout << "成绩:"; cin >> newStudent->score; newStudent->next = NULL; p->next = newStudent; cout << "学生信息添加成功!\n"; }的运行逻辑
时间: 2024-04-05 18:33:30 浏览: 123
这是一个 C++ 中用链表实现添加学生信息的函数。函数的输入参数是一个指向链表头节点的指针 head,函数的作用是在链表的尾部添加一个新的学生信息。
函数首先定义了两个指针,p 和 newStudent,其中 p 被初始化为 head,newStudent 是一个新的学生信息节点。然后,使用 while 循环将指针 p 移动到链表的最后一个节点。
接下来,函数通过输入操作从控制台获取学生信息,包括学号、姓名、年龄、性别和成绩。然后,将这些信息存储在新的学生信息节点 newStudent 中,并将其 next 指针设置为 NULL。
最后,函数将新的学生信息节点 newStudent 添加到链表的尾部,即将链表中最后一个节点的 next 指针指向 newStudent。函数输出一条添加成功的提示信息。
总之,这个函数的逻辑是:遍历链表找到最后一个节点,创建一个新的学生信息节点,从控制台获取学生信息,将新的学生信息节点添加到链表的尾部。
相关问题
优化以下代码,要求:班级成绩管理系统 (1)利用结构体和简单的链表,实现一个班学生成绩的管理,至少可以输入20个学生的成绩。 (2)成绩管理功能包括:输入、输出,利用new和delete运算符添加和删除班级成绩 (1)利用结构体和简单的链表(关于链表的知识,自己查阅资料学习),实现一个班学生成绩的管理。#include<stdio.h> #include<iostream> #include<windows.h> using namespace std; typedef struct student { char name[20]; int score; student* next; }stu; stu* head; void input() { stu* p1, * p2; p1 = (stu*)new stu; head = p1; while (p1 != NULL) { cout << "输入姓名" << endl; cin >> p1->name; cout << "输入成绩" << endl; cin >> p1->score; cout << "是否继续输入?(1.是 2.否)"; int a; cin >> a; if (a == 1) { p2 = p1; p1 = (stu*)new stu; p2->next = p1; continue; } else if (a == 2) { p1->next = NULL; break; } } } void listprint() { stu* p1 = head; while (p1 != NULL) { cout << 1; cout << "姓名: " << p1->name << " 成绩:" << p1->score << endl; p1 = p1->next; } } void shanchu() { char c[20]; cout << "请输入删除的学生姓名" << endl; cin >> c; stu* p1 = head, * p2; while (p1 != NULL) { p2 = p1->next; if (strcmp(p2->name, c) == 0) { p1->next = p2->next; break; }p1 = p1->next; } } int main() { int a = 0; while (1) { cout << "1.输入成绩 2.输出成绩 3.删除" << endl;cin >> a; switch (a) { case 1: { input(); system ("cls"); continue; } case 2: { listprint(); continue; } case 3: { shanchu(); continue; } default: { break; } } break; } }
以下是优化后的代码:
#include <iostream>
#include <string>
using namespace std;
struct Student {
string name;
int score;
Student* next;
};
void addStudent(Student*& head, string name, int score) {
Student* newStudent = new Student;
newStudent->name = name;
newStudent->score = score;
newStudent->next = head;
head = newStudent;
}
void deleteStudent(Student*& head, string name) {
if (head == NULL) {
return;
}
if (head->name == name) {
Student* temp = head;
head = head->next;
delete temp;
return;
}
Student* current = head;
while (current->next != NULL && current->next->name != name) {
current = current->next;
}
if (current->next == NULL) {
return;
}
Student* temp = current->next;
current->next = current->next->next;
delete temp;
}
void printStudents(Student* head) {
while (head != NULL) {
cout << head->name << " " << head->score << endl;
head = head->next;
}
}
int main() {
Student* head = NULL;
int choice;
string name;
int score;
while (true) {
cout << "1. Add student" << endl;
cout << "2. Delete student" << endl;
cout << "3. Print students" << endl;
cout << "4. Exit" << endl;
cout << "Enter your choice: ";
cin >> choice;
switch (choice) {
case 1:
cout << "Enter student name: ";
cin >> name;
cout << "Enter student score: ";
cin >> score;
addStudent(head, name, score);
break;
case 2:
cout << "Enter student name: ";
cin >> name;
deleteStudent(head, name);
break;
case 3:
printStudents(head);
break;
case 4:
return 0;
default:
cout << "Invalid choice" << endl;
}
}
return 0;
}
优化后的代码使用了指针和动态内存分配,可以更好地管理学生信息。同时,使用了switch语句来实现菜单功能,代码更加简洁易懂。
void add_student(stu *head)//添加新的学生信息 注册 { int a,b; printf("请输入要添加学生信息的个数:"); scanf("%d",&a); for(b=1;a>0;a--,b++) { stu *p1; p1=(stu*) malloc(sizeof(stu)); printf("请输入第%d个学号:\n",b);scanf("%d",&p1->id); stu *p=head->next; while(p!=NULL) { if(p->id==p1->id) { printf("学号重复!请重新输入!\n"); scanf("%d",&p1->id); p=head; } p=p->next; } printf("请输入第%d个名字:\n",b);scanf("%s",p1->name); printf("请输入第%d个性别:\n",b);scanf("%s",p1->gender); printf("请输入第%d个年龄:\n",b);scanf("%d",&p1->age); if(p1->age<0&&p1->age>120) { printf("年龄输入错误!请重新输入!\n"); printf("请输入第%d个年龄:\n",b);scanf("%d",&p1->age); } printf("请输入第%d个贯籍:\n",b);scanf("%s",p1->native_place); printf("请输入第%d个系别:\n",b);scanf("%s",p1->department); printf("请输入第%d个专业:\n",b);scanf("%s",p1->specialty); printf("请输入第%d个班级:\n",b);scanf("%d",&p1->cla); printf("请输入第%d个籍贯变化:\n",b);scanf("%s",p1->xjbh); p1->next=head->next; head->next=p1; system("cls"); printf("新的学生信息注册完成!\n\n"); } }这段代码哪里错了
这段代码可能有以下问题:
1. 在循环中,每次创建一个新的学生节点,但是没有将其添加到链表中。你需要在循环结束之前将新的节点添加到链表中。
2. 在判断年龄是否输入错误时,判断条件写反了,应该是 if(p1->age<0||p1->age>120)。
3. 在学号重复判断的while循环中,如果学号重复,应该结束当前循环,而不是将p指针重新指向head。可以使用break语句来实现。
下面是修改后的代码:
```c
void add_student(stu *head) {
int count;
printf("请输入要添加学生信息的个数:");
scanf("%d", &count);
for (int i = 0; i < count; i++) {
stu *p1 = (stu *)malloc(sizeof(stu));
printf("请输入第%d个学号:", i+1);
scanf("%d", &p1->id);
stu *p = head->next;
while (p != NULL) {
if (p->id == p1->id) {
printf("学号重复!请重新输入!\n");
scanf("%d", &p1->id);
p = head;
break;
}
p = p->next;
}
printf("请输入第%d个名字:", i+1);
scanf("%s", p1->name);
printf("请输入第%d个性别:", i+1);
scanf("%s", p1->gender);
printf("请输入第%d个年龄:", i+1);
scanf("%d", &p1->age);
if (p1->age < 0 || p1->age > 120) {
printf("年龄输入错误!请重新输入!\n");
scanf("%d", &p1->age);
}
printf("请输入第%d个贯籍:", i+1);
scanf("%s", p1->native_place);
printf("请输入第%d个系别:", i+1);
scanf("%s", p1->department);
printf("请输入第%d个专业:", i+1);
scanf("%s", p1->specialty);
printf("请输入第%d个班级:", i+1);
scanf("%d", &p1->cla);
printf("请输入第%d个籍贯变化:", i+1);
scanf("%s", p1->xjbh);
p1->next = head->next;
head->next = p1;
system("cls");
printf("新的学生信息注册完成!\n\n");
}
}
```
阅读全文