卡住了链表

问题描述:

我写了下面这段代码:(上面的结构和下面的函数) 我试着用这个函数注册一个学生并删除他。卡住了链表

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作为学生名单..我不明白为什么。 谢谢。

+1

你为什么标签C#时,这是C或C++? –

+0

几个小时前你问了这个确切的问题,你已经明确指示使用适当的语言标签。为什么你没有按照建议改进质量就重复了这个问题? – PoweredByOrange

+0

它是C++ - 它绝对不是c# – Cadburry

这两个功能的主要问题是在最后,你有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); 
} 
+0

嗨@Viacheslav,感谢您的帮助,我仍然无法弄清楚为什么在unreg函数中remove_student函数在课程中获得NULL,尽管学生在课程学生列表中。 – Eden

+0

@Eden,我找到了问题并更新了答案。一探究竟。 – Viacheslav