2017-06-01 118 views
-3

我寫了下面這段代碼:(上面的結構和下面的函數) 我試着用這個函數註冊一個學生並刪除他。卡住了鏈表

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

回答

0

這兩個功能的主要問題是在最後,你有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