卡住了链表
我写了下面这段代码:(上面的结构和下面的函数) 我试着用这个函数注册一个学生并删除他。卡住了链表
void reg_student(slist *students, clist *courses, int id, int number){
slist *temp;
clist*temp1;
student *reg;
course *addit;
for (temp = students; temp->info->id!=id; temp = temp->next);
reg = temp->info;// the student we want to register.
for (temp1 = courses; temp1->info->number != number; temp1 = temp1->next);
addit = temp1->info;//the course to add.
//adding the course to the student courses list.
reg->courses = add_course(reg->courses, addit->title, addit->number);
//adding the student to the course students list.
addit->students = add_student(addit->students, reg->name, reg->id);
void unreg_student(slist *students, int id, int number){
slist *temp;
clist *temp1;
student *studenttoremove;
course *coursetoremove;
for (temp = students; temp->info->id != id; temp = temp->next);
studenttoremove = temp->info;// the student we want to delete.
for (temp1 = studenttoremove->courses; temp1->info-> number != number; temp1 = temp1->next);
coursetoremove = temp1->info;//the course we want to delete.
studenttoremove->courses = remove_course(studenttoremove->courses, coursetoremove);
temp1->info->students = remove_student(temp1->info->students, studenttoremove);
}
slist* remove_student(slist*students, student* s1){
slist* temp=students,*temp1;
if (temp->info == s1){
if (!(temp->next)){
free(temp);
return NULL;
}
temp1 = temp->next;
free(temp);
return temp1;
}
for (temp = students; temp->next->info != s1; temp = temp->next);
temp1 = temp->next;
temp = temp1->next;
free(temp1);
return students;
}
clist* remove_course(clist*courses, course * c1){
clist* temp=courses, *temp1;
if (temp->info == c1){
if (!(temp->next)){
free(temp);
return NULL;
}
temp1 = temp->next;
free(temp);
return temp1;
}
for (temp = courses; temp->next->info != c1; temp = temp->next);
temp1 = temp->next;
temp = temp1->next;
free(temp1);
return courses;
}
`的结构是:
typedef struct course {
char *title;
int number;
struct slist *students;
} course;
typedef struct slist {
student *info;
struct slist *next;
} slist;
typedef struct clist {
course *info;
struct clist *next;
} clist;
这些功能应该添加和删除学生和课程。 该寄存器工作正常。但是当我试图删除学生时,课程将从学生课程列表中删除,但学生不会从课程列表中删除。当我调试它时,我看到删除函数获得一个NULL作为学生名单..我不明白为什么。 谢谢。
这两个功能的主要问题是在最后,你有temp = temp1->next
。它应该是temp->next = temp1->next
。
slist* remove_student(slist*students, student* s1){
slist* temp=students,*temp1;
if (temp->info == s1){
if (!(temp->next)){
free(temp);
return NULL;
}
temp1 = temp->next;
free(temp);
return temp1;
}
for (temp = students; temp->next->info != s1; temp = temp->next);
if (!temp->next)
return students;
temp1 = temp->next;
temp->next = temp1->next;
free(temp1);
return students;
}
clist* remove_course(clist*courses, course * c1){
clist* temp=courses, *temp1;
if (temp->info == c1){
if (!(temp->next)){
free(temp);
return NULL;
}
temp1 = temp->next;
free(temp);
return temp1;
}
for (temp = courses; temp->next->info != c1; temp = temp->next);
if (!temp->next)
return courses;
temp1 = temp->next;
temp->next = temp1->next;
free(temp1);
return courses;
}
编辑:对不起,我完全错过了。另一个问题在unreg_student()
本身。原因是当调用remove_student()
时,您通过temp1->info->student
作为第一个参数,而由temp1
指向的内存块已被先前称为remove_course()
释放。这意味着你正在玩内存访问冲突。存储在temp1
中的内容可能不再是您所期望的,甚至可能无法访问。但是你可以很容易地解决这个问题。只需更换的unreg_student()
到coursetoremove->students = remove_student(coursetoremove->students, studenttoremove);
最后一行:
void unreg_student(slist *students, int id, int number){
slist *temp;
clist *temp1;
student *studenttoremove;
course *coursetoremove;
for (temp = students; temp->info->id != id; temp = temp->next);
studenttoremove = temp->info;// the student we want to delete.
for (temp1 = studenttoremove->courses; temp1->info->number != number; temp1 = temp1->next);
coursetoremove = temp1->info;//the course we want to delete.
studenttoremove->courses = remove_course(studenttoremove->courses, coursetoremove);
coursetoremove->students = remove_student(coursetoremove->students, studenttoremove);
}
嗨@Viacheslav,感谢您的帮助,我仍然无法弄清楚为什么在unreg函数中remove_student函数在课程中获得NULL,尽管学生在课程学生列表中。 – Eden
@Eden,我找到了问题并更新了答案。一探究竟。 – Viacheslav
你为什么标签C#时,这是C或C++? –
几个小时前你问了这个确切的问题,你已经明确指示使用适当的语言标签。为什么你没有按照建议改进质量就重复了这个问题? – PoweredByOrange
它是C++ - 它绝对不是c# – Cadburry