stu *delete_95(stu *head){ while(1) { stu *p=head->next,*pre=NULL; while(p&&p->score!=95) { pre=p; p=p->next; } if(p) { if(pre==NULL) head=p->next; else { pre->next=p->next; } } else return NULL; return head; } }这个有什么错误
时间: 2024-02-14 13:30:02 浏览: 74
这段代码存在一个逻辑错误。在最外层的 while 循环中,你使用了一个死循环,因为在循环体内部有一个 return 语句。这意味着只有当 p 指向一个节点且该节点的分数为 95 时,才会返回 head,否则会陷入无限循环。
为了修复这个问题,你可以将 return head 移动到 while 循环的外部,以便在遍历完链表后返回 head。修正后的代码如下:
```c
stu* delete_95(stu* head) {
stu* p = head;
stu* pre = NULL;
while (p && p->score != 95) {
pre = p;
p = p->next;
}
if (p) {
if (pre == NULL)
head = p->next;
else
pre->next = p->next;
free(p);
}
return head;
}
```
修正后的代码可以正确地删除分数为 95 的节点,并返回修改后的链表头指针。
相关问题
怎么删除所有分数为95的节点呢,为什么没有做到全部删除
你的代码在删除节点时只处理了第一个分数为 95 的节点,而没有在循环中继续删除后续的分数为 95 的节点。要删除所有分数为 95 的节点,你需要做一些修改。
以下是一个删除所有分数为 95 的节点的示例代码:
```c
stu* delete_95(stu* head) {
stu* p = head;
stu* pre = NULL;
while (p != NULL) {
if (p->score == 95) {
if (pre == NULL) {
head = p->next;
free(p);
p = head;
} else {
pre->next = p->next;
free(p);
p = pre->next;
}
} else {
pre = p;
p = p->next;
}
}
return head;
}
```
在这个修改后的代码中,我们使用了两个指针 `p` 和 `pre`,其中 `p` 指向当前遍历的节点,而 `pre` 指向 `p` 的前一个节点。如果 `p` 的分数为 95,则删除该节点,并将 `p` 指向下一个节点或者链表头部,然后继续遍历。如果 `p` 的分数不为 95,则更新 `pre` 和 `p` 的指针,继续遍历下一个节点。
这样修改后的代码将会删除所有分数为 95 的节点,并返回修改后的链表头指针。
实现一个简单的学生信息管理系统,该系统的功能有: 1、利用单链表建立学生基本信息表 2、浏览每个学生的信息 3、根据学号查询某个学生的基本信息 4、添加学生信息到单链表中 5、删除一个学生的信息
1. 定义学生信息结构体
typedef struct student{
int id; //学号
char name[20]; //姓名
int age; //年龄
char sex; //性别
char major[20]; //专业
struct student *next; //指向下一个节点的指针
}STUDENT;
2. 定义单链表结构体
typedef struct studentList{
int length; //链表长度
STUDENT *head; //链表头节点指针
}STUDENTLIST;
3. 初始化单链表
STUDENTLIST* initList(){
STUDENTLIST *list = (STUDENTLIST*)malloc(sizeof(STUDENTLIST));
list->length = 0;
list->head = NULL;
return list;
}
4. 添加学生信息到单链表中
void addStudent(STUDENTLIST *list, STUDENT *stu){
if(list == NULL){
return;
}
stu->next = list->head; //将新节点指向原头节点
list->head = stu; //更新链表头节点
list->length++; //链表长度加1
}
5. 删除一个学生的信息
void deleteStudent(STUDENTLIST *list, int id){
if(list == NULL || list->length == 0){
return;
}
STUDENT *p = list->head;
STUDENT *pre = NULL;
while(p != NULL){
if(p->id == id){
if(pre == NULL){ //要删除的节点是头节点
list->head = p->next; //更新头节点
}
else{
pre->next = p->next; //将前一个节点指向当前节点的下一个节点
}
free(p); //释放当前节点
list->length--; //链表长度减1
break;
}
pre = p;
p = p->next;
}
}
6. 根据学号查询某个学生的基本信息
void searchStudent(STUDENTLIST *list, int id){
if(list == NULL || list->length == 0){
return;
}
STUDENT *p = list->head;
while(p != NULL){
if(p->id == id){
printf("学号:%d,姓名:%s,年龄:%d,性别:%c,专业:%s\n", p->id, p->name, p->age, p->sex, p->major);
break;
}
p = p->next;
}
}
7. 浏览每个学生的信息
void displayList(STUDENTLIST *list){
if(list == NULL || list->length == 0){
return;
}
STUDENT *p = list->head;
while(p != NULL){
printf("学号:%d,姓名:%s,年龄:%d,性别:%c,专业:%s\n", p->id, p->name, p->age, p->sex, p->major);
p = p->next;
}
}
8. 主函数中的使用
int main(){
STUDENTLIST *list = initList();
STUDENT stu1 = {101, "张三", 20, 'M', "计算机科学与技术", NULL};
STUDENT stu2 = {102, "李四", 21, 'F', "软件工程", NULL};
addStudent(list, &stu1);
addStudent(list, &stu2);
searchStudent(list, 101);
deleteStudent(list, 102);
displayList(list);
return 0;
}
阅读全文